                          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  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!)
