aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>1999-08-24 01:06:48 +0000
committerPeter Wemm <peter@FreeBSD.org>1999-08-24 01:06:48 +0000
commit0e3d540892016a47f6a68ec9ba2879d35ce5f7c2 (patch)
treead214c5b2c8142ad6dc6d2ce3a9c83e6317d7f77
downloadsrc-0e3d540892016a47f6a68ec9ba2879d35ce5f7c2.tar.gz
src-0e3d540892016a47f6a68ec9ba2879d35ce5f7c2.zip
Import unmodified (but trimmed) ncurses 5.0 prerelease 990821.vendor/ncurses/5.0-19990821
This contains the full eti (panel, form, menu) extensions. bmake glue to follow. Obtained from: ftp://ftp.clark.net/pub/dickey/ncurses
Notes
Notes: svn path=/vendor/ncurses/dist/; revision=50276 svn path=/vendor/ncurses/5.0-19990821/; revision=50278; tag=vendor/ncurses/5.0-19990821
-rw-r--r--contrib/ncurses/ANNOUNCE351
-rw-r--r--contrib/ncurses/INSTALL481
-rw-r--r--contrib/ncurses/MANIFEST798
-rw-r--r--contrib/ncurses/Makefile.glibc400
-rw-r--r--contrib/ncurses/Makefile.in92
-rw-r--r--contrib/ncurses/Makefile.os2235
-rw-r--r--contrib/ncurses/NEWS3572
-rw-r--r--contrib/ncurses/README175
-rw-r--r--contrib/ncurses/README.emx48
-rw-r--r--contrib/ncurses/README.glibc5
-rw-r--r--contrib/ncurses/TO-DO251
-rw-r--r--contrib/ncurses/aclocal.m42140
-rw-r--r--contrib/ncurses/announce.html387
-rw-r--r--contrib/ncurses/announce.html.in387
-rw-r--r--contrib/ncurses/c++/Makefile.in185
-rw-r--r--contrib/ncurses/c++/NEWS42
-rw-r--r--contrib/ncurses/c++/PROBLEMS5
-rw-r--r--contrib/ncurses/c++/README-first58
-rw-r--r--contrib/ncurses/c++/cursesapp.cc146
-rw-r--r--contrib/ncurses/c++/cursesapp.h163
-rw-r--r--contrib/ncurses/c++/cursesf.cc423
-rw-r--r--contrib/ncurses/c++/cursesf.h823
-rw-r--r--contrib/ncurses/c++/cursesm.cc383
-rw-r--r--contrib/ncurses/c++/cursesm.h592
-rw-r--r--contrib/ncurses/c++/cursesmain.cc51
-rw-r--r--contrib/ncurses/c++/cursesp.cc123
-rw-r--r--contrib/ncurses/c++/cursesp.h186
-rw-r--r--contrib/ncurses/c++/cursespad.cc270
-rw-r--r--contrib/ncurses/c++/cursesw.cc431
-rw-r--r--contrib/ncurses/c++/cursesw.h1375
-rw-r--r--contrib/ncurses/c++/cursslk.cc121
-rw-r--r--contrib/ncurses/c++/cursslk.h205
-rw-r--r--contrib/ncurses/c++/demo.cc449
-rwxr-xr-xcontrib/ncurses/c++/edit_cfg.sh59
-rw-r--r--contrib/ncurses/c++/etip.h.in248
-rw-r--r--contrib/ncurses/c++/headers39
-rw-r--r--contrib/ncurses/c++/internal.h47
-rw-r--r--contrib/ncurses/c++/modules43
-rwxr-xr-xcontrib/ncurses/config.guess969
-rwxr-xr-xcontrib/ncurses/config.sub967
-rwxr-xr-xcontrib/ncurses/configure7085
-rw-r--r--contrib/ncurses/configure.in968
-rw-r--r--contrib/ncurses/convert_configure.pl54
-rw-r--r--contrib/ncurses/dist.mk62
-rw-r--r--contrib/ncurses/form/Makefile.in148
-rw-r--r--contrib/ncurses/form/READ.ME15
-rw-r--r--contrib/ncurses/form/fld_arg.c91
-rw-r--r--contrib/ncurses/form/fld_attr.c111
-rw-r--r--contrib/ncurses/form/fld_current.c124
-rw-r--r--contrib/ncurses/form/fld_def.c346
-rw-r--r--contrib/ncurses/form/fld_dup.c97
-rw-r--r--contrib/ncurses/form/fld_ftchoice.c62
-rw-r--r--contrib/ncurses/form/fld_ftlink.c83
-rw-r--r--contrib/ncurses/form/fld_info.c91
-rw-r--r--contrib/ncurses/form/fld_just.c81
-rw-r--r--contrib/ncurses/form/fld_link.c90
-rw-r--r--contrib/ncurses/form/fld_max.c74
-rw-r--r--contrib/ncurses/form/fld_move.c62
-rw-r--r--contrib/ncurses/form/fld_newftyp.c125
-rw-r--r--contrib/ncurses/form/fld_opts.c124
-rw-r--r--contrib/ncurses/form/fld_pad.c78
-rw-r--r--contrib/ncurses/form/fld_page.c76
-rw-r--r--contrib/ncurses/form/fld_stat.c73
-rw-r--r--contrib/ncurses/form/fld_type.c92
-rw-r--r--contrib/ncurses/form/fld_user.c67
-rw-r--r--contrib/ncurses/form/form.h388
-rw-r--r--contrib/ncurses/form/form.priv.h128
-rw-r--r--contrib/ncurses/form/frm_cursor.c66
-rw-r--r--contrib/ncurses/form/frm_data.c181
-rw-r--r--contrib/ncurses/form/frm_def.c376
-rw-r--r--contrib/ncurses/form/frm_driver.c3843
-rw-r--r--contrib/ncurses/form/frm_hook.c140
-rw-r--r--contrib/ncurses/form/frm_opts.c116
-rw-r--r--contrib/ncurses/form/frm_page.c100
-rw-r--r--contrib/ncurses/form/frm_post.c117
-rw-r--r--contrib/ncurses/form/frm_req_name.c163
-rw-r--r--contrib/ncurses/form/frm_scale.c63
-rw-r--r--contrib/ncurses/form/frm_sub.c69
-rw-r--r--contrib/ncurses/form/frm_user.c67
-rw-r--r--contrib/ncurses/form/frm_win.c70
-rw-r--r--contrib/ncurses/form/fty_alnum.c137
-rw-r--r--contrib/ncurses/form/fty_alpha.c138
-rw-r--r--contrib/ncurses/form/fty_enum.c289
-rw-r--r--contrib/ncurses/form/fty_int.c160
-rw-r--r--contrib/ncurses/form/fty_ipv4.c81
-rw-r--r--contrib/ncurses/form/fty_num.c195
-rw-r--r--contrib/ncurses/form/fty_regex.c257
-rw-r--r--contrib/ncurses/form/headers31
-rw-r--r--contrib/ncurses/form/llib-lform694
-rw-r--r--contrib/ncurses/form/modules73
-rw-r--r--contrib/ncurses/include/Caps1314
-rwxr-xr-xcontrib/ncurses/include/MKhashsize.sh14
-rwxr-xr-xcontrib/ncurses/include/MKparametrized.sh34
-rw-r--r--contrib/ncurses/include/MKterm.h.awk.in310
-rw-r--r--contrib/ncurses/include/Makefile.in106
-rw-r--r--contrib/ncurses/include/capdefaults.c87
-rw-r--r--contrib/ncurses/include/curses.h.in1346
-rwxr-xr-xcontrib/ncurses/include/edit_cfg.sh66
-rw-r--r--contrib/ncurses/include/headers34
-rw-r--r--contrib/ncurses/include/nc_alloc.h72
-rw-r--r--contrib/ncurses/include/nc_panel.h66
-rw-r--r--contrib/ncurses/include/ncurses_cfg.hin56
-rw-r--r--contrib/ncurses/include/term_entry.h155
-rw-r--r--contrib/ncurses/include/termcap.h.in71
-rw-r--r--contrib/ncurses/include/tic.h274
-rw-r--r--contrib/ncurses/include/unctrl.h.in63
-rwxr-xr-xcontrib/ncurses/install-sh238
-rwxr-xr-xcontrib/ncurses/man/MKterminfo.sh99
-rw-r--r--contrib/ncurses/man/Makefile.in75
-rw-r--r--contrib/ncurses/man/captoinfo.1m188
-rw-r--r--contrib/ncurses/man/clear.148
-rw-r--r--contrib/ncurses/man/curs_addch.3x163
-rw-r--r--contrib/ncurses/man/curs_addchstr.3x84
-rw-r--r--contrib/ncurses/man/curs_addstr.3x77
-rw-r--r--contrib/ncurses/man/curs_attr.3x215
-rw-r--r--contrib/ncurses/man/curs_beep.3x63
-rw-r--r--contrib/ncurses/man/curs_bkgd.3x101
-rw-r--r--contrib/ncurses/man/curs_border.3x108
-rw-r--r--contrib/ncurses/man/curs_clear.3x94
-rw-r--r--contrib/ncurses/man/curs_color.3x190
-rw-r--r--contrib/ncurses/man/curs_delch.3x68
-rw-r--r--contrib/ncurses/man/curs_deleteln.3x84
-rw-r--r--contrib/ncurses/man/curs_getch.3x274
-rw-r--r--contrib/ncurses/man/curs_getstr.3x102
-rw-r--r--contrib/ncurses/man/curs_getyx.3x72
-rw-r--r--contrib/ncurses/man/curs_inch.3x73
-rw-r--r--contrib/ncurses/man/curs_inchstr.3x84
-rw-r--r--contrib/ncurses/man/curs_initscr.3x116
-rw-r--r--contrib/ncurses/man/curs_inopts.3x214
-rw-r--r--contrib/ncurses/man/curs_insch.3x68
-rw-r--r--contrib/ncurses/man/curs_insstr.3x90
-rw-r--r--contrib/ncurses/man/curs_instr.3x84
-rw-r--r--contrib/ncurses/man/curs_kernel.3x152
-rw-r--r--contrib/ncurses/man/curs_mouse.3x206
-rw-r--r--contrib/ncurses/man/curs_move.3x63
-rw-r--r--contrib/ncurses/man/curs_outopts.3x168
-rw-r--r--contrib/ncurses/man/curs_overlay.3x75
-rw-r--r--contrib/ncurses/man/curs_pad.3x111
-rw-r--r--contrib/ncurses/man/curs_print.3x74
-rw-r--r--contrib/ncurses/man/curs_printw.3x76
-rw-r--r--contrib/ncurses/man/curs_refresh.3x112
-rw-r--r--contrib/ncurses/man/curs_scanw.3x77
-rw-r--r--contrib/ncurses/man/curs_scr_dump.3x93
-rw-r--r--contrib/ncurses/man/curs_scroll.3x78
-rw-r--r--contrib/ncurses/man/curs_slk.3x139
-rw-r--r--contrib/ncurses/man/curs_termattrs.3x107
-rw-r--r--contrib/ncurses/man/curs_termcap.3x112
-rw-r--r--contrib/ncurses/man/curs_terminfo.3x255
-rw-r--r--contrib/ncurses/man/curs_touch.3x93
-rw-r--r--contrib/ncurses/man/curs_util.3x114
-rw-r--r--contrib/ncurses/man/curs_window.3x152
-rw-r--r--contrib/ncurses/man/define_key.3x70
-rw-r--r--contrib/ncurses/man/dft_fgbg.3x84
-rw-r--r--contrib/ncurses/man/form.3x200
-rw-r--r--contrib/ncurses/man/form_cursor.3x74
-rw-r--r--contrib/ncurses/man/form_data.3x63
-rw-r--r--contrib/ncurses/man/form_driver.3x272
-rw-r--r--contrib/ncurses/man/form_field.3x97
-rw-r--r--contrib/ncurses/man/form_field_attributes.3x91
-rw-r--r--contrib/ncurses/man/form_field_buffer.3x99
-rw-r--r--contrib/ncurses/man/form_field_info.3x80
-rw-r--r--contrib/ncurses/man/form_field_just.3x78
-rw-r--r--contrib/ncurses/man/form_field_new.3x96
-rw-r--r--contrib/ncurses/man/form_field_opts.3x120
-rw-r--r--contrib/ncurses/man/form_field_userptr.3x73
-rw-r--r--contrib/ncurses/man/form_field_validation.3x127
-rw-r--r--contrib/ncurses/man/form_fieldtype.3x126
-rw-r--r--contrib/ncurses/man/form_hook.3x100
-rw-r--r--contrib/ncurses/man/form_new.3x79
-rw-r--r--contrib/ncurses/man/form_new_page.3x77
-rw-r--r--contrib/ncurses/man/form_opts.3x90
-rw-r--r--contrib/ncurses/man/form_page.3x95
-rw-r--r--contrib/ncurses/man/form_post.3x90
-rw-r--r--contrib/ncurses/man/form_requestname.3x69
-rw-r--r--contrib/ncurses/man/form_userptr.3x73
-rw-r--r--contrib/ncurses/man/form_win.3x95
-rw-r--r--contrib/ncurses/man/infocmp.1m364
-rw-r--r--contrib/ncurses/man/keybound.3x67
-rw-r--r--contrib/ncurses/man/keyok.3x69
-rwxr-xr-xcontrib/ncurses/man/make_sed.sh83
-rw-r--r--contrib/ncurses/man/man_db.renames113
-rw-r--r--contrib/ncurses/man/menu.3x190
-rw-r--r--contrib/ncurses/man/menu_attribs.3x100
-rw-r--r--contrib/ncurses/man/menu_cursor.3x73
-rw-r--r--contrib/ncurses/man/menu_driver.3x170
-rw-r--r--contrib/ncurses/man/menu_format.3x84
-rw-r--r--contrib/ncurses/man/menu_hook.3x101
-rw-r--r--contrib/ncurses/man/menu_items.3x91
-rw-r--r--contrib/ncurses/man/menu_mark.3x84
-rw-r--r--contrib/ncurses/man/menu_new.3x79
-rw-r--r--contrib/ncurses/man/menu_opts.3x104
-rw-r--r--contrib/ncurses/man/menu_pattern.3x82
-rw-r--r--contrib/ncurses/man/menu_post.3x91
-rw-r--r--contrib/ncurses/man/menu_requestname.3x69
-rw-r--r--contrib/ncurses/man/menu_spacing.3x84
-rw-r--r--contrib/ncurses/man/menu_userptr.3x73
-rw-r--r--contrib/ncurses/man/menu_win.3x95
-rw-r--r--contrib/ncurses/man/mitem_current.3x101
-rw-r--r--contrib/ncurses/man/mitem_name.3x64
-rw-r--r--contrib/ncurses/man/mitem_new.3x83
-rw-r--r--contrib/ncurses/man/mitem_opts.3x84
-rw-r--r--contrib/ncurses/man/mitem_userptr.3x72
-rw-r--r--contrib/ncurses/man/mitem_value.3x76
-rw-r--r--contrib/ncurses/man/mitem_visible.3x59
-rw-r--r--contrib/ncurses/man/ncurses.3x912
-rw-r--r--contrib/ncurses/man/panel.3x182
-rw-r--r--contrib/ncurses/man/resizeterm.3x87
-rw-r--r--contrib/ncurses/man/term.5208
-rw-r--r--contrib/ncurses/man/term.7204
-rw-r--r--contrib/ncurses/man/terminfo.head95
-rw-r--r--contrib/ncurses/man/terminfo.tail1497
-rw-r--r--contrib/ncurses/man/tic.1m285
-rw-r--r--contrib/ncurses/man/toe.1m81
-rw-r--r--contrib/ncurses/man/tput.1241
-rw-r--r--contrib/ncurses/man/tset.1247
-rw-r--r--contrib/ncurses/man/wresize.3x70
-rw-r--r--contrib/ncurses/menu/Makefile.in151
-rw-r--r--contrib/ncurses/menu/READ.ME14
-rw-r--r--contrib/ncurses/menu/eti.h52
-rw-r--r--contrib/ncurses/menu/headers32
-rw-r--r--contrib/ncurses/menu/llib-lmenu508
-rw-r--r--contrib/ncurses/menu/m_attribs.c141
-rw-r--r--contrib/ncurses/menu/m_cursor.c110
-rw-r--r--contrib/ncurses/menu/m_driver.c540
-rw-r--r--contrib/ncurses/menu/m_format.c125
-rw-r--r--contrib/ncurses/menu/m_global.c483
-rw-r--r--contrib/ncurses/menu/m_hook.c149
-rw-r--r--contrib/ncurses/menu/m_item_cur.c106
-rw-r--r--contrib/ncurses/menu/m_item_nam.c68
-rw-r--r--contrib/ncurses/menu/m_item_new.c227
-rw-r--r--contrib/ncurses/menu/m_item_opt.c146
-rw-r--r--contrib/ncurses/menu/m_item_top.c102
-rw-r--r--contrib/ncurses/menu/m_item_use.c72
-rw-r--r--contrib/ncurses/menu/m_item_val.c100
-rw-r--r--contrib/ncurses/menu/m_item_vis.c66
-rw-r--r--contrib/ncurses/menu/m_items.c103
-rw-r--r--contrib/ncurses/menu/m_new.c108
-rw-r--r--contrib/ncurses/menu/m_opts.c170
-rw-r--r--contrib/ncurses/menu/m_pad.c90
-rw-r--r--contrib/ncurses/menu/m_pattern.c117
-rw-r--r--contrib/ncurses/menu/m_post.c366
-rw-r--r--contrib/ncurses/menu/m_req_name.c119
-rw-r--r--contrib/ncurses/menu/m_scale.c71
-rw-r--r--contrib/ncurses/menu/m_spacing.c98
-rw-r--r--contrib/ncurses/menu/m_sub.c80
-rw-r--r--contrib/ncurses/menu/m_userptr.c72
-rw-r--r--contrib/ncurses/menu/m_win.c80
-rw-r--r--contrib/ncurses/menu/menu.h250
-rw-r--r--contrib/ncurses/menu/menu.priv.h114
-rw-r--r--contrib/ncurses/menu/mf_common.h93
-rw-r--r--contrib/ncurses/menu/modules60
-rw-r--r--contrib/ncurses/misc/Makefile.in108
-rw-r--r--contrib/ncurses/misc/chkdef.cmd86
-rw-r--r--contrib/ncurses/misc/cleantic.cmd16
-rw-r--r--contrib/ncurses/misc/cmpdef.cmd106
-rw-r--r--contrib/ncurses/misc/emx.src812
-rw-r--r--contrib/ncurses/misc/form.def105
-rw-r--r--contrib/ncurses/misc/form.ref106
-rw-r--r--contrib/ncurses/misc/hackguide.doc694
-rw-r--r--contrib/ncurses/misc/hackguide.html883
-rw-r--r--contrib/ncurses/misc/makedef.cmd151
-rwxr-xr-xcontrib/ncurses/misc/makellib162
-rw-r--r--contrib/ncurses/misc/menu.def84
-rw-r--r--contrib/ncurses/misc/menu.ref73
-rw-r--r--contrib/ncurses/misc/ncurses-intro.doc2530
-rw-r--r--contrib/ncurses/misc/ncurses-intro.html2682
-rw-r--r--contrib/ncurses/misc/ncurses.def442
-rw-r--r--contrib/ncurses/misc/ncurses.ref572
-rw-r--r--contrib/ncurses/misc/panel.def25
-rw-r--r--contrib/ncurses/misc/panel.ref18
-rwxr-xr-xcontrib/ncurses/misc/run_tic.sh159
-rwxr-xr-xcontrib/ncurses/misc/shlib82
-rw-r--r--contrib/ncurses/misc/tabset/std1
-rw-r--r--contrib/ncurses/misc/tabset/stdcrt1
-rw-r--r--contrib/ncurses/misc/tabset/vt1003
-rw-r--r--contrib/ncurses/misc/tabset/vt3003
-rwxr-xr-xcontrib/ncurses/misc/tdlint111
-rw-r--r--contrib/ncurses/misc/terminfo.src17257
-rw-r--r--contrib/ncurses/mk-0th.awk85
-rw-r--r--contrib/ncurses/mk-1st.awk273
-rw-r--r--contrib/ncurses/mk-2nd.awk108
-rwxr-xr-xcontrib/ncurses/mkinstalldirs33
-rw-r--r--contrib/ncurses/ncurses/Makefile.in248
-rw-r--r--contrib/ncurses/ncurses/README2
-rw-r--r--contrib/ncurses/ncurses/SigAction.h117
-rw-r--r--contrib/ncurses/ncurses/base/MKkeyname.awk74
-rwxr-xr-xcontrib/ncurses/ncurses/base/MKlib_gen.sh254
-rw-r--r--contrib/ncurses/ncurses/base/MKunctrl.awk67
-rw-r--r--contrib/ncurses/ncurses/base/README7
-rw-r--r--contrib/ncurses/ncurses/base/define_key.c59
-rw-r--r--contrib/ncurses/ncurses/base/keybound.c45
-rw-r--r--contrib/ncurses/ncurses/base/keyok.c72
-rw-r--r--contrib/ncurses/ncurses/base/lib_addch.c293
-rw-r--r--contrib/ncurses/ncurses/base/lib_addstr.c103
-rw-r--r--contrib/ncurses/ncurses/base/lib_beep.c73
-rw-r--r--contrib/ncurses/ncurses/base/lib_bkgd.c86
-rw-r--r--contrib/ncurses/ncurses/base/lib_box.c110
-rw-r--r--contrib/ncurses/ncurses/base/lib_chgat.c62
-rw-r--r--contrib/ncurses/ncurses/base/lib_clear.c55
-rw-r--r--contrib/ncurses/ncurses/base/lib_clearok.c56
-rw-r--r--contrib/ncurses/ncurses/base/lib_clrbot.c75
-rw-r--r--contrib/ncurses/ncurses/base/lib_clreol.c91
-rw-r--r--contrib/ncurses/ncurses/base/lib_color.c429
-rw-r--r--contrib/ncurses/ncurses/base/lib_colorset.c56
-rw-r--r--contrib/ncurses/ncurses/base/lib_delch.c68
-rw-r--r--contrib/ncurses/ncurses/base/lib_delwin.c72
-rw-r--r--contrib/ncurses/ncurses/base/lib_dft_fgbg.c60
-rw-r--r--contrib/ncurses/ncurses/base/lib_echo.c60
-rw-r--r--contrib/ncurses/ncurses/base/lib_endwin.c61
-rw-r--r--contrib/ncurses/ncurses/base/lib_erase.c73
-rw-r--r--contrib/ncurses/ncurses/base/lib_flash.c73
-rw-r--r--contrib/ncurses/ncurses/base/lib_freeall.c134
-rw-r--r--contrib/ncurses/ncurses/base/lib_getch.c414
-rw-r--r--contrib/ncurses/ncurses/base/lib_getstr.c192
-rw-r--r--contrib/ncurses/ncurses/base/lib_hline.c76
-rw-r--r--contrib/ncurses/ncurses/base/lib_immedok.c54
-rw-r--r--contrib/ncurses/ncurses/base/lib_inchstr.c62
-rw-r--r--contrib/ncurses/ncurses/base/lib_initscr.c78
-rw-r--r--contrib/ncurses/ncurses/base/lib_insch.c67
-rw-r--r--contrib/ncurses/ncurses/base/lib_insdel.c62
-rw-r--r--contrib/ncurses/ncurses/base/lib_insstr.c81
-rw-r--r--contrib/ncurses/ncurses/base/lib_instr.c73
-rw-r--r--contrib/ncurses/ncurses/base/lib_isendwin.c51
-rw-r--r--contrib/ncurses/ncurses/base/lib_leaveok.c56
-rw-r--r--contrib/ncurses/ncurses/base/lib_mouse.c964
-rw-r--r--contrib/ncurses/ncurses/base/lib_move.c63
-rw-r--r--contrib/ncurses/ncurses/base/lib_mvwin.c109
-rw-r--r--contrib/ncurses/ncurses/base/lib_newterm.c206
-rw-r--r--contrib/ncurses/ncurses/base/lib_newwin.c271
-rw-r--r--contrib/ncurses/ncurses/base/lib_nl.c79
-rw-r--r--contrib/ncurses/ncurses/base/lib_overlay.c161
-rw-r--r--contrib/ncurses/ncurses/base/lib_pad.c280
-rw-r--r--contrib/ncurses/ncurses/base/lib_printw.c110
-rw-r--r--contrib/ncurses/ncurses/base/lib_redrawln.c69
-rw-r--r--contrib/ncurses/ncurses/base/lib_refresh.c183
-rw-r--r--contrib/ncurses/ncurses/base/lib_restart.c90
-rw-r--r--contrib/ncurses/ncurses/base/lib_scanw.c111
-rw-r--r--contrib/ncurses/ncurses/base/lib_screen.c198
-rw-r--r--contrib/ncurses/ncurses/base/lib_scroll.c118
-rw-r--r--contrib/ncurses/ncurses/base/lib_scrollok.c56
-rw-r--r--contrib/ncurses/ncurses/base/lib_scrreg.c62
-rw-r--r--contrib/ncurses/ncurses/base/lib_set_term.c315
-rw-r--r--contrib/ncurses/ncurses/base/lib_slk.c214
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkatr_set.c56
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkatrof.c55
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkatron.c55
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkatrset.c55
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkattr.c54
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkclear.c62
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkcolor.c54
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkinit.c51
-rw-r--r--contrib/ncurses/ncurses/base/lib_slklab.c51
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkrefr.c126
-rw-r--r--contrib/ncurses/ncurses/base/lib_slkset.c95
-rw-r--r--contrib/ncurses/ncurses/base/lib_slktouch.c53
-rw-r--r--contrib/ncurses/ncurses/base/lib_touch.c87
-rw-r--r--contrib/ncurses/ncurses/base/lib_ungetch.c74
-rw-r--r--contrib/ncurses/ncurses/base/lib_vline.c77
-rw-r--r--contrib/ncurses/ncurses/base/lib_wattroff.c55
-rw-r--r--contrib/ncurses/ncurses/base/lib_wattron.c55
-rw-r--r--contrib/ncurses/ncurses/base/lib_winch.c52
-rw-r--r--contrib/ncurses/ncurses/base/lib_window.c221
-rw-r--r--contrib/ncurses/ncurses/base/memmove.c63
-rw-r--r--contrib/ncurses/ncurses/base/nc_panel.c41
-rw-r--r--contrib/ncurses/ncurses/base/resizeterm.c121
-rw-r--r--contrib/ncurses/ncurses/base/safe_sprintf.c243
-rw-r--r--contrib/ncurses/ncurses/base/sigaction.c106
-rw-r--r--contrib/ncurses/ncurses/base/tries.c138
-rw-r--r--contrib/ncurses/ncurses/base/vsscanf.c47
-rw-r--r--contrib/ncurses/ncurses/base/wresize.c166
-rw-r--r--contrib/ncurses/ncurses/curses.priv.h791
-rw-r--r--contrib/ncurses/ncurses/fifo_defs.h59
-rw-r--r--contrib/ncurses/ncurses/llib-lncurses2868
-rw-r--r--contrib/ncurses/ncurses/modules186
-rw-r--r--contrib/ncurses/ncurses/tinfo/MKcaptab.awk70
-rwxr-xr-xcontrib/ncurses/ncurses/tinfo/MKfallback.sh75
-rw-r--r--contrib/ncurses/ncurses/tinfo/MKnames.awk98
-rw-r--r--contrib/ncurses/ncurses/tinfo/README8
-rw-r--r--contrib/ncurses/ncurses/tinfo/access.c55
-rw-r--r--contrib/ncurses/ncurses/tinfo/add_tries.c124
-rw-r--r--contrib/ncurses/ncurses/tinfo/alloc_entry.c225
-rw-r--r--contrib/ncurses/ncurses/tinfo/alloc_ttype.c461
-rw-r--r--contrib/ncurses/ncurses/tinfo/captoinfo.c807
-rw-r--r--contrib/ncurses/ncurses/tinfo/comp_error.c132
-rw-r--r--contrib/ncurses/ncurses/tinfo/comp_expand.c189
-rw-r--r--contrib/ncurses/ncurses/tinfo/comp_hash.c325
-rw-r--r--contrib/ncurses/ncurses/tinfo/comp_parse.c490
-rw-r--r--contrib/ncurses/ncurses/tinfo/comp_scan.c756
-rw-r--r--contrib/ncurses/ncurses/tinfo/doalloc.c74
-rw-r--r--contrib/ncurses/ncurses/tinfo/free_ttype.c72
-rw-r--r--contrib/ncurses/ncurses/tinfo/getenv_num.c56
-rw-r--r--contrib/ncurses/ncurses/tinfo/home_terminfo.c62
-rw-r--r--contrib/ncurses/ncurses/tinfo/init_keytry.c67
-rw-r--r--contrib/ncurses/ncurses/tinfo/keys.list158
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_acs.c139
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_baudrate.c178
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_cur_term.c70
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_data.c84
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_has_cap.c63
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_kernel.c130
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_longname.c58
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_napms.c90
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_options.c261
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_print.c96
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_raw.c233
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_setup.c422
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_termcap.c198
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_termname.c46
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_ti.c101
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_tparm.c585
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_tputs.c243
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_ttyflags.c163
-rw-r--r--contrib/ncurses/ncurses/tinfo/make_keys.c131
-rw-r--r--contrib/ncurses/ncurses/tinfo/name_match.c96
-rw-r--r--contrib/ncurses/ncurses/tinfo/parse_entry.c1047
-rw-r--r--contrib/ncurses/ncurses/tinfo/read_entry.c482
-rw-r--r--contrib/ncurses/ncurses/tinfo/read_termcap.c1116
-rw-r--r--contrib/ncurses/ncurses/tinfo/setbuf.c144
-rw-r--r--contrib/ncurses/ncurses/tinfo/write_entry.c557
-rw-r--r--contrib/ncurses/ncurses/trace/README5
-rw-r--r--contrib/ncurses/ncurses/trace/lib_trace.c200
-rw-r--r--contrib/ncurses/ncurses/trace/lib_traceatr.c218
-rw-r--r--contrib/ncurses/ncurses/trace/lib_tracebits.c225
-rw-r--r--contrib/ncurses/ncurses/trace/lib_tracechr.c69
-rw-r--r--contrib/ncurses/ncurses/trace/lib_tracedmp.c128
-rw-r--r--contrib/ncurses/ncurses/trace/lib_tracemse.c95
-rw-r--r--contrib/ncurses/ncurses/trace/trace_buf.c80
-rw-r--r--contrib/ncurses/ncurses/trace/trace_tries.c74
-rw-r--r--contrib/ncurses/ncurses/trace/trace_xnames.c74
-rwxr-xr-xcontrib/ncurses/ncurses/tty/MKexpanded.sh103
-rw-r--r--contrib/ncurses/ncurses/tty/hardscroll.c328
-rw-r--r--contrib/ncurses/ncurses/tty/hashmap.c567
-rw-r--r--contrib/ncurses/ncurses/tty/lib_mvcur.c1242
-rw-r--r--contrib/ncurses/ncurses/tty/lib_tstp.c361
-rw-r--r--contrib/ncurses/ncurses/tty/lib_twait.c221
-rw-r--r--contrib/ncurses/ncurses/tty/lib_vidattr.c278
-rw-r--r--contrib/ncurses/ncurses/tty/tty_display.h146
-rw-r--r--contrib/ncurses/ncurses/tty/tty_input.h61
-rw-r--r--contrib/ncurses/ncurses/tty/tty_update.c1738
-rw-r--r--contrib/ncurses/panel/Makefile.in143
-rw-r--r--contrib/ncurses/panel/headers31
-rw-r--r--contrib/ncurses/panel/llib-lpanel167
-rw-r--r--contrib/ncurses/panel/modules49
-rw-r--r--contrib/ncurses/panel/p_above.c51
-rw-r--r--contrib/ncurses/panel/p_below.c53
-rw-r--r--contrib/ncurses/panel/p_bottom.c53
-rw-r--r--contrib/ncurses/panel/p_delete.c53
-rw-r--r--contrib/ncurses/panel/p_hidden.c47
-rw-r--r--contrib/ncurses/panel/p_hide.c99
-rw-r--r--contrib/ncurses/panel/p_move.c59
-rw-r--r--contrib/ncurses/panel/p_new.c99
-rw-r--r--contrib/ncurses/panel/p_replace.c52
-rw-r--r--contrib/ncurses/panel/p_show.c76
-rw-r--r--contrib/ncurses/panel/p_top.c45
-rw-r--r--contrib/ncurses/panel/p_update.c61
-rw-r--r--contrib/ncurses/panel/p_user.c55
-rw-r--r--contrib/ncurses/panel/p_win.c49
-rw-r--r--contrib/ncurses/panel/panel.c308
-rw-r--r--contrib/ncurses/panel/panel.h81
-rw-r--r--contrib/ncurses/panel/panel.priv.h85
-rwxr-xr-xcontrib/ncurses/progs/MKtermsort.sh121
-rw-r--r--contrib/ncurses/progs/Makefile.in243
-rwxr-xr-xcontrib/ncurses/progs/capconvert229
-rw-r--r--contrib/ncurses/progs/clear.c58
-rwxr-xr-xcontrib/ncurses/progs/clear.sh1
-rw-r--r--contrib/ncurses/progs/dump_entry.c913
-rw-r--r--contrib/ncurses/progs/dump_entry.h60
-rw-r--r--contrib/ncurses/progs/infocmp.c1321
-rw-r--r--contrib/ncurses/progs/modules40
-rw-r--r--contrib/ncurses/progs/progs.priv.h160
-rw-r--r--contrib/ncurses/progs/tic.c812
-rw-r--r--contrib/ncurses/progs/toe.c303
-rw-r--r--contrib/ncurses/progs/tput.c312
-rw-r--r--contrib/ncurses/progs/tset.c1200
-rw-r--r--contrib/ncurses/shlib-versions4
-rw-r--r--contrib/ncurses/tack/COPYING340
-rw-r--r--contrib/ncurses/tack/HISTORY42
-rw-r--r--contrib/ncurses/tack/Makefile.in155
-rw-r--r--contrib/ncurses/tack/README5
-rw-r--r--contrib/ncurses/tack/ansi.c889
-rw-r--r--contrib/ncurses/tack/charset.c709
-rw-r--r--contrib/ncurses/tack/color.c767
-rw-r--r--contrib/ncurses/tack/control.c657
-rw-r--r--contrib/ncurses/tack/crum.c426
-rw-r--r--contrib/ncurses/tack/edit.c977
-rw-r--r--contrib/ncurses/tack/fun.c912
-rw-r--r--contrib/ncurses/tack/init.c300
-rw-r--r--contrib/ncurses/tack/menu.c421
-rw-r--r--contrib/ncurses/tack/modes.c913
-rw-r--r--contrib/ncurses/tack/modules18
-rw-r--r--contrib/ncurses/tack/output.c818
-rw-r--r--contrib/ncurses/tack/pad.c1955
-rw-r--r--contrib/ncurses/tack/scan.c261
-rw-r--r--contrib/ncurses/tack/sync.c424
-rw-r--r--contrib/ncurses/tack/sysdep.c455
-rw-r--r--contrib/ncurses/tack/tack.1311
-rw-r--r--contrib/ncurses/tack/tack.c620
-rw-r--r--contrib/ncurses/tack/tack.h403
-rwxr-xr-xcontrib/ncurses/tar-copy.sh70
-rw-r--r--contrib/ncurses/test/Makefile.in207
-rw-r--r--contrib/ncurses/test/README22
-rw-r--r--contrib/ncurses/test/blue.c440
-rw-r--r--contrib/ncurses/test/bs.642
-rw-r--r--contrib/ncurses/test/bs.c1268
-rw-r--r--contrib/ncurses/test/cardfile.c420
-rw-r--r--contrib/ncurses/test/cardfile.dat13
-rw-r--r--contrib/ncurses/test/configure.in176
-rw-r--r--contrib/ncurses/test/ditto.c148
-rw-r--r--contrib/ncurses/test/filter.c109
-rw-r--r--contrib/ncurses/test/firework.c154
-rw-r--r--contrib/ncurses/test/firstlast.c89
-rw-r--r--contrib/ncurses/test/gdc.622
-rw-r--r--contrib/ncurses/test/gdc.c235
-rw-r--r--contrib/ncurses/test/hanoi.c297
-rw-r--r--contrib/ncurses/test/hashtest.c219
-rw-r--r--contrib/ncurses/test/keynames.c14
-rw-r--r--contrib/ncurses/test/knight.c565
-rw-r--r--contrib/ncurses/test/lrtest.c49
-rw-r--r--contrib/ncurses/test/modules57
-rw-r--r--contrib/ncurses/test/ncurses.c3270
-rw-r--r--contrib/ncurses/test/ncurses_tst.hin56
-rw-r--r--contrib/ncurses/test/newdemo.c348
-rw-r--r--contrib/ncurses/test/rain.c131
-rw-r--r--contrib/ncurses/test/tclock.c184
-rw-r--r--contrib/ncurses/test/test.priv.h90
-rw-r--r--contrib/ncurses/test/testaddch.c60
-rw-r--r--contrib/ncurses/test/testcurs.c640
-rw-r--r--contrib/ncurses/test/testscanw.c38
-rwxr-xr-xcontrib/ncurses/test/tracemunch98
-rw-r--r--contrib/ncurses/test/view.c362
-rw-r--r--contrib/ncurses/test/worm.c372
-rw-r--r--contrib/ncurses/test/xmas.c1148
532 files changed, 150840 insertions, 0 deletions
diff --git a/contrib/ncurses/ANNOUNCE b/contrib/ncurses/ANNOUNCE
new file mode 100644
index 000000000000..b5fd0a1c7e55
--- /dev/null
+++ b/contrib/ncurses/ANNOUNCE
@@ -0,0 +1,351 @@
+
+ Announcing ncurses 5.0
+
+ The ncurses (new curses) library is a free software emulation of
+ curses in System V Release 4.0, 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 SYSV-curses
+ enhancements over BSD curses.
+
+ In mid-June 1995, the maintainer of 4.4BSD curses declared that he
+ considered 4.4BSD curses obsolete, and is encouraging the keepers of
+ Unix releases such as BSD/OS, freeBSD and netBSD to switch over to
+ ncurses.
+
+ The ncurses code was developed under GNU/Linux. It should port easily
+ to any ANSI/POSIX-conforming UNIX. It has even been ported to OS/2
+ Warp!
+
+ The distribution includes the library and support utilities, including
+ a terminfo compiler tic(1), a decompiler infocmp(1), clear(1),
+ tput(1), tset(1), and a termcap conversion tool captoinfo(1). Full
+ manual pages are provided for the library and tools.
+
+ The ncurses distribution is available via anonymous FTP at the GNU
+ distribution site [1]ftp://ftp.gnu.org/pub/gnu. It is also available
+ at [2]ftp://ftp.clark.net/pub/dickey/ncurses.
+
+ Release Notes
+
+ We decided to release ncurses as a new whole number release (5.0)
+ because it incorporates several interface changes, including some that
+ would invalidate existing shared libraries. These are the highlights
+ from the change-log since ncurses 4.2 release.
+
+ Interface changes:
+ * The principal source of changes to the interface comes from the
+ release of X/Open Curses in 1997. Earlier versions of ncurses (4.0
+ and before) were based on a draft version of the specification.
+ The release version adds parameters to some functions to support
+ the evolving internationalization of curses. These summarize the
+ impact:
+ + modified several prototypes to correspond with 1997 version
+ of X/Open Curses (affects ABI since developers have used
+ attr_get).
+ + 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.
+ + 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.
+ + 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.
+ + reviewed/corrected macros in curses.h as per XSI document.
+ + add set_a_attributes and set_pglen_inch to terminfo
+ structure, as per XSI and Solaris 2.5.
+ * The newest version of the X/Open Curses is implemented on Solaris
+ and other vendor's systems. It adds new features to the terminfo
+ descriptions:
+ + implement tparm %l format.
+ + implement tparm printf-style width and precision for %s, %d,
+ %x, %o as per XSI.
+ * We made additional changes to reduce impact by future interface
+ changes:
+ + change key_names[] array to static since it is not part of
+ the curses interface.
+ + move macro winch to a function, to hide details of struct
+ ldat
+ * modify configure script to embed ABI in shared libraries for HP-UX
+ 10.x (detailed request by Tim Mooney).
+ * 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).
+
+ New features:
+ * enable sigwinch handler by default.
+ * turn on hashmap scrolling code by default
+ * improved support for termcap applications
+ + modify tput to accept termcap names as an alternative to
+ terminfo names.
+ + provide support for termcap PC variable by copying it from
+ terminfo data and using it as the padding character in tputs.
+ + 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.
+ + change name-comparisons in lib_termcap to compare no more
+ than 2 characters.
+ + add configure option --enable-tcap-names, which essentially
+ allows users to define new capabilities as in termcap.
+ * add mouse support to ncurses menus.
+ * add mouse and dll support for OS/2 EMX
+ * modify terminfo parsing to accept octal and hexadecimal constants
+ * 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.
+ * 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 -f option to infocmp and tic, which formats the terminfo
+ if/then/else/endif so that they are readable (with newlines and
+ tabs).
+ * modify tic to compile into %'char' form in preference to
+ %{number}, since that is a little more efficient.
+
+ Major bug fixes:
+ * 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.
+ * 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.
+ * 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.
+ * modify setupterm so that cancelled strings are treated the same as
+ absent strings, cancelled and absent booleans false (does not
+ affect tic, infocmp).
+ * 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.
+ * 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.
+ * 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.
+
+ Features of Ncurses
+
+ The ncurses package is fully compatible with SVr4 (System V Release 4)
+ curses:
+
+ * All 257 of the SVr4 calls have been implemented (and are
+ documented).
+ * Full support for SVr4 curses features including keyboard mapping,
+ color, forms-drawing with ACS characters, and automatic
+ recognition of keypad and function keys.
+ * An emulation of the SVr4 panels library, supporting a stack of
+ windows with backing store, is included.
+ * An emulation of the SVr4 menus library, supporting a uniform but
+ flexible interface for menu programming, is included.
+ * An emulation of the SVr4 form library, supporting data collection
+ through on-screen forms, is included.
+ * Binary terminfo entries generated by the ncurses tic(1)
+ implementation are bit-for-bit-compatible with the entry format
+ SVr4 curses uses.
+ * The 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, but not all EXTENDED features). Most
+ EXTENDED-level features not directly concerned with wide-character
+ support are implemented, including many function calls not
+ supported under SVr4 curses (but portability of all calls is
+ documented so you can use the SVr4 subset only).
+ * Unlike SVr4 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 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 16-color terminals, such as aixterm and XFree86 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(1)/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(1) 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.
+ * A script (capconvert) is provided to help BSD users transition
+ from termcap to terminfo. It gathers the information in a TERMCAP
+ environment variable and/or a ~/.termcap local entries file and
+ converts it to an equivalent local terminfo tree under
+ $HOME/.terminfo.
+ * Automatic fallback to the /etc/termcap file can be compiled in
+ when it is not possible to build a terminfo tree. This feature is
+ neither fast nor cheap, you don't want to use it unless you have
+ to, but it's there.
+ * 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
+ have a corresponding function which may be linked (and will be
+ prototype-checked) if the macro definition is disabled with
+ #undef.
+ * An HTML "Introduction to Programming with NCURSES" document
+ provides a narrative introduction to the curses programming
+ interface.
+
+ State of the Package
+
+ Numerous bugs present in earlier versions have been fixed; the library
+ is far more reliable than it used to be. Bounds checking in many
+ `dangerous' entry points has been improved. The code is now type-safe
+ according to gcc -Wall. The library has been checked for malloc leaks
+ and arena corruption by the Purify memory-allocation tester.
+
+ The ncurses code has been tested with a wide variety of applications
+ including (versions starting with those noted):
+
+ ded
+ directory-editor [3]ftp://ftp.clark.net/pub/dickey/ded.
+
+ dialog
+ the underlying application used in Slackware's setup, and the
+ basis for similar applications on GNU/Linux.
+
+ lynx-2.7
+ the character-screen WWW browser
+
+ Midnight Commander 4.1
+ file manager
+
+ mutt 0.88
+ mail utility
+
+ ncftp 2.0
+ file-transfer utility
+
+ nvi
+ New vi versions 1.50 are able to use ncurses versions 1.9.7 and
+ later.
+
+ taper
+ tape archive utility
+
+ vh-1.6
+ Volks-Hypertext browser for the Jargon File
+
+ as well as some that use ncurses for the terminfo support alone:
+
+ minicom-1.75
+ terminal emulator
+
+ tin-unoff
+ tin 1.4 newsreader, supporting color, MIME
+ [4]ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff.
+
+ vile
+ vi-like-emacs [5]ftp://ftp.clark.net/pub/dickey/vile.
+
+ The ncurses distribution includes a selection of test programs
+ (including a few games).
+
+Who's Who and What's What
+
+ The original developers of ncurses are [6]Zeyd Ben-Halim and [7]Eric
+ S. Raymond. Ongoing work is being done by [8]Thomas Dickey and
+ [9]Jürgen Pfeifer. [10]Florian La Roche acts as the maintainer for the
+ Free Software Foundation, which holds the copyright on ncurses.
+ Contact the current maintainers at [11]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 and patches to the current release are made
+ available at [12]ftp://ftp.clark.net/pub/dickey/ncurses.
+
+Future Plans
+
+ * Extended-level XPG4 conformance, with internationalization
+ support.
+ * Ports to more systems, including DOS and Windows.
+
+ We need people to help with these projects. If you are interested in
+ working on them, please join the ncurses list.
+
+Other Related Resources
+
+ The distribution includes and uses a version of the terminfo-format
+ terminal description file maintained by Eric Raymond.
+ [13]http://earthspace.net/~esr/terminfo.
+
+ You can find lots of information on terminal-related topics not
+ covered in the terminfo file at [14]Richard Shuford's archive.
+
+References
+
+ 1. ftp://ftp.gnu.org/pub/gnu
+ 2. ftp://ftp.clark.net/pub/dickey/ncurses
+ 3. ftp://ftp.clark.net/pub/dickey/ded
+ 4. ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff
+ 5. ftp://ftp.clark.net/pub/dickey/vile
+ 6. mailto:zmbenhal@netcom.com
+ 7. http://www.ccil.org/~esr/home.html
+ 8. mailto:dickey@clark.net
+ 9. mailto:juergen.pfeifer@gmx.net
+ 10. mailto:florian@gnu.org
+ 11. mailto:bug-ncurses@gnu.org
+ 12. ftp://ftp.clark.net/pub/dickey/ncurses
+ 13. http://earthspace.net/~esr/terminfo
+ 14. http://www.cs.utk.edu/~shuford/terminal_index.html
diff --git a/contrib/ncurses/INSTALL b/contrib/ncurses/INSTALL
new file mode 100644
index 000000000000..2ad50f6d9d73
--- /dev/null
+++ b/contrib/ncurses/INSTALL
@@ -0,0 +1,481 @@
+-- $Id: INSTALL,v 1.32 1999/07/24 21:06:24 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 Linux or FreeBSD or NetBSD distribution integrator or packager,
+please read and act on the section titled IF YOU ARE A SYSTEM INTEGRATOR
+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 using a version of XFree86 xterm older than 3.1.2F, see the section
+on RECENT XTERM VERSIONS below.
+
+If you are trying to build GNU Emacs using ncurses for terminal support,
+read the USING NCURSES WITH EMACS section below.
+
+If you are trying to build applications using gpm with ncurses,
+read the USING NCURSES WITH GPM section below.
+
+If you are trying to build Elvis using ncurses for terminal support,
+read the USING NCURSES WITH ELVIS section below.
+
+If you are running over the Andrew File System see the note below on
+USING NCURSES WITH AFS.
+
+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.
+
+If you are using anything but (a) Linux, or (b) one of the 4.4BSD-based
+i386 Unixes, go read the Portability section in the TO-DO file before you
+do anything else.
+
+REQUIREMENTS:
+
+You will need the following in order to build and install ncurses under UNIX:
+
+ * ANSI C compiler (gcc is recommended)
+ * 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 in subdirectories of /usr/local. Use
+ --prefix=/usr to replace your default curses distribution. This is the
+ default for Linux and BSD/OS users.
+
+ The package gets installed beneath the --prefix directory as follows:
+
+ In $(prefix)/bin: tic, infocmp, captoinfo, tset,
+ reset, clear, tput, toe
+ 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 however 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.
+
+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)
+
+ 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 Linux
+ and SunOS with gcc, but more work needs to be done to make shared libraries
+ work on other systems.
+
+ 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 man 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. Exceptions include
+ DEC's Digital Unix (formerly known as OSF/1).
+
+ 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 man 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 man 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. I have a file called terminfo.custom for #
+ # this purpose. Don't forget to run tic on the file once you're done. #
+ ############################################################################
+
+ The terminfo(5) manual page wants to 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 man page
+ to be sure.
+
+ If the system already has a curses library that you need to keep using
+ for some bizarre binary-compatibility reason, you'll need to distinguish
+ between it and ncurses. 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 BSD 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. _waddbytes is one of them.
+
+ 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 need to have c++ (and its libraries) installed before you can
+ compile and run the demo.
+
+ If you do not have C++, you must use the --without-cxx option to tell
+ the configure script to not attempt to build the C++ bindings.
+
+7. If you're running an older Linux, you must either (a) tell Linux that the
+ console terminal type is `linux' or (b) make a link to or copy of the
+ linux entry in the appropriate place under your terminfo directory, named
+ `console'. All 1.3 and many 1.2 distributions (including Yggdrasil and
+ Red Hat) already have the console type set to `linux'.
+
+ The way to change the wired-in console type depends on the configuration
+ of your system. This may involve editing /etc/inittab, /etc/ttytype,
+ /etc/profile and other such files.
+
+ Warning: this is not for the fainthearted, if you mess up your console
+ getty entries you can make your system unusable! However, if you are
+ a distribution maker, this is the right thing to do (see the note for
+ integrators near the end of this file).
+
+ The easier way is to link or copy l/linux to c/console under your terminfo
+ directory. Note: this will go away next time you do `make install.data'
+ and you'll have to redo it. There is no need to have entries for all
+ possible screen sizes, ncurses will figure out the size automatically.
+
+IF YOU ARE A SYSTEM INTEGRATOR:
+
+ Beginning with 1.9.9, the ncurses distribution includes both a tset
+ utility and /usr/share/tabset directory. If you are installing ncurses,
+ it is no longer either necessary or desirable to install tset-jv.
+
+ Configuration and Installation:
+
+ Configure with --prefix=/usr to make the install productions put
+ libraries and headers in the correct locations (overwriting any
+ previous curses libraries and headers). This will put the terminfo
+ hierarchy under /usr/share/terminfo; you may want to override this with
+ --datadir=/usr/share/misc; terminfo and tabset are installed under the
+ data directory.
+
+ Please configure the ncurses library in a pure-terminfo mode; that
+ is, with the --disable-termcap option. This will make 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 option speeds up
+ termcap-based startups, at the expense of not allowing personal
+ termcap entries to reference the terminfo tree. See the code in
+ ncurses/tinfo/read_termcap.c for 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 Linuxes (and possibly elsewhere) there has been a practice
+ of designating the system console driver type as `console'. Please
+ do not do this any more! 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's 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
+ distribution, 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.
+
+RECENT XTERM VERSIONS
+ The terminfo database file included with this distribution assumes you
+ are running an XFree86 xterm based on X11R6 (i.e., xterm-r6). The
+ earlier X11R5 entry (xterm-r5) is provided as well.
+
+ If you are running XFree86 version 3.2 (actually 3.1.2F and up), you
+ should consider using the xterm-xf86-v32 (or later, the most recent
+ version is always named "xterm-xfree86") entry, which adds ANSI color
+ and the VT220 capabilities which have been added in XFree86. If you
+ are running a mixed network, however, where this terminal description
+ may be used on an older xterm, you may have problems, since
+ applications that assume these capabilities will produce incorrect
+ output on the older xterm (e.g., highlighting is not cleared).
+
+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.
+
+ 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
+ MKfallback.sh. A 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
+ would use the commands
+
+ cd ncurses;
+ MKfallback.sh linux vt100 xterm >fallback.c
+
+ Then just rebuild and reinstall the library as you would normally.
+ You can restore the default empty fallback list with
+
+ MKfallback.sh >fallback.c
+
+ The overhead for an empty fallback list is one trivial stub function.
+ Any non-empty fallback list is const-ed and therefore lives in sharable
+ 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 will interpret your
+TERMCAP variable (if present), any local termcap files you reference
+through it, and the system termcap file. However, in order to avoid
+slowing down your application startup, it will only do this 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 NCURSES WITH AFS:
+ AFS treats each directory as a separate logical filesystem, you
+ can't hard-link across them. The --enable-symlinks option copes
+ with this by making tic use symbolic links.
+
+USING NCURSES WITH EMACS:
+ GNU Emacs has its own termcap support. By default, it uses a mixture
+ of those functions and code linked from the host system's libraries.
+ You need to foil this and shut out the GNU termcap library entirely.
+
+ In order to do this, hack the Linux config file (s/linux.h) to contain
+ a #define TERMINFO and set the symbol LIBS_TERMCAP to "-lncurses".
+
+ We have submitted such a change for the 19.30 release, so it may
+ already be applied in your sources -- check for the #define TERMINFO.
+
+USING NCURSES WITH GPM:
+ Ncurses 4.1 and up can be configured to use GPM (General Purpose Mouse)
+ which is used on 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 of libcurses.so (the BSD curses)
+ into the libgpm.so file, producing symbol conflicts with ncurses. 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.
+ A patched version of gpm is available:
+
+ ftp.clark.net:/pub/dickey/ncurses/gpm-1.10-970125.tgz
+
+ This patch is incorporated in gpm 1.12; however some integrators
+ are slow to update this library.
+
+USING NCURSES WITH ELVIS:
+ To use ncurses as the screen-painting library for Elvis, apply the
+ following patch to the Elvis curses
+
+*** curses.c.orig Sun Jun 26 05:48:23 1994
+--- curses.c Sun Feb 11 16:50:41 1996
+***************
+*** 986,992 ****
+ {
+ if (has_IM)
+ do_IM();
+! do_IC();
+ qaddch(ch);
+ if (has_EI)
+ do_EI();
+--- 986,995 ----
+ {
+ if (has_IM)
+ do_IM();
+!#ifdef NCURSES_VERSION
+! else /* ncurses does insertion in a slightly nonstandard way */
+!#endif
+! do_IC();
+ qaddch(ch);
+ if (has_EI)
+ do_EI();
+
+This patch is for elvis-1.8pl4 but it can even be used for elvis-1.8pl3 with
+an offset of -11 lines.
+
+BUGS:
+ 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 misc directory includes some guidelines
+ on how to report bugs in ways that will get them fixed most quickly.
diff --git a/contrib/ncurses/MANIFEST b/contrib/ncurses/MANIFEST
new file mode 100644
index 000000000000..0340c7d14953
--- /dev/null
+++ b/contrib/ncurses/MANIFEST
@@ -0,0 +1,798 @@
+./ANNOUNCE
+./Ada95/Makefile.in
+./Ada95/README
+./Ada95/TODO
+./Ada95/gen/Makefile.in
+./Ada95/gen/gen.c
+./Ada95/gen/normal.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.ads.m4
+./Ada95/html/ada/files.htm
+./Ada95/html/ada/files/T.htm
+./Ada95/html/ada/funcs.htm
+./Ada95/html/ada/funcs/A.htm
+./Ada95/html/ada/funcs/C.htm
+./Ada95/html/ada/funcs/E.htm
+./Ada95/html/ada/funcs/F.htm
+./Ada95/html/ada/funcs/G.htm
+./Ada95/html/ada/funcs/I.htm
+./Ada95/html/ada/funcs/L.htm
+./Ada95/html/ada/funcs/M.htm
+./Ada95/html/ada/funcs/N.htm
+./Ada95/html/ada/funcs/P.htm
+./Ada95/html/ada/funcs/R.htm
+./Ada95/html/ada/funcs/S.htm
+./Ada95/html/ada/funcs/T.htm
+./Ada95/html/ada/funcs/U.htm
+./Ada95/html/ada/funcs/V.htm
+./Ada95/html/ada/index.htm
+./Ada95/html/ada/main.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_types__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm
+./Ada95/html/ada/terminal_interface-curses-forms__ads.htm
+./Ada95/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm
+./Ada95/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm
+./Ada95/html/ada/terminal_interface-curses-menus__ads.htm
+./Ada95/html/ada/terminal_interface-curses-mouse__ads.htm
+./Ada95/html/ada/terminal_interface-curses-panels-user_data__ads.htm
+./Ada95/html/ada/terminal_interface-curses-panels__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io-float_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses-text_io__ads.htm
+./Ada95/html/ada/terminal_interface-curses__ads.htm
+./Ada95/html/ada/terminal_interface__ads.htm
+./Ada95/html/index.html
+./Ada95/html/man/curs_addch.3x.html
+./Ada95/html/man/curs_addchstr.3x.html
+./Ada95/html/man/curs_addstr.3x.html
+./Ada95/html/man/curs_attr.3x.html
+./Ada95/html/man/curs_beep.3x.html
+./Ada95/html/man/curs_bkgd.3x.html
+./Ada95/html/man/curs_border.3x.html
+./Ada95/html/man/curs_clear.3x.html
+./Ada95/html/man/curs_color.3x.html
+./Ada95/html/man/curs_delch.3x.html
+./Ada95/html/man/curs_deleteln.3x.html
+./Ada95/html/man/curs_getch.3x.html
+./Ada95/html/man/curs_getstr.3x.html
+./Ada95/html/man/curs_getyx.3x.html
+./Ada95/html/man/curs_inch.3x.html
+./Ada95/html/man/curs_inchstr.3x.html
+./Ada95/html/man/curs_initscr.3x.html
+./Ada95/html/man/curs_inopts.3x.html
+./Ada95/html/man/curs_insch.3x.html
+./Ada95/html/man/curs_insstr.3x.html
+./Ada95/html/man/curs_instr.3x.html
+./Ada95/html/man/curs_kernel.3x.html
+./Ada95/html/man/curs_mouse.3x.html
+./Ada95/html/man/curs_move.3x.html
+./Ada95/html/man/curs_outopts.3x.html
+./Ada95/html/man/curs_overlay.3x.html
+./Ada95/html/man/curs_pad.3x.html
+./Ada95/html/man/curs_print.3x.html
+./Ada95/html/man/curs_printw.3x.html
+./Ada95/html/man/curs_refresh.3x.html
+./Ada95/html/man/curs_scanw.3x.html
+./Ada95/html/man/curs_scr_dmp.3x.html
+./Ada95/html/man/curs_scr_dump.3x.html
+./Ada95/html/man/curs_scroll.3x.html
+./Ada95/html/man/curs_slk.3x.html
+./Ada95/html/man/curs_termattrs.3x.html
+./Ada95/html/man/curs_termcap.3x.html
+./Ada95/html/man/curs_terminfo.3x.html
+./Ada95/html/man/curs_touch.3x.html
+./Ada95/html/man/curs_util.3x.html
+./Ada95/html/man/curs_window.3x.html
+./Ada95/html/man/define_key.3x.html
+./Ada95/html/man/dft_fgbg.3x.html
+./Ada95/html/man/form.3x.html
+./Ada95/html/man/form_cursor.3x.html
+./Ada95/html/man/form_data.3x.html
+./Ada95/html/man/form_driver.3x.html
+./Ada95/html/man/form_field.3x.html
+./Ada95/html/man/form_field_attributes.3x.html
+./Ada95/html/man/form_field_buffer.3x.html
+./Ada95/html/man/form_field_info.3x.html
+./Ada95/html/man/form_field_just.3x.html
+./Ada95/html/man/form_field_new.3x.html
+./Ada95/html/man/form_field_opts.3x.html
+./Ada95/html/man/form_field_userptr.3x.html
+./Ada95/html/man/form_field_validation.3x.html
+./Ada95/html/man/form_fieldtype.3x.html
+./Ada95/html/man/form_hook.3x.html
+./Ada95/html/man/form_new.3x.html
+./Ada95/html/man/form_new_page.3x.html
+./Ada95/html/man/form_opts.3x.html
+./Ada95/html/man/form_page.3x.html
+./Ada95/html/man/form_post.3x.html
+./Ada95/html/man/form_requestname.3x.html
+./Ada95/html/man/form_userptr.3x.html
+./Ada95/html/man/form_win.3x.html
+./Ada95/html/man/keyok.3x.html
+./Ada95/html/man/menu.3x.html
+./Ada95/html/man/menu_attribs.3x.html
+./Ada95/html/man/menu_cursor.3x.html
+./Ada95/html/man/menu_driver.3x.html
+./Ada95/html/man/menu_format.3x.html
+./Ada95/html/man/menu_hook.3x.html
+./Ada95/html/man/menu_items.3x.html
+./Ada95/html/man/menu_mark.3x.html
+./Ada95/html/man/menu_new.3x.html
+./Ada95/html/man/menu_opts.3x.html
+./Ada95/html/man/menu_pattern.3x.html
+./Ada95/html/man/menu_post.3x.html
+./Ada95/html/man/menu_requestname.3x.html
+./Ada95/html/man/menu_spacing.3x.html
+./Ada95/html/man/menu_userptr.3x.html
+./Ada95/html/man/menu_win.3x.html
+./Ada95/html/man/mitem_current.3x.html
+./Ada95/html/man/mitem_name.3x.html
+./Ada95/html/man/mitem_new.3x.html
+./Ada95/html/man/mitem_opts.3x.html
+./Ada95/html/man/mitem_userptr.3x.html
+./Ada95/html/man/mitem_value.3x.html
+./Ada95/html/man/mitem_visible.3x.html
+./Ada95/html/man/ncurses.3x.html
+./Ada95/html/man/panel.3x.html
+./Ada95/html/man/resizeterm.3x.html
+./Ada95/html/man/wresize.3x.html
+./Ada95/html/table.html
+./Ada95/samples/Makefile.in
+./Ada95/samples/README
+./Ada95/samples/explain.txt
+./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
+./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/status.adb
+./Ada95/samples/status.ads
+./Ada95/samples/tour.adb
+./Ada95/samples/tour.ads
+./Ada95/src/Makefile.in
+./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-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.adb
+./Ada95/src/terminal_interface.ads
+./INSTALL
+./MANIFEST
+./Makefile.glibc
+./Makefile.in
+./Makefile.os2
+./NEWS
+./README
+./README.emx
+./README.glibc
+./TO-DO
+./aclocal.m4
+./announce.html
+./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
+./convert_configure.pl
+./dist.mk
+./form/Makefile.in
+./form/READ.ME
+./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_int.c
+./form/fty_ipv4.c
+./form/fty_num.c
+./form/fty_regex.c
+./form/headers
+./form/llib-lform
+./form/modules
+./include/Caps
+./include/MKhashsize.sh
+./include/MKparametrized.sh
+./include/MKterm.h.awk.in
+./include/Makefile.in
+./include/capdefaults.c
+./include/curses.h.in
+./include/edit_cfg.sh
+./include/headers
+./include/nc_alloc.h
+./include/nc_panel.h
+./include/ncurses_cfg.hin
+./include/term_entry.h
+./include/termcap.h.in
+./include/tic.h
+./include/unctrl.h.in
+./install-sh
+./man/MKterminfo.sh
+./man/Makefile.in
+./man/captoinfo.1m
+./man/clear.1
+./man/curs_addch.3x
+./man/curs_addchstr.3x
+./man/curs_addstr.3x
+./man/curs_attr.3x
+./man/curs_beep.3x
+./man/curs_bkgd.3x
+./man/curs_border.3x
+./man/curs_clear.3x
+./man/curs_color.3x
+./man/curs_delch.3x
+./man/curs_deleteln.3x
+./man/curs_getch.3x
+./man/curs_getstr.3x
+./man/curs_getyx.3x
+./man/curs_inch.3x
+./man/curs_inchstr.3x
+./man/curs_initscr.3x
+./man/curs_inopts.3x
+./man/curs_insch.3x
+./man/curs_insstr.3x
+./man/curs_instr.3x
+./man/curs_kernel.3x
+./man/curs_mouse.3x
+./man/curs_move.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_termattrs.3x
+./man/curs_termcap.3x
+./man/curs_terminfo.3x
+./man/curs_touch.3x
+./man/curs_util.3x
+./man/curs_window.3x
+./man/define_key.3x
+./man/dft_fgbg.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_win.3x
+./man/infocmp.1m
+./man/keybound.3x
+./man/keyok.3x
+./man/make_sed.sh
+./man/man_db.renames
+./man/menu.3x
+./man/menu_attribs.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/panel.3x
+./man/resizeterm.3x
+./man/term.5
+./man/term.7
+./man/terminfo.head
+./man/terminfo.tail
+./man/tic.1m
+./man/toe.1m
+./man/tput.1
+./man/tset.1
+./man/wresize.3x
+./menu/Makefile.in
+./menu/READ.ME
+./menu/eti.h
+./menu/headers
+./menu/llib-lmenu
+./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_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/emx.src
+./misc/form.def
+./misc/form.ref
+./misc/hackguide.doc
+./misc/hackguide.html
+./misc/makedef.cmd
+./misc/makellib
+./misc/menu.def
+./misc/menu.ref
+./misc/ncurses-intro.doc
+./misc/ncurses-intro.html
+./misc/ncurses.def
+./misc/ncurses.ref
+./misc/panel.def
+./misc/panel.ref
+./misc/run_tic.sh
+./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
+./mkinstalldirs
+./ncurses/Makefile.in
+./ncurses/README
+./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/keybound.c
+./ncurses/base/keyok.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_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_insstr.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/memmove.c
+./ncurses/base/nc_panel.c
+./ncurses/base/resizeterm.c
+./ncurses/base/safe_sprintf.c
+./ncurses/base/sigaction.c
+./ncurses/base/tries.c
+./ncurses/base/vsscanf.c
+./ncurses/base/wresize.c
+./ncurses/curses.priv.h
+./ncurses/fifo_defs.h
+./ncurses/llib-lncurses
+./ncurses/modules
+./ncurses/tinfo/MKcaptab.awk
+./ncurses/tinfo/MKfallback.sh
+./ncurses/tinfo/MKnames.awk
+./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/doalloc.c
+./ncurses/tinfo/free_ttype.c
+./ncurses/tinfo/getenv_num.c
+./ncurses/tinfo/home_terminfo.c
+./ncurses/tinfo/init_keytry.c
+./ncurses/tinfo/keys.list
+./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_ti.c
+./ncurses/tinfo/lib_tparm.c
+./ncurses/tinfo/lib_tputs.c
+./ncurses/tinfo/lib_ttyflags.c
+./ncurses/tinfo/make_keys.c
+./ncurses/tinfo/name_match.c
+./ncurses/tinfo/parse_entry.c
+./ncurses/tinfo/read_entry.c
+./ncurses/tinfo/read_termcap.c
+./ncurses/tinfo/setbuf.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/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_display.h
+./ncurses/tty/tty_input.h
+./ncurses/tty/tty_update.c
+./panel/Makefile.in
+./panel/headers
+./panel/llib-lpanel
+./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/dump_entry.c
+./progs/dump_entry.h
+./progs/infocmp.c
+./progs/modules
+./progs/progs.priv.h
+./progs/tic.c
+./progs/toe.c
+./progs/tput.c
+./progs/tset.c
+./shlib-versions
+./sysdeps/unix/sysv/linux/Makefile
+./sysdeps/unix/sysv/linux/alpha/configure
+./sysdeps/unix/sysv/linux/configure
+./sysdeps/unix/sysv/linux/edit_man.sed
+./sysdeps/unix/sysv/linux/edit_man.sh
+./sysdeps/unix/sysv/linux/run_tic.sh
+./tack/COPYING
+./tack/HISTORY
+./tack/Makefile.in
+./tack/README
+./tack/ansi.c
+./tack/charset.c
+./tack/color.c
+./tack/control.c
+./tack/crum.c
+./tack/edit.c
+./tack/fun.c
+./tack/init.c
+./tack/menu.c
+./tack/modes.c
+./tack/modules
+./tack/output.c
+./tack/pad.c
+./tack/scan.c
+./tack/sync.c
+./tack/sysdep.c
+./tack/tack.1
+./tack/tack.c
+./tack/tack.h
+./tar-copy.sh
+./test/Makefile.in
+./test/README
+./test/blue.c
+./test/bs.6
+./test/bs.c
+./test/cardfile.c
+./test/cardfile.dat
+./test/configure.in
+./test/ditto.c
+./test/filter.c
+./test/firework.c
+./test/firstlast.c
+./test/gdc.6
+./test/gdc.c
+./test/hanoi.c
+./test/hashtest.c
+./test/keynames.c
+./test/knight.c
+./test/lrtest.c
+./test/modules
+./test/ncurses.c
+./test/ncurses_tst.hin
+./test/newdemo.c
+./test/rain.c
+./test/tclock.c
+./test/test.priv.h
+./test/testaddch.c
+./test/testcurs.c
+./test/testscanw.c
+./test/tracemunch
+./test/view.c
+./test/worm.c
+./test/xmas.c
diff --git a/contrib/ncurses/Makefile.glibc b/contrib/ncurses/Makefile.glibc
new file mode 100644
index 000000000000..3af14ce2e629
--- /dev/null
+++ b/contrib/ncurses/Makefile.glibc
@@ -0,0 +1,400 @@
+# Copyright (C) 1997,1998 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+
+# The GNU C Library 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
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public
+# License along with the GNU C Library; see the file COPYING.LIB. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+#
+# Makefile for ncurses part.
+#
+subdir := ncurses
+
+ncurses-version = 4.2
+form-version = $(ncurses-version)
+menu-version = $(ncurses-version)
+panel-version = $(ncurses-version)
+
+extras := form menu ncurses panel
+
+extra-libs = $(extras:%=lib%)
+# These libraries will be built in the `others' pass rather than
+# the `lib' pass, because they depend on libc.so being built already.
+extra-libs-others = $(extra-libs)
+
+# The sources are found in the appropriate subdir.
+subdir-dirs = $(extras) progs test
+vpath %.c $(subdir-dirs)
+vpath %.h $(subdir-dirs)
+
+libform-routines = \
+ fld_arg \
+ fld_attr \
+ fld_current \
+ fld_def \
+ fld_dup \
+ fld_ftchoice \
+ fld_ftlink \
+ fld_info \
+ fld_just \
+ fld_link \
+ fld_max \
+ fld_move \
+ fld_newftyp \
+ fld_opts \
+ fld_pad \
+ fld_page \
+ fld_stat \
+ fld_type \
+ fld_user \
+ frm_cursor \
+ frm_data \
+ frm_def \
+ frm_driver \
+ frm_hook \
+ frm_opts \
+ frm_page \
+ frm_post \
+ frm_req_name \
+ frm_scale \
+ frm_sub \
+ frm_user \
+ frm_win \
+ fty_alnum \
+ fty_alpha \
+ fty_enum \
+ fty_int \
+ fty_ipv4 \
+ fty_num \
+ fty_regex
+
+libncurses-routines = \
+ base/define_key \
+ base/keybound \
+ base/keyok \
+ base/lib_addch \
+ base/lib_addstr \
+ base/lib_beep \
+ base/lib_bkgd \
+ base/lib_box \
+ base/lib_chgat \
+ base/lib_clear \
+ base/lib_clearok \
+ base/lib_clrbot \
+ base/lib_clreol \
+ base/lib_color \
+ base/lib_colorset \
+ base/lib_delch \
+ base/lib_delwin \
+ base/lib_dft_fgbg \
+ base/lib_echo \
+ base/lib_endwin \
+ base/lib_erase \
+ base/lib_flash \
+ base/lib_freeall \
+ base/lib_getch \
+ base/lib_getstr \
+ base/lib_hline \
+ base/lib_immedok \
+ base/lib_inchstr \
+ base/lib_initscr \
+ base/lib_insch \
+ base/lib_insdel \
+ base/lib_insstr \
+ base/lib_instr \
+ base/lib_isendwin \
+ base/lib_leaveok \
+ base/lib_mouse \
+ base/lib_move \
+ base/lib_mvwin \
+ base/lib_newterm \
+ base/lib_newwin \
+ base/lib_nl \
+ base/lib_overlay \
+ base/lib_pad \
+ base/lib_printw \
+ base/lib_redrawln \
+ base/lib_refresh \
+ base/lib_restart \
+ base/lib_scanw \
+ base/lib_screen \
+ base/lib_scroll \
+ base/lib_scrollok \
+ base/lib_scrreg \
+ base/lib_set_term \
+ base/lib_slk \
+ base/lib_slkatr_set \
+ base/lib_slkatrof \
+ base/lib_slkatron \
+ base/lib_slkatrset \
+ base/lib_slkattr \
+ base/lib_slkclear \
+ base/lib_slkcolor \
+ base/lib_slkinit \
+ base/lib_slklab \
+ base/lib_slkrefr \
+ base/lib_slkset \
+ base/lib_slktouch \
+ base/lib_touch \
+ base/lib_ungetch \
+ base/lib_vline \
+ base/lib_wattroff \
+ base/lib_wattron \
+ base/lib_winch \
+ base/lib_window \
+ base/memmove \
+ base/nc_panel \
+ base/resizeterm \
+ base/safe_sprintf \
+ base/sigaction \
+ base/tries \
+ base/vsscanf \
+ base/wresize \
+ codes \
+ comp_captab \
+ expanded \
+ fallback \
+ lib_gen \
+ lib_keyname \
+ names \
+ tinfo/access \
+ tinfo/add_tries \
+ tinfo/alloc_entry \
+ tinfo/alloc_ttype \
+ tinfo/captoinfo \
+ tinfo/comp_error \
+ tinfo/comp_expand \
+ tinfo/comp_hash \
+ tinfo/comp_parse \
+ tinfo/comp_scan \
+ tinfo/doalloc \
+ tinfo/free_ttype \
+ tinfo/getenv_num \
+ tinfo/home_terminfo \
+ tinfo/init_keytry \
+ tinfo/lib_acs \
+ tinfo/lib_baudrate \
+ tinfo/lib_cur_term \
+ tinfo/lib_data \
+ tinfo/lib_has_cap \
+ tinfo/lib_kernel \
+ tinfo/lib_longname \
+ tinfo/lib_napms \
+ tinfo/lib_options \
+ tinfo/lib_print \
+ tinfo/lib_raw \
+ tinfo/lib_setup \
+ tinfo/lib_termcap \
+ tinfo/lib_termname \
+ tinfo/lib_ti \
+ tinfo/lib_tparm \
+ tinfo/lib_tputs \
+ tinfo/lib_ttyflags \
+ tinfo/name_match \
+ tinfo/parse_entry \
+ tinfo/read_entry \
+ tinfo/read_termcap \
+ tinfo/setbuf \
+ tinfo/write_entry \
+ trace/lib_trace \
+ trace/lib_traceatr \
+ trace/lib_tracebits \
+ trace/lib_tracechr \
+ trace/lib_tracedmp \
+ trace/lib_tracemse \
+ trace/trace_buf \
+ trace/trace_tries \
+ trace/trace_xnames \
+ tty/hardscroll \
+ tty/hashmap \
+ tty/lib_mvcur \
+ tty/lib_tstp \
+ tty/lib_vidattr \
+ tty/lib_twait \
+ tty/tty_update \
+ unctrl
+
+libmenu-routines = \
+ m_attribs \
+ m_cursor \
+ m_driver \
+ m_format \
+ m_global \
+ m_hook \
+ m_item_cur \
+ m_item_nam \
+ m_item_new \
+ m_item_opt \
+ m_item_top \
+ m_item_use \
+ m_item_val \
+ m_item_vis \
+ m_items \
+ m_new \
+ m_opts \
+ m_pad \
+ m_pattern \
+ m_post \
+ m_req_name \
+ m_scale \
+ m_spacing \
+ m_sub \
+ m_userptr \
+ m_win
+
+libpanel-routines = \
+ panel \
+ p_above \
+ p_below \
+ p_bottom \
+ p_delete \
+ p_hide \
+ p_hidden \
+ p_move \
+ p_new \
+ p_replace \
+ p_show \
+ p_top \
+ p_update \
+ p_user \
+ p_win
+
+headers = curses.h eti.h form.h menu.h panel.h term.h termcap.h \
+ unctrl.h
+others = clear infocmp tic toe tput tset
+install-bin = $(others)
+
+clear-objs = clear.o
+infocmp-objs = infocmp.o dump_entry.o
+tic-objs = tic.o dump_entry.o
+toe-objs = toe.o dump_entry.o
+tput-objs = tput.o
+tset-objs = tset.o dump_entry.o
+extra-objs = $(tic-objs) $(toe-objs) $(infocmp-objs) $(clear-objs) \
+ $(tput-objs) $(tset-objs)
+
+test-srcs = blue bs cardfile ditto firework firstlast gdc hanoi hashtest knight \
+ lrtest ncurses newdemo rain tclock testaddch testcurs \
+ testscanw view worm xmas
+
+include ../Rules
+
+ifndef tabsetdir
+tabsetdir = $(datadir)/tabset
+endif
+ifndef inst_tabsetdir
+inst_tabsetdir = $(install_root)/$(tabsetdir)
+endif
+
+ifndef terminfodir
+terminfodir = $(datadir)/terminfo
+endif
+ifndef inst_terminfodir
+inst_terminfodir = $(install_root)/$(terminfodir)
+endif
+
+ifndef mandir
+mandir = $(prefix)/man
+endif
+
+ifndef inst_mandir
+inst_mandir = $(install_root)/$(mandir)
+endif
+
+CPPFLAGS += -DTERMINFO='"$(terminfodir)"' -Iinclude -Iform -Incurses \
+ -Imenu -Ipanel -Iprogs -Itest
+
+ifneq ($(strip $(objpfx)),)
+CPPFLAGS += -I$(objpfx)
+endif
+
+LDLIBS-tclock = math/libm
+
+tests: $(test-srcs:%=$(objpfx)%)
+
+$(objpfx)clear: $(addprefix $(objpfx),$(clear-objs))
+$(objpfx)infocmp: $(addprefix $(objpfx),$(infocmp-objs))
+$(objpfx)tic: $(addprefix $(objpfx),$(tic-objs))
+$(objpfx)toe: $(addprefix $(objpfx),$(toe-objs))
+$(objpfx)tput: $(addprefix $(objpfx),$(tput-objs))
+$(objpfx)tset: $(addprefix $(objpfx),$(tset-objs))
+
+ifeq ($(build-shared),yes)
+$(others:%=$(objpfx)%): $(objpfx)libncurses.so
+else
+$(others:%=$(objpfx)%): $(objpfx)libncurses.a
+endif
+
+$(test-srcs:%=$(objpfx)%): $(objpfx)libform.a $(objpfx)libmenu.a \
+ $(objpfx)libpanel.a $(objpfx)libncurses.a
+
+# Depend on libc.so so a DT_NEEDED is generated in the shared objects.
+# This ensures they will load libc.so for needed symbols if loaded by
+# a statically-linked program that hasn't already loaded it.
+$(extras:%=$(objpfx)lib%.so): $(common-objpfx)libc.so
+
+subdir_install: $(inst_libdir)/libtermcap.a $(inst_libdir)/libcurses.a \
+ $(inst_bindir)/reset $(inst_bindir)/captoinfo
+
+$(inst_libdir)/libtermcap.a $(inst_libdir)/libcurses.a: \
+ $(inst_libdir)/libncurses.a
+ $(make-link)
+
+$(inst_bindir)/reset: $(inst_bindir)/tset
+ $(make-link)
+
+$(inst_bindir)/captoinfo: $(inst_bindir)/tic
+ $(make-link)
+
+ifeq (yes,$(build-shared))
+subdir_install: $(inst_libdir)/libtermcap.so $(inst_libdir)/libcurses.so
+
+$(inst_libdir)/libtermcap.so $(inst_libdir)/libcurses.so: \
+ $(inst_libdir)/libncurses.so
+ $(make-link)
+endif
+
+subdir_install: $(inst_mandir)/man5/terminfo.5
+
+$(inst_mandir)/man5/terminfo.5: $(objpfx)terminfo.5 $(wildcard man/*.[0-9]*)
+ $(make-target-directory)
+ sh $(edit_man-sh) $(prefix) $(inst_mandir) $(edit_man-sed) $^
+
+subdir_install: $(inst_tabsetdir)/std
+
+$(inst_tabsetdir)/std: \
+ $(filter-out misc/tabset/CVS, $(wildcard misc/tabset/*))
+ $(make-target-directory)
+ for f in $^; do \
+ echo installing $$f; \
+ $(INSTALL_DATA) $$f $(inst_tabsetdir); \
+ done
+
+
+ifeq (no,$(cross-compiling))
+subdir_install: $(inst_terminfodir)/v/vt100
+
+$(inst_terminfodir)/v/vt100: misc/terminfo.src $(objpfx)tic
+ $(make-target-directory)
+ sh $(run_tic-sh) $(common-objpfx) misc $(terminfodir) \
+ $(install_root)
+endif
+
+subdir_distclean subdir_realclean:
+ -rm -f $(addprefix $(objpfx), MKterm.h.awk codes.c \
+ comp_captab.c confdefs.h config.log curses.h \
+ expanded.c fallback.c hashsize.h keys.tries \
+ lib_gen.c lib_keyname.c names.c ncurses_cfg.h \
+ nomacros.h parametrized.h term.h termcap.h \
+ terminfo.5 termsort.c unctrl.c unctrl.h)
diff --git a/contrib/ncurses/Makefile.in b/contrib/ncurses/Makefile.in
new file mode 100644
index 000000000000..381ca9e7ed75
--- /dev/null
+++ b/contrib/ncurses/Makefile.in
@@ -0,0 +1,92 @@
+# $Id: Makefile.in,v 1.18 1998/08/22 23:45:00 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# Master Makefile for ncurses library.
+
+SHELL = /bin/sh
+
+INSTALL_PREFIX=@INSTALL_PREFIX@
+CF_MFLAGS = @cf_cv_makeflags@ INSTALL_PREFIX="$(INSTALL_PREFIX)"
+
+@SET_MAKE@
+
+NCURSES_MAJOR = @NCURSES_MAJOR@
+NCURSES_MINOR = @NCURSES_MINOR@
+NCURSES_PATCH = @NCURSES_PATCH@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+datadir = @datadir@
+includedir = @includedir@
+libdir = @libdir@
+mandir = @mandir@
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+DIRS_TO_MAKE = @DIRS_TO_MAKE@
+
+all :: $(DIRS_TO_MAKE)
+
+$(DIRS_TO_MAKE) :
+ mkdir $@
+
+preinstall :
+ @ echo ''
+ @ echo '** Configuration summary for NCURSES $(NCURSES_MAJOR).$(NCURSES_MINOR) $(NCURSES_PATCH):'
+ @ echo ''
+ @ echo ' bin directory: '$(bindir)
+ @ echo ' lib directory: '$(libdir)
+ @ echo ' include directory: '$(includedir)
+ @ echo ' man directory: '$(mandir)
+ @ echo ' terminfo directory: '$(datadir)/terminfo
+ @ echo ''
+ @ test "$(includedir)" = "$(prefix)/include" || \
+ echo '** Include-directory is not in a standard location'
+ @ test ! -f $(includedir)/termcap.h || \
+ fgrep NCURSES_VERSION $(includedir)/termcap.h >/dev/null || \
+ echo '** Will overwrite non-ncurses termcap.h'
+ @ test ! -f $(includedir)/curses.h || \
+ fgrep NCURSES_VERSION $(includedir)/curses.h >/dev/null || \
+ echo '** Will overwrite non-ncurses curses.h'
+
+# Put the common rules here so that we can easily construct the list of
+# directories to visit.
+all \
+clean \
+distclean \
+mostlyclean \
+realclean \
+sources \
+uninstall \
+install ::
diff --git a/contrib/ncurses/Makefile.os2 b/contrib/ncurses/Makefile.os2
new file mode 100644
index 000000000000..7a6f56dade13
--- /dev/null
+++ b/contrib/ncurses/Makefile.os2
@@ -0,0 +1,235 @@
+################################################################################
+# Wrapper Makefile for ncurses library under OS/2.
+################################################################################
+# $Id: Makefile.os2,v 1.8 1998/12/13 02:23:13 tom Exp $
+#
+# 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
+# make -f Makefile.os2 CC=gcc HOSTCC=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 = $(INSTALL_PREFIX)$(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 = $(INSTALL_PREFIX)$(datadir)/terminfo
+TABSETDIR = $(INSTALL_PREFIX)$(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/contrib/ncurses/NEWS b/contrib/ncurses/NEWS
new file mode 100644
index 000000000000..98ac40c59784
--- /dev/null
+++ b/contrib/ncurses/NEWS
@@ -0,0 +1,3572 @@
+-- $Id: NEWS,v 1.474 1999/08/22 00:12:43 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 Dickey.
+
+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.
+ > 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 (from discussion
+ with Alexander 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 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 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 Lukyanov, reported by Jeffrey
+ Honig).
+
+990314 pre-release
+ + modify lib_color.c to handle a special case where the curscr
+ attributes have been made obsolete (patch by Alexander Lukyanov).
+ + update BSD/OS console terminfo entries to use klone+sgr and
+ klone+color (patch by Jeffrey 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 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 by Juergen Pfeifer, for Ada95 binding:
+ + 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 compatiblity - 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 Lukyanov).
+ > patch by Juergen Pfeifer, for Ada95 binding:
+ + 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 by Juergen Pfeifer, for Ada95 binding:
+ + 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 Lukyanov).
+ + modify ClrUpdate() function to workaround a problem in nvi, which
+ uses redrawwin in SIGTSTP handling. Jeffrey Honig reported that
+ ncurses repainted the screen with nulls before resuming normal
+ operation (patch by Alexander 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, who says that he has
+ seen messages claiming this behaviour 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 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 compatiblity 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 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
+ 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 (from 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 (from 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 Lukyanov:
+ + move base-library sources into ncurses/base and tty (serial terminal)
+ sources into ncurses/tty, as part of Alexander 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 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 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 correction 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 compatibilty
+ 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 by Mike Hopkirk
+ <hops@sco.com>).
+ + 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 ambigous 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 from Eric's webpage.
+ > 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 from Eric.
+
+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 by J.T.Conklin, to split off seldom-used modules in ncurses
+ (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 (from 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 (from 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 (from J.J.G.Ripoll, who 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.
+ Ju"rgen 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.
+ Ju"rgen 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
+ Ju"rgen 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 Ju"rgen 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 implemenation
+ + 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 (request by Daniel Weaver <danw@znyx.com>,
+ to support 'tack' program):
+ + 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 comparision 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 behaviour 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 receiption 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 by H.J.Lu for glibc integration:
+ + 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 230400 and 460800 bd 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,
+ from 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 threshhold 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 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).
+ + patch by Juergen Pfeifer for C++ binding and demo (see c++/NEWS)
+ + correct index in lib_instr.c (Juergen Pfeifer).
+ + correct typo in 970426 patch from Tom's cleanup of lib_overlay.c
+ (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, though
+ with a perl script 970118).
+ + 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 (from 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 (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 970124, also reported by
+ Kriang Lerdsuwanakij <lerdsuwa@scf-fs.usc.edu> 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 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 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 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 960928).
+ + correct missing ';' in 961221 mod to overwrite option use of $(LN_S).
+ + 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 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 Lukyanov 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.
+ + 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 from Eric.
+
+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 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 (Purify).
+ + modify delwin() to return ERR if the window to be deleted has
+ subwindows, needed as a side-effect of resizeterm() (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).
+ + 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 lav@yars.free.net).
+
+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
+ lav@yars.free.net).
+ + 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 by Juergen Pfeifer (mostly for panel):
+ + 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 by Eric.
+ + 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 by eric:
+ + 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 Eric's changes to xterm-x11r6 (it no longer matched the X11R6.1
+ distribution, as stated)
+ + terminfo 9.13.18 (resync by Eric)
+ + check for getenv("HOME") returning null (Eric).
+ + 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 Lukyanov).
+ + improve appearance of marker in multi-selection menu (Juergen
+ Pfeifer)
+ + fix behaviour for forms with all fields inactive (Juergen
+ Pfeifer)
+ + document 'field_index()' (Juergen Pfeifer)
+ > patch #321 by eric:
+ + 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 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.
+ + corrected logic for 'repeat_char' in EmitRange (from #317), which
+ did not follow the 2-parameter scheme specified in XSI.
+ + corrected logic of wrefresh, wnoutrefresh broken in #319, making
+ clearok work properly (from 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 by eric:
+ + 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 by eric:
+ + modified logic for clearok and related functions (from report by
+ Michael Elkins) - untested
+ > patch 318 by eric:
+ + correction to #317.
+ > patch 317 by eric:
+ + re-add _nc_hash_map
+ + modify EmitRange to maintain position as per original design.
+ + add hashtest.c, program to time the hashmap optimization.
+ > patch 316 by eric:
+ + 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 by eric:
+ + merged A. Lukyanov's patch to use ech and rep - untested
+ (lib_doupdate.c).
+ + 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 by eric:
+ + Enhancement suggested by A. Lukyanov -- reset scroll region on
+ startup rather than at wrapup time.
+ + Fix suggested by A. Lukyanov, make storage of palette tables
+ and their size counts per-screen for multi-terminal applications.
+ + 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 Eric'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 by eric:
+ + add dtterm description
+ + clarify ncurses 'i' test (drop vscanf 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 by eric:
+ correct terminfo.src corrupted by #310
+ > patch 311 by eric:
+ + fix idlok() and idcok() and the default of the idlok switch.
+
+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 by eric:
+ + documentation and prototyping errors for has_color, immedok and idcok
+ (reported by William P Setzer <wsetzer@pams.ncsu.edu>)
+ + updated qnx terminfo entry (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 by eric:
+ + terminfo changes (9.3.10), 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
+ Ju"rgen 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 by eric:
+ + terminfo changes (9.3.8)
+ + modified logic of error-reporting in terminfo parser
+
+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 several people: Juergen Pfeifer, Mike Long)
+ + add LOCAL_LDFLAGS2 symbol (Juergen Pfeifer)
+ + corrected prototype for delay_output() -- bump ABI to 3.2
+ + terminfo patches #306/307 from Eric.
+ + moved logic that filters out rmul and rmso from setupterm to newterm
+ where it is less likely to interfere with termcap applications.
+
+960707
+ + rollback Eric'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.
+ + added sanity-checking of various paired string attributes (Eric).
+ + 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.
+
+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 Eric Raymond.
+
+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 (from request by
+ 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 lav@yars.free.net).
+ > patches 303 by eric
+ + 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).
+
+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@T-Online.de)
+
+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 by eric:
+ + 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 by eric
+ + implement TERMINFO_DIRS, and -o option of tic
+ + added TRACE_IEVENT
+ + removed boolean version of 'getm'
+ + added lib_print.c (for Rick Marshall)
+ + added has_key()
+ + added 't' to ncurses.c test.
+ + moved delay_output() to lib_tputs.c
+ + removed tparam().
+ + misc cursor & optimization fixes.
+
+960504 - snapshot
+ + modified ncurses 'p' test to allow full-screen range for panner size.
+ + fixes for locale (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 by eric:
+ + new "-e" option of tic.
+ + fix for "infocmp -e".
+ + restore working-directory in read_termcap.c
+ + split lib_kernel.c, lib_setup.c and names.c in order to reduce
+ overhead for programs that use only termcap features.
+
+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 by eric:
+ + mods to wgetch() in cooked mode
+ + corrected askuser() logic in tset
+ + correct interaction of endwin() with mouse processing
+ + added trace support for TTY flags
+
+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 initally 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 seperate 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 wil 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 (wont 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.
diff --git a/contrib/ncurses/README b/contrib/ncurses/README
new file mode 100644
index 000000000000..cf1ab656612f
--- /dev/null
+++ b/contrib/ncurses/README
@@ -0,0 +1,175 @@
+-- $Id: README,v 1.17 1998/02/15 01:26:47 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 misc/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 is 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)
+
+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.10 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
+ 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' directory. An HTML introduction to ncurses, panels, and
+menus programming lives in the `misc' directory. Manpages in HTML format
+are under `Ada95/html'.
+
+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 since 1.9.9e):
+ 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).
+
+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 misc directory includes some guidelines
+ on how to report bugs in ways that will get them fixed most quickly.
diff --git a/contrib/ncurses/README.emx b/contrib/ncurses/README.emx
new file mode 100644
index 000000000000..4fa430abb643
--- /dev/null
+++ b/contrib/ncurses/README.emx
@@ -0,0 +1,48 @@
+-- $Id: README.emx,v 1.1 1998/11/21 20:13:05 tom Exp $
+-- Author: Thomas Dickey <dickey@clark.net>
+-------------------------------------------------------------------------------
+
+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.12).
+ GNU patch (version 2.5)
+
+Apply the autoconf patches from
+
+ http://www.clark.net/pub/dickey/autoconf
+ ftp://ftp.clark.net/pub/dickey/autoconf
+
+These are ordered by date:
+
+ autoconf-2.12-970309.patch
+ autoconf-2.12-970429.patch
+ autoconf-2.12-971222-emx.patch
+ autoconf-2.12-971222.patch
+ autoconf-2.12-971230.patch
+
+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/contrib/ncurses/README.glibc b/contrib/ncurses/README.glibc
new file mode 100644
index 000000000000..7d52269b9997
--- /dev/null
+++ b/contrib/ncurses/README.glibc
@@ -0,0 +1,5 @@
+To compile this as an add-on for glibc, unpack it in the glibc source
+tree and put ncurses on the add-on list when you do configure.
+
+hjl@gnu.ai.mit.edu
+03/21/1997
diff --git a/contrib/ncurses/TO-DO b/contrib/ncurses/TO-DO
new file mode 100644
index 000000000000..21e8ee0ca9eb
--- /dev/null
+++ b/contrib/ncurses/TO-DO
@@ -0,0 +1,251 @@
+-- $Id: TO-DO,v 1.39 1998/07/12 00:25:39 tom Exp $
+
+SHORT-TERM TO-DO ITEMS:
+
+Known Problems:
+
+* GNAT does not put libraries in the correct order, so a build only links
+ properly if you use shared libraries since -lncurses is first.
+
+* XPG4 specifies that the enhanced features are not available unless the
+ _XOPEN_SOURCE_EXTENDED test macro is defined by the application. Ncurses uses
+ this macro (incorrectly) to address a dependency upon wchar_t. The functions
+ which use wchar_t are not implemented, so the effect of the test macro is
+ pointless.
+
+* 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 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...
+
+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 running Linux or one of the 4.4BSD derivatives
+ like FreeBSD, NetBSD, or BSDI. For details, see the analysis in the
+ header comment of ncurses/lib_tstp.c.
+
+* In theory, vwprintw and vwscanf are supposed to use the older varargs.h
+ interface for handling variadic argument lists. Linux doesn't have
+ varargs.h, it has 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 uses the stdarg.h binding as well).
+
+* If you're using a BSD earlier than 4.4BSD, or a Linux old enough not to
+ have a native vsscanf(3) in its library, vwscanw() will not work. You lose.
+ (It should work on any System V, however). If you want to fix this, add
+ an implementation to ncurses/vsscanf.c.
+
+* The demo build for the c++ library craps out with many link errors under gcc
+ 2.6.3. We're told the C++ support in 2.6.3 is broken and that the right
+ fix is to upgrade to 2.7.0. This demo is also known to not build with
+ the Sun SPARCworks 4.1 C++ compiler, due to a problem resolving templates.
+
+* Under Ultrix, configure craps out (Ultrix sh is lame). Run it under ksh.
+
+* We've not tested the configure script with cross-compilers. The autoconf
+ tests are supposed to be able to support this (please report bugs). You will
+ have to configure and build in two steps. The first step must create the
+ automatically-generated sources (e.g., comp_captab.c) on your host machine.
+ Then, run "make mostlyclean", remove config.* from the top-level directory
+ and configure for the cross-compiler.
+
++ 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 recently released 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.
+
+Here are page references to all material involving wide or multi-byte
+characters in Issue 4 of the XSI Curses standard, with notes on their
+status in this implementation:
+
+ Page 1 (1.1.2) New Features discussion of internationalization.
+ Page 12 (2.4): Definition of cchar_t, wchar_t.
+ Page 16 (3.3.2): Introduction of multi-column characters.
+ Page 17-18 (3.3.5): Description of non-spacing characters.
+ Page 19-21 (3.4.2): Basic character operations.
+ Page 34 (addnstr): These should now call underlying wide-
+character functions, and do (through waddnstr) if _XOPEN_SOURCE_EXTENDED is on).
+ Page 35 (addnwstr): wide-character add-string functions. All macros
+except waddnwstr() which is not yet defined.
+ Page 36 (add_wch): wide-character add-char functions. All macros
+except wadd_wch() which is not yet defined.
+ Page 39 (attr_get): implemented -- we've just made the current-
+attributes field of the window an attr_t.
+ Page 43 (bkgrnd): None of these are implemented.
+ Page 45 (border_set): Neither of these is implemented.
+ Page 47 (box_set): box_set implemented as macro, but the underlying
+wborder_set() is not yet defined.
+ Page 78 (echo_wchar): echo_wchar() implemented as macro, underlying
+wecho_wchar() not yet implemented.
+ Page 81 (erasechar): Neither entry point is implemented.
+ Page 87 (getbkgrnd): Not implemented.
+ Page 88 (getcchar): Not implemented.
+ Page 93 (getn_wstr): All implemented (as macros) except the
+underlying wgetn_wstr().
+ Page 97 (get_wch): All implemented (as macros) except the
+underlying wget_wch().
+ Page 99 (get_wstr): Xref to page 93.
+ Page 105 (hline_set): All implemented (as macros) except the
+underlying whline_set(), wvline_set().
+ Page 114 (innstr): Multi-byte character-completeness check is
+not implemented.
+ Page 115 (innwstr): All implemented (as macros) except the
+underlying winnw_str().
+ Page 119 (insnstr): Implementation may not be correct for multi-byte
+characters.
+ Page 120 (ins_nwstr): Not implemented.
+ Page 121 (insstr): Xref to page 119.
+ Page 122 (instr): Xref to page 119.
+ Page 123 (ins_wch): Not implemented.
+ Page 124 (ins_wstr): Xref to page 120.
+ Page 126 (in_wch): Not implemented.
+ Page 127 (in_wchnstr): Not implemented.
+ Page 128 (inwstr): Xref to page 115.
+ Page 133 (killwchar): killwchar not implemented.
+ Page 158 (pechochar): pecho_wchar() not implemented.
+ Page 176 (setcchar): Not implemented.
+ Page 181 (slk_attroff): slk_wset not implemented.
+ Page 200 (ungetch): unget_wch() not implemented.
+ Page 203 (vidattr): vid_attr() and vid_puts() not implemented.
+ Page 206 (vline_set): Xref to page 105.
+ Page 214 (wunctrl): Not implemented.
+ Page 216 (curses.h): cchar_t, wint_t, wchar_t references.
+ Page 220 (curses.h): KEY_CODE_YES
+
+Basically, the macro superstructure is there but the core is absent. We
+need better multi-locale support guarantees from the OS to finish this.
+If you are working on internationalization support, please contact us so
+we can cooperate.
+
+2. DOS port
+
+Only 16 of the 55 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.
+
+
diff --git a/contrib/ncurses/aclocal.m4 b/contrib/ncurses/aclocal.m4
new file mode 100644
index 000000000000..b42625d46df4
--- /dev/null
+++ b/contrib/ncurses/aclocal.m4
@@ -0,0 +1,2140 @@
+dnl***************************************************************************
+dnl Copyright (c) 1998 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 <dickey@clark.net> 1996,1997,1998
+dnl
+dnl $Id: aclocal.m4,v 1.162 1999/08/22 00:13:21 tom Exp $
+dnl Macros used in NCURSES auto-configuration script.
+dnl
+dnl ---------------------------------------------------------------------------
+dnl ---------------------------------------------------------------------------
+dnl Construct the list of include-options for the C programs in the Ada95
+dnl binding.
+AC_DEFUN([CF_ADA_INCLUDE_DIRS],
+[
+ACPPFLAGS="$ACPPFLAGS -I. -I../../include"
+if test "$srcdir" != "."; then
+ ACPPFLAGS="$ACPPFLAGS -I\$(srcdir)/../../include"
+fi
+if test -z "$GCC"; then
+ ACPPFLAGS="$ACPPFLAGS -I\$(includedir)"
+elif test "$includedir" != "/usr/include"; then
+ if test "$includedir" = '${prefix}/include' ; then
+ if test $prefix != /usr ; then
+ ACPPFLAGS="$ACPPFLAGS -I\$(includedir)"
+ fi
+ else
+ ACPPFLAGS="$ACPPFLAGS -I\$(includedir)"
+ fi
+fi
+AC_SUBST(ACPPFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl This is adapted from the macros 'fp_PROG_CC_STDC' and 'fp_C_PROTOTYPES'
+dnl in the sharutils 4.2 distribution.
+AC_DEFUN([CF_ANSI_CC_CHECK],
+[
+AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(cf_cv_ansi_cc,[
+cf_cv_ansi_cc=no
+cf_save_CFLAGS="$CFLAGS"
+# 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 -Aa -D_HPUX_SOURCE
+# SVR4 -Xc
+# UnixWare 1.2 (cannot use -Xc, since ANSI/POSIX clashes)
+for cf_arg in "-DCC_HAS_PROTOS" \
+ "" \
+ -qlanglvl=ansi \
+ -std1 \
+ "-Aa -D_HPUX_SOURCE +e" \
+ "-Aa -D_HPUX_SOURCE" \
+ -Xc
+do
+ CFLAGS="$cf_save_CFLAGS $cf_arg"
+ AC_TRY_COMPILE(
+[
+#ifndef CC_HAS_PROTOS
+#if !defined(__STDC__) || (__STDC__ != 1)
+choke me
+#endif
+#endif
+],[
+ int test (int i, double x);
+ struct s1 {int (*f) (int a);};
+ struct s2 {int (*f) (double a);};],
+ [cf_cv_ansi_cc="$cf_arg"; break])
+done
+CFLAGS="$cf_save_CFLAGS"
+])
+AC_MSG_RESULT($cf_cv_ansi_cc)
+
+if test "$cf_cv_ansi_cc" != "no"; then
+if test ".$cf_cv_ansi_cc" != ".-DCC_HAS_PROTOS"; then
+ CFLAGS="$CFLAGS $cf_cv_ansi_cc"
+else
+ AC_DEFINE(CC_HAS_PROTOS)
+fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl For programs that must use an ANSI compiler, obtain compiler options that
+dnl will make it recognize prototypes. We'll do preprocessor checks in other
+dnl macros, since tools such as unproto can fake prototypes, but only part of
+dnl the preprocessor.
+AC_DEFUN([CF_ANSI_CC_REQD],
+[AC_REQUIRE([CF_ANSI_CC_CHECK])
+if test "$cf_cv_ansi_cc" = "no"; then
+ AC_ERROR(
+[Your compiler does not appear to recognize prototypes.
+You have the following choices:
+ a. adjust your compiler options
+ b. get an up-to-date compiler
+ c. use a wrapper such as unproto])
+fi
+])dnl
+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).
+AC_DEFUN([CF_BOOL_DECL],
+[
+AC_MSG_CHECKING([for builtin ifelse(AC_LANG,[C],$CC,$CXX) 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 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's been deprecated.
+AC_DEFUN([CF_BOOL_SIZE],
+[
+AC_MSG_CHECKING([for size of ifelse(AC_LANG,[C],$CC,$CXX) bool])
+AC_CACHE_VAL(cf_cv_type_of_bool,[
+ rm -f cf_test.out
+ AC_TRY_RUN([
+#include <stdlib.h>
+#include <stdio.h>
+#if HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+main()
+{
+ 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);
+ }
+ exit(0);
+}
+ ],
+ [cf_cv_type_of_bool=`cat cf_test.out`],
+ [cf_cv_type_of_bool=unknown],
+ [cf_cv_type_of_bool=unknown])
+ ])
+ rm -f cf_test.out
+AC_MSG_RESULT($cf_cv_type_of_bool)
+if test "$cf_cv_type_of_bool" = unknown ; then
+ AC_MSG_WARN(Assuming unsigned for type of bool)
+ cf_cv_type_of_bool=unsigned
+fi
+])dnl
+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_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*|netbsd*|freebsd*|linux*)
+ 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 NCURSES_VERSION $cf_dir/curses.h 2>&1 >/dev/null ) ; then
+ includedir="$cf_symbol"
+ test -n "$verbose" && echo $ac_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 Check if the terminal-capability database functions are available. If not,
+dnl ncurses has a much-reduced version.
+AC_DEFUN([CF_CGETENT],[
+AC_MSG_CHECKING(for terminal-capability database functions)
+AC_CACHE_VAL(cf_cv_cgetent,[
+AC_TRY_LINK([
+#include <stdlib.h>],[
+ char temp[128];
+ char *buf = temp;
+ char *db_array = temp;
+ cgetent(&buf, /* int *, */ &db_array, "vt100");
+ cgetcap(buf, "tc", '=');
+ cgetmatch(buf, "tc");
+ ],
+ [cf_cv_cgetent=yes],
+ [cf_cv_cgetent=no])
+])
+AC_MSG_RESULT($cf_cv_cgetent)
+test $cf_cv_cgetent = yes && AC_DEFINE(HAVE_BSD_CGETENT)
+])dnl
+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).
+AC_DEFUN([CF_CHECK_CACHE],
+[
+if test -f $srcdir/config.guess ; then
+ AC_CANONICAL_HOST
+ 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")
+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_ERROR("Please remove config.cache and try again.")
+fi
+])dnl
+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 (I would use AC_CACHE_CHECK here, but it will not work when called in a
+dnl loop from CF_SYS_ERRLIST).
+dnl
+dnl $1 = the name to check
+AC_DEFUN([CF_CHECK_ERRNO],
+[
+AC_MSG_CHECKING(if external $1 is declared)
+AC_CACHE_VAL(cf_cv_dcl_$1,[
+ AC_TRY_COMPILE([
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h> ],
+ [long x = (long) $1],
+ [eval 'cf_cv_dcl_'$1'=yes'],
+ [eval 'cf_cv_dcl_'$1'=no]')
+])
+
+eval 'cf_result=$cf_cv_dcl_'$1
+AC_MSG_RESULT($cf_result)
+
+if test "$cf_result" = no ; then
+ eval 'cf_result=DECL_'$1
+ CF_UPPER(cf_result,$cf_result)
+ AC_DEFINE_UNQUOTED($cf_result)
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+CF_CHECK_EXTERN_DATA($1,int)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Check for existence of external data in the current set of libraries. If
+dnl we can modify it, it's real enough.
+dnl $1 = the name to check
+dnl $2 = its type
+AC_DEFUN([CF_CHECK_EXTERN_DATA],
+[
+AC_MSG_CHECKING(if external $1 exists)
+AC_CACHE_VAL(cf_cv_have_$1,[
+ AC_TRY_LINK([
+#undef $1
+extern $2 $1;
+],
+ [$1 = 2],
+ [eval 'cf_cv_have_'$1'=yes'],
+ [eval 'cf_cv_have_'$1'=no'])])
+
+eval 'cf_result=$cf_cv_have_'$1
+AC_MSG_RESULT($cf_result)
+
+if test "$cf_result" = yes ; then
+ eval 'cf_result=HAVE_'$1
+ CF_UPPER(cf_result,$cf_result)
+ AC_DEFINE_UNQUOTED($cf_result)
+fi
+
+])dnl
+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_CXX_LIBRARY],
+[
+cf_cxx_library=unknown
+if test $ac_cv_prog_gxx = yes; then
+ AC_MSG_CHECKING([for libg++])
+ cf_save="$LIBS"
+ LIBS="$LIBS -lg++ -lm"
+ AC_TRY_LINK([
+#include <builtin.h>
+ ],
+ [float foo=abs(1.0)],
+ [cf_cxx_library=yes
+ CXXLIBS="$CXXLIBS -lg++ -lm"],
+ [cf_cxx_library=no])
+ LIBS="$cf_save"
+ AC_MSG_RESULT($cf_cxx_library)
+fi
+])dnl
+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)
+ 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 Check if 'errno' is declared in <errno.h>
+AC_DEFUN([CF_ERRNO],
+[
+CF_CHECK_ERRNO(errno)
+])dnl
+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"
+for cf_math in "" MATH_H
+do
+for cf_excp in "" MATH_EXCEPTION
+do
+ CXXFLAGS="$cf_save_CXXFLAGS -I${srcdir}/c++ -I${srcdir}/menu"
+ 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(ETIP_NEEDS_${cf_math})
+ test -n "$cf_excp" && AC_DEFINE(ETIP_NEEDS_${cf_excp})
+ cf_result="$cf_math $cf_excp"
+ break
+],[])
+done
+done
+AC_MSG_RESULT($cf_result)
+CXXFLAGS="$cf_save_CXXFLAGS"
+])
+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() {
+ static char data[] = "abcdefghijklmnopqrstuwwxyz";
+ char temp[40];
+ bcopy(data, temp, sizeof(data));
+ bcopy(temp+10, temp, 15);
+ bcopy(temp+5, temp+15, 10);
+ exit (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)
+ else
+ AC_DEFINE(USE_MY_MEMMOVE)
+ fi
+])])dnl
+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],
+[
+if test -n "$GCC"
+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 -n "$GCC"
+then
+ AC_CHECKING([for gcc __attribute__ directives])
+ changequote(,)dnl
+cat > conftest.$ac_ext <<EOF
+#line __oline__ "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 void oops(char *,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
+extern void foo(void) GCC_NORETURN;
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { return 0; }
+EOF
+ changequote([,])dnl
+ for cf_attribute in scanf printf unused noreturn
+ do
+ CF_UPPER(CF_ATTRIBUTE,$cf_attribute)
+ cf_directive="__attribute__(($cf_attribute))"
+ echo "checking for gcc $cf_directive" 1>&AC_FD_CC
+ case $cf_attribute in
+ scanf|printf)
+ 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
+# else
+# sed -e 's/__attr.*/\/*nothing*\//' conftest.h >>confdefs.h
+ fi
+ done
+else
+ fgrep define conftest.i >>confdefs.h
+fi
+rm -rf conftest*
+fi
+])dnl
+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 -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)
+dnl -pedantic
+dnl
+AC_DEFUN([CF_GCC_WARNINGS],
+[
+if test -n "$GCC"
+then
+ changequote(,)dnl
+ cat > conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
+EOF
+ changequote([,])dnl
+ AC_CHECKING([for gcc warning options])
+ cf_save_CFLAGS="$CFLAGS"
+ EXTRA_CFLAGS="-W -Wall"
+ cf_warn_CONST=""
+ test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+ for cf_opt in \
+ Wbad-function-cast \
+ Wcast-align \
+ Wcast-qual \
+ Winline \
+ Wmissing-declarations \
+ Wmissing-prototypes \
+ Wnested-externs \
+ Wpointer-arith \
+ Wshadow \
+ Wstrict-prototypes $cf_warn_CONST
+ 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"
+ test "$cf_opt" = Wcast-qual && EXTRA_CFLAGS="$EXTRA_CFLAGS -DXTSTRINGDEFINES"
+ fi
+ done
+ rm -f conftest*
+ CFLAGS="$cf_save_CFLAGS"
+fi
+AC_SUBST(EXTRA_CFLAGS)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Verify that a test program compiles and runs with GNAT
+dnl $cf_ada_make is set to the program that compiles/links
+AC_DEFUN([CF_GNAT_TRY_RUN],
+[
+rm -f conftest*
+cat >>conftest.ads <<CF_EOF
+$1
+CF_EOF
+cat >>conftest.adb <<CF_EOF
+$2
+CF_EOF
+if ( $cf_ada_make 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 -f conftest*
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Verify Version of GNAT.
+AC_DEFUN([CF_GNAT_VERSION],
+[
+changequote(<<, >>)dnl
+cf_cv_gnat_version=`$cf_ada_make -v 2>&1 | grep '[0-9].[0-9][0-9]*' |\
+ sed -e 's/[^0-9 \.]//g' | $AWK '{print $<<1>>;}'`
+case $cf_cv_gnat_version in
+ 3.[1-9]*|[4-9].*)
+ cf_cv_prog_gnat_correct=yes
+ ;;
+ *) echo Unsupported GNAT version $cf_cv_gnat_version. Required is 3.10 or better. Disabling Ada95 binding.
+ cf_cv_prog_gnat_correct=no
+ ;;
+esac
+case $cf_cv_gnat_version in
+ 3.1*|[4-9].*)
+ cf_compile_generics=generics
+ cf_generic_objects="\$(GENOBJS)"
+ ;;
+ *) cf_compile_generics=
+ cf_generic_objects=
+ ;;
+esac
+changequote([, ])dnl
+])
+dnl ---------------------------------------------------------------------------
+dnl Insert text into the help-message, for readability, from AC_ARG_WITH.
+AC_DEFUN([CF_HELP_MESSAGE],
+[AC_DIVERT_HELP([$1])dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Construct the list of include-options according to whether we're building
+dnl in the source directory or using '--srcdir=DIR' option. If we're building
+dnl with gcc, don't append the includedir if it happens to be /usr/include,
+dnl since that usually breaks gcc's shadow-includes.
+AC_DEFUN([CF_INCLUDE_DIRS],
+[
+CPPFLAGS="$CPPFLAGS -I. -I../include"
+if test "$srcdir" != "."; then
+ CPPFLAGS="$CPPFLAGS -I\$(srcdir)/../include"
+fi
+if test -z "$GCC"; then
+ CPPFLAGS="$CPPFLAGS -I\$(includedir)"
+elif test "$includedir" != "/usr/include"; then
+ if test "$includedir" = '${prefix}/include' ; then
+ if test $prefix != /usr ; then
+ CPPFLAGS="$CPPFLAGS -I\$(includedir)"
+ fi
+ else
+ CPPFLAGS="$CPPFLAGS -I\$(includedir)"
+ fi
+fi
+AC_SUBST(CPPFLAGS)
+])dnl
+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)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Compute the library-prefix for the given host system
+dnl $1 = variable to set
+AC_DEFUN([CF_LIB_PREFIX],
+[
+ case $cf_cv_system_name in
+ os2) $1='' ;;
+ *) $1='lib' ;;
+ esac
+])dnl
+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 LIBRARIES 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>
+AC_DEFUN([CF_LIB_RULES],
+[
+CF_LIB_PREFIX(cf_prefix)
+AC_REQUIRE([CF_SUBST_NCURSES_VERSION])
+for cf_dir in $SRC_SUBDIRS
+do
+ if test -f $srcdir/$cf_dir/modules; then
+
+ cf_libs_to_make=
+ for cf_item in $CF_LIST_MODELS
+ do
+ CF_LIB_SUFFIX($cf_item,cf_suffix)
+ cf_libs_to_make="$cf_libs_to_make ../lib/${cf_prefix}${cf_dir}${cf_suffix}"
+ done
+
+ if test $cf_dir = ncurses ; then
+ case "$LIB_SUBSETS" in
+ termlib+*) #(vi
+ ;;
+ *) #(vi
+ cf_item=`echo $cf_libs_to_make |sed -e s/$LIB_NAME/$TINFO_NAME/g`
+ cf_libs_to_make="$cf_item $cf_libs_to_make"
+ ;;
+ esac
+ fi
+
+ sed -e "s@\@LIBS_TO_MAKE\@@$cf_libs_to_make@" \
+ $cf_dir/Makefile >$cf_dir/Makefile.out
+ mv $cf_dir/Makefile.out $cf_dir/Makefile
+
+ $AWK -f $srcdir/mk-0th.awk \
+ name=$cf_dir \
+ $srcdir/$cf_dir/modules >>$cf_dir/Makefile
+
+ for cf_item in $CF_LIST_MODELS
+ do
+ echo 'Appending rules for '$cf_item' model ('$cf_dir')'
+ CF_UPPER(CF_ITEM,$cf_item)
+ CF_LIB_SUFFIX($cf_item,cf_suffix)
+ CF_OBJ_SUBDIR($cf_item,cf_subdir)
+
+ # 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
+
+ for cf_subset in $LIB_SUBSETS
+ do
+ $AWK -f $srcdir/mk-1st.awk \
+ name=$cf_dir \
+ MODEL=$CF_ITEM \
+ model=$cf_subdir \
+ prefix=$cf_prefix \
+ suffix=$cf_suffix \
+ subset=$cf_subset \
+ DoLinks=$cf_cv_do_symlinks \
+ rmSoLocs=$cf_cv_rm_so_locs \
+ ldconfig="$LDCONFIG" \
+ overwrite=$WITH_OVERWRITE \
+ depend="$cf_depend" \
+ target="$target" \
+ $srcdir/$cf_dir/modules >>$cf_dir/Makefile
+ test $cf_dir = ncurses && WITH_OVERWRITE=no
+ $AWK -f $srcdir/mk-2nd.awk \
+ name=$cf_dir \
+ MODEL=$CF_ITEM \
+ model=$cf_subdir \
+ subset=$cf_subset \
+ srcdir=$srcdir \
+ echo=$WITH_ECHO \
+ $srcdir/$cf_dir/modules >>$cf_dir/Makefile
+ done
+ done
+ fi
+
+ echo ' cd '$cf_dir' && $(MAKE) $(CF_MFLAGS) [$]@' >>Makefile
+done
+
+for cf_dir in $SRC_SUBDIRS
+do
+ if test -f $cf_dir/Makefile ; then
+ case "$cf_dir" in
+ Ada95) #(vi
+ echo 'install.libs \' >> Makefile
+ echo 'uninstall.libs ::' >> Makefile
+ echo ' cd '$cf_dir' && $(MAKE) $(CF_MFLAGS) [$]@' >> Makefile
+ ;;
+ esac
+ fi
+
+ if test -f $srcdir/$cf_dir/modules; then
+ echo >> Makefile
+ if test -f $srcdir/$cf_dir/headers; then
+cat >> Makefile <<CF_EOF
+install.includes \\
+uninstall.includes \\
+CF_EOF
+ fi
+if test "$cf_dir" != "c++" ; then
+echo 'lint \' >> Makefile
+fi
+cat >> Makefile <<CF_EOF
+lintlib \\
+install.libs \\
+uninstall.libs \\
+install.$cf_dir \\
+uninstall.$cf_dir ::
+ cd $cf_dir && \$(MAKE) \$(CF_MFLAGS) \[$]@
+CF_EOF
+ elif test -f $srcdir/$cf_dir/headers; then
+cat >> Makefile <<CF_EOF
+
+install.libs \\
+uninstall.libs \\
+install.includes \\
+uninstall.includes ::
+ cd $cf_dir && \$(MAKE) \$(CF_MFLAGS) \[$]@
+CF_EOF
+fi
+done
+
+cat >> Makefile <<CF_EOF
+
+install.data ::
+ cd misc && \$(MAKE) \$(CF_MFLAGS) \[$]@
+
+install.man ::
+ cd man && \$(MAKE) \$(CF_MFLAGS) \[$]@
+
+distclean ::
+ rm -f config.cache config.log config.status Makefile include/ncurses_cfg.h
+ rm -f headers.sh headers.sed
+ rm -rf \$(DIRS_TO_MAKE)
+CF_EOF
+
+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
+#! /bin/sh
+# 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
+echo installing \$SRC in \$DST
+case \$DST in
+/*/include/*)
+ TMP=\${TMPDIR-/tmp}/\`basename \$SRC\`
+ if test ! -f ../headers.sed ; then
+ END=\`basename \$DST\`
+ for i in \`cat \$REF/../*/headers |fgrep -v "#"\`
+ do
+ NAME=\`basename \$i\`
+ echo "s/<\$NAME>/<\$END\/\$NAME>/" >> ../headers.sed
+ done
+ fi
+ rm -f \$TMP
+ sed -f ../headers.sed \$SRC > \$TMP
+ eval \$PRG \$TMP \$DST
+ rm -f \$TMP
+ ;;
+*)
+ eval \$PRG \$SRC \$DST
+ ;;
+esac
+CF_EOF
+
+chmod 0755 headers.sh
+
+for cf_dir in $SRC_SUBDIRS
+do
+ if test -f $srcdir/$cf_dir/headers; then
+ cat >>$cf_dir/Makefile <<CF_EOF
+\$(INSTALL_PREFIX)\$(includedir) :
+ \$(srcdir)/../mkinstalldirs \[$]@
+
+install \\
+install.libs \\
+install.includes :: \$(INSTALL_PREFIX)\$(includedir) \\
+CF_EOF
+ j=""
+ for i in `cat $srcdir/$cf_dir/headers |fgrep -v "#"`
+ do
+ test -n "$j" && echo " $j \\" >>$cf_dir/Makefile
+ j=$i
+ done
+ echo " $j" >>$cf_dir/Makefile
+ for i in `cat $srcdir/$cf_dir/headers |fgrep -v "#"`
+ do
+ echo " @ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f `basename $i`) ; ../headers.sh \$(INSTALL_DATA) \$(INSTALL_PREFIX)\$(includedir) \$(srcdir) $i" >>$cf_dir/Makefile
+ test $i = curses.h && echo " @ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f ncurses.h && \$(LN_S) curses.h ncurses.h)" >>$cf_dir/Makefile
+ done
+
+ cat >>$cf_dir/Makefile <<CF_EOF
+
+uninstall \\
+uninstall.libs \\
+uninstall.includes ::
+CF_EOF
+ for i in `cat $srcdir/$cf_dir/headers |fgrep -v "#"`
+ do
+ i=`basename $i`
+ echo " -@ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f $i)" >>$cf_dir/Makefile
+ test $i = curses.h && echo " -@ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f ncurses.h)" >>$cf_dir/Makefile
+ done
+ fi
+done
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Compute the library-suffix from the given model name
+dnl $1 = model name
+dnl $2 = variable to set
+AC_DEFUN([CF_LIB_SUFFIX],
+[
+ AC_REQUIRE([CF_SUBST_NCURSES_VERSION])
+ case $1 in
+ normal) $2='.a' ;;
+ debug) $2='_g.a' ;;
+ profile) $2='_p.a' ;;
+ shared)
+ case $cf_cv_system_name in
+ openbsd*|netbsd*|freebsd*)
+ $2='.so.$(REL_VERSION)' ;;
+ hpux*) $2='.sl' ;;
+ *) $2='.so' ;;
+ esac
+ esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Compute the string to append to -library from the given model name
+AC_DEFUN([CF_LIB_TYPE],
+[
+ case $1 in
+ normal) $2='' ;;
+ debug) $2='_g' ;;
+ profile) $2='_p' ;;
+ shared) $2='' ;;
+ esac
+])dnl
+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
+ changequote(,)dnl
+ cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int testdata[3] = { 123, 456, 789 };
+EOF
+ changequote([,])dnl
+ if AC_TRY_EVAL(ac_compile) ; then
+ mv conftest.o data.o && \
+ ( $AR $AR_OPTS conftest.a data.o ) 2>&5 1>/dev/null
+ fi
+ rm -f conftest.$ac_ext data.o
+ changequote(,)dnl
+ cat >conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+int testfunc()
+{
+#if defined(NeXT)
+ exit(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
+ changequote([,])dnl
+ if AC_TRY_EVAL(ac_compile); then
+ mv conftest.o func.o && \
+ ( $AR $AR_OPTS conftest.a func.o ) 2>&5 1>/dev/null
+ fi
+ rm -f conftest.$ac_ext func.o
+ ( eval $ac_cv_prog_RANLIB conftest.a ) 2>&5 >/dev/null
+ cf_saveLIBS="$LIBS"
+ LIBS="conftest.a $LIBS"
+ AC_TRY_RUN([
+ int main()
+ {
+ extern int testfunc();
+ exit (!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)
+test $cf_cv_link_dataonly = no && AC_DEFINE(BROKEN_LINKER)
+])dnl
+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).
+AC_DEFUN([CF_LINK_FUNCS],
+[
+AC_CHECK_FUNCS( \
+ remove \
+ unlink )
+
+if test "$ac_cv_prog_cc_cross" = 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 <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+int main()
+{
+ int fail = 0;
+ char *src = "config.log";
+ char *dst = "conftest.chk";
+ struct stat src_sb;
+ struct stat dst_sb;
+
+ stat(src, &src_sb);
+ fail = ($cf_func("config.log", "conftest.chk") < 0)
+ || (stat(dst, &dst_sb) < 0)
+ || (dst_sb.st_mtime != src_sb.st_mtime);
+#ifdef HAVE_UNLINK
+ unlink(dst);
+#else
+ remove(dst);
+#endif
+ exit (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
+ ])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Some 'make' programs support $(MAKEFLAGS), some $(MFLAGS), to pass 'make'
+dnl options to lower-levels. It's 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_MSG_CHECKING([for makeflags variable])
+AC_CACHE_VAL(cf_cv_makeflags,[
+ cf_cv_makeflags=''
+ for cf_option in '-$(MAKEFLAGS)' '$(MFLAGS)'
+ do
+ cat >cf_makeflags.tmp <<CF_EOF
+all :
+ @ echo '.$cf_option'
+CF_EOF
+ cf_result=`${MAKE-make} -k -f cf_makeflags.tmp 2>/dev/null`
+ case "$cf_result" in
+ .*k)
+ 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 no match "$cf_result"
+ ;;
+ esac
+ done
+ rm -f cf_makeflags.tmp])
+AC_MSG_RESULT($cf_cv_makeflags)
+AC_SUBST(cf_cv_makeflags)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Option to allow user to override automatic configuration of manpage format.
+dnl There are several special cases.
+AC_DEFUN([CF_MANPAGE_FORMAT],
+[ AC_MSG_CHECKING(format of man-pages)
+
+AC_ARG_WITH(manpage-format,
+ [ --with-manpage-format specify manpage-format: gzip/compress/BSDI/normal and
+ optionally formatted, e.g., gzip,formatted],
+ [cf_manpage_form=$withval],
+ [cf_manpage_form=unknown])
+
+case ".$cf_manpage_form" in
+.gzip|.compress|.BSDI|.normal|.formatted) # (vi
+ ;;
+.unknown|.) # (vi
+ if test -z "$MANPATH" ; then
+ MANPATH="/usr/man:/usr/share/man"
+ fi
+ # look for the 'date' man-page (it's most likely to be installed!)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ cf_manpage_form=unknown
+ for cf_dir in $MANPATH; do
+ test -z "$cf_dir" && cf_dir=/usr/man
+changequote({{,}})dnl
+ for cf_name in $cf_dir/*/date.[01]* $cf_dir/*/date
+changequote([,])dnl
+ do
+ cf_test=`echo $cf_name | sed -e 's/*//'`
+ if test "x$cf_test" = "x$cf_name" ; then
+ case "$cf_name" in
+ *.gz) cf_manpage_form=gzip;;
+ *.Z) cf_manpage_form=compress;;
+ *.0) cf_manpage_form=BSDI,formatted;;
+ *) cf_manpage_form=normal;;
+ esac
+ break
+ fi
+ done
+ if test "$cf_manpage_form" != "unknown" ; then
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+.*) # (vi
+ AC_MSG_WARN(Unexpected manpage-format)
+ ;;
+esac
+
+AC_MSG_RESULT($cf_manpage_form)
+])dnl
+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],
+ [cf_manpage_renames=$withval],
+ [cf_manpage_renames=yes])
+
+case ".$cf_manpage_renames" in #(vi
+.no) #(vi
+ ;;
+.|.yes)
+ # Debian 'man' program?
+ if test -f /etc/debian_version ; then
+ cf_manpage_renames=`cd $srcdir && pwd`/man/man_db.renames
+ else
+ cf_manpage_renames=no
+ fi
+ ;;
+esac
+
+if test "$cf_manpage_renames" != no ; then
+ if test ! -f $cf_manpage_renames ; then
+ AC_MSG_ERROR(not a filename: $cf_manpage_renames)
+ fi
+
+ test ! -d man && mkdir man
+
+ # Construct a sed-script to perform renaming within man-pages
+ if test -n "$cf_manpage_renames" ; then
+ test ! -d man && mkdir man
+ $srcdir/man/make_sed.sh $cf_manpage_renames >man/edit_man.sed
+ fi
+fi
+
+AC_MSG_RESULT($cf_manpage_renames)
+])dnl
+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
+
+ if test "$prefix" = "NONE" ; then
+ cf_prefix="$ac_default_prefix"
+ else
+ cf_prefix="$prefix"
+ fi
+
+ case "$cf_manpage_form" in # (vi
+ *formatted*) # (vi
+ cf_subdir='$mandir/cat'
+ cf_format=yes
+ ;;
+ *)
+ cf_subdir='$mandir/man'
+ cf_format=no
+ ;;
+ esac
+
+test ! -d man && mkdir man
+cat >man/edit_man.sh <<CF_EOF
+changequote({{,}})dnl
+#! /bin/sh
+# this script is generated by the configure-script
+prefix="$cf_prefix"
+datadir="$datadir"
+MKDIRS="`cd $srcdir && pwd`/mkinstalldirs"
+INSTALL="$INSTALL"
+INSTALL_DATA="$INSTALL_DATA"
+TMP=\${TMPDIR-/tmp}/man\$\$
+trap "rm -f \$TMP" 0 1 2 5 15
+
+verb=\{{$}}1
+shift
+
+mandir=\{{$}}1
+shift
+
+for i in \{{$}}* ; do
+case \$i in #(vi
+*.orig|*.rej) ;; #(vi
+*.[0-9]*)
+ section=\`expr "\$i" : '.*\\.\\([0-9]\\)[xm]*'\`;
+ if test \$verb = installing ; then
+ if test ! -d $cf_subdir\${section} ; then
+ \$MKDIRS $cf_subdir\$section
+ fi
+ fi
+ source=\`basename \$i\`
+CF_EOF
+if test "$cf_manpage_renames" = no ; then
+cat >>man/edit_man.sh <<CF_EOF
+ target=$cf_subdir\${section}/\$source
+ sed -e "s,@DATADIR@,\$datadir," < \$i >\$TMP
+CF_EOF
+else
+cat >>man/edit_man.sh <<CF_EOF
+ target=\`grep "^\$source" $cf_manpage_renames | $AWK '{print \{{$}}2}'\`
+ if test -z "\$target" ; then
+ echo '? missing rename for '\$source
+ target="\$source"
+ fi
+ target="$cf_subdir\$section/\$target"
+ test \$verb = installing && sed -e "s,@DATADIR@,\$datadir," < \$i | sed -f edit_man.sed >\$TMP
+CF_EOF
+fi
+if test $cf_format = yes ; then
+cat >>man/edit_man.sh <<CF_EOF
+ nroff -man \$TMP >\$TMP.out
+ mv \$TMP.out \$TMP
+CF_EOF
+fi
+case "$cf_manpage_form" in #(vi
+*compress*) #(vi
+cat >>man/edit_man.sh <<CF_EOF
+ if test \$verb = installing ; then
+ if ( compress -f \$TMP )
+ then
+ mv \$TMP.Z \$TMP
+ fi
+ fi
+ target="\$target.Z"
+CF_EOF
+ ;;
+*gzip*) #(vi
+cat >>man/edit_man.sh <<CF_EOF
+ if test \$verb = installing ; then
+ if ( gzip -f \$TMP )
+ then
+ mv \$TMP.gz \$TMP
+ fi
+ fi
+ target="\$target.gz"
+CF_EOF
+ ;;
+*BSDI*)
+cat >>man/edit_man.sh <<CF_EOF
+ # BSDI installs only .0 suffixes in the cat directories
+ target="\`echo \$target|sed -e 's/\.[1-9]\+.\?/.0/'\`"
+CF_EOF
+ ;;
+esac
+cat >>man/edit_man.sh <<CF_EOF
+ echo \$verb \$target
+ if test \$verb = installing ; then
+ \$INSTALL_DATA \$TMP \$target
+ else
+ rm -f \$target
+ fi
+ ;;
+esac
+done
+CF_EOF
+changequote([,])dnl
+chmod 755 man/edit_man.sh
+
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Compute the object-directory name from the given model name
+AC_DEFUN([CF_OBJ_SUBDIR],
+[
+ case $1 in
+ normal) $2='objects' ;;
+ debug) $2='obj_g' ;;
+ profile) $2='obj_p' ;;
+ shared) $2='obj_s' ;;
+ esac
+])dnl
+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 workaround autoconf's
+dnl delayed evaluation of those symbols.
+AC_DEFUN([CF_PATH_SYNTAX],[
+case ".[$]$1" in #(vi
+./*) #(vi
+ ;;
+.\[$]{*prefix}*) #(vi
+ eval $1="[$]$1"
+ case ".[$]$1" in #(vi
+ .NONE/*)
+ $1=`echo [$]$1 | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+ esac
+ ;; #(vi
+.NONE/*)
+ $1=`echo [$]$1 | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+*)
+ AC_ERROR(expected a pathname)
+ ;;
+esac
+])dnl
+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])
+PROG_EXT=
+case $cf_cv_system_name in
+os2*)
+ # We make sure -Zexe is not used -- it would interfere with @PROG_EXT@
+ CFLAGS="$CFLAGS -Zmt -D__ST_MT_ERRNO__"
+ LDFLAGS=`echo "$LDFLAGS -Zmt -Zcrtdll" | sed "s/-Zexe//g"`
+ PROG_EXT=".exe"
+ ;;
+esac
+AC_SUBST(PROG_EXT)
+])dnl
+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
+/*)
+ ;;
+*)
+changequote({{,}})dnl
+ cf_dir=`echo $INSTALL|sed -e 's%/[^/]*$%%'`
+ test -z "$cf_dir" && cf_dir=.
+changequote([,])dnl
+ INSTALL=`cd $cf_dir && pwd`/`echo $INSTALL | sed -e 's:^.*/::'`
+ ;;
+esac
+])dnl
+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],
+[
+AC_MSG_CHECKING([for regular-expression headers])
+AC_CACHE_VAL(cf_cv_regex,[
+AC_TRY_LINK([#include <sys/types.h>
+#include <regex.h>],[
+ regex_t *p;
+ int x = regcomp(p, "", 0);
+ int y = regexec(p, "", 0, 0, 0);
+ regfree(p);
+ ],[cf_cv_regex="regex.h"],[
+ AC_TRY_LINK([#include <regexp.h>],[
+ char *p = compile("", "", "", 0);
+ int x = step("", "");
+ ],[cf_cv_regex="regexp.h"],[
+ cf_save_LIBS="$LIBS"
+ LIBS="-lgen $LIBS"
+ AC_TRY_LINK([#include <regexpr.h>],[
+ char *p = compile("", "", "");
+ int x = step("", "");
+ ],[cf_cv_regex="regexpr.h"],[LIBS="$cf_save_LIBS"])])])
+])
+AC_MSG_RESULT($cf_cv_regex)
+case $cf_cv_regex in
+ regex.h) AC_DEFINE(HAVE_REGEX_H_FUNCS) ;;
+ regexp.h) AC_DEFINE(HAVE_REGEXP_H_FUNCS) ;;
+ regexpr.h) AC_DEFINE(HAVE_REGEXPR_H_FUNCS) ;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Attempt to determine the appropriate CC/LD options for creating a shared
+dnl library.
+dnl
+dnl Note: $(LOCAL_LDFLAGS) is used to link executables that will run within the
+dnl build-tree, i.e., by making use of the libraries that are compiled in ../lib
+dnl We avoid compiling-in a ../lib path for the shared library since that can
+dnl lead to unexpected results at runtime.
+dnl $(LOCAL_LDFLAGS2) has the same intention but assumes that the shared libraries
+dnl 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 Some loaders leave 'so_locations' lying around. It's nice to clean up.
+AC_DEFUN([CF_SHARED_OPTS],
+[
+ AC_REQUIRE([CF_SUBST_NCURSES_VERSION])
+ LOCAL_LDFLAGS=
+ LOCAL_LDFLAGS2=
+ LD_SHARED_OPTS=
+ INSTALL_LIB="-m 644"
+
+ cf_cv_do_symlinks=no
+
+ 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 #(vi
+ yes) #(vi
+ cf_cv_shlib_version=auto
+ ;;
+ rel|abi|auto|no) #(vi
+ cf_cv_shlib_version=$withval
+ ;;
+ *)
+ AC_ERROR([option value must be one of: rel, abi, auto or no])
+ ;;
+ esac
+ ],[cf_cv_shlib_version=auto])
+ AC_MSG_RESULT($cf_cv_shlib_version)
+
+ cf_cv_rm_so_locs=no
+
+ case $cf_cv_system_name in
+ hpux10.*)
+ # (tested with gcc 2.7.2 -- I don't have c89)
+ if test -n "$GCC"; then
+ CC_SHARED_OPTS='-fPIC'
+ LD_SHARED_OPTS='-Xlinker +b -Xlinker $(libdir)'
+ else
+ CC_SHARED_OPTS='+Z'
+ LD_SHARED_OPTS='-Wl,+b,$(libdir)'
+ fi
+ MK_SHARED_LIB='$(LD) +b $(libdir) -b +h `basename $[@]` -o $[@]'
+ # HP-UX shared libraries must be executable, and should be
+ # readonly to exploit a quirk in the memory manager.
+ INSTALL_LIB="-m 555"
+ cf_cv_do_symlinks=reverse
+ ;;
+ hpux*)
+ # (tested with gcc 2.7.2 -- I don't have c89)
+ if test -n "$GCC"; then
+ CC_SHARED_OPTS='-fPIC'
+ LD_SHARED_OPTS='-Xlinker +b -Xlinker $(libdir)'
+ else
+ CC_SHARED_OPTS='+Z'
+ LD_SHARED_OPTS='-Wl,+b,$(libdir)'
+ fi
+ MK_SHARED_LIB='$(LD) +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"
+ ;;
+ irix*)
+ # tested with IRIX 5.2 and 'cc'.
+ if test -n "$GCC"; then
+ CC_SHARED_OPTS='-fPIC'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -shared -rdata_shared -soname `basename $[@]` -o $[@]'
+ cf_cv_rm_so_locs=yes
+ ;;
+ linux*|gnu*)
+ # tested with Linux 2.0.29 and gcc 2.7.2 (ELF)
+ CC_SHARED_OPTS='-fpic'
+ test $cf_cv_ld_rpath = yes && cf_ld_rpath_opt="-Wl,-rpath,"
+ if test $DFT_LWR_MODEL = "shared" ; then
+ LOCAL_LDFLAGS='-Wl,-rpath,../lib'
+ LOCAL_LDFLAGS2='-Wl,-rpath,../../lib'
+ fi
+ test $cf_cv_shlib_version = auto && cf_cv_shlib_version=rel
+ if test $cf_cv_shlib_version = no ; then
+ MK_SHARED_LIB='gcc -shared -Wl,-stats,-lc -o $[@]'
+ else
+ MK_SHARED_LIB='gcc -shared -Wl,-soname,`basename $[@].$(ABI_VERSION)`,-stats,-lc -o $[@]'
+ fi
+ ;;
+ openbsd2*)
+ CC_SHARED_OPTS='-fpic -DPIC'
+ MK_SHARED_LIB='$(LD) -Bshareable -soname,`basename $[@].$(ABI_VERSION)` -o $[@]'
+ ;;
+ openbsd*|netbsd*|freebsd*)
+ CC_SHARED_OPTS='-fpic -DPIC'
+ MK_SHARED_LIB='$(LD) -Bshareable -o $[@]'
+ ;;
+ 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).
+ CC_SHARED_OPTS=''
+ MK_SHARED_LIB='$(LD) -set_version $(REL_VERSION):$(ABI_VERSION) -expect_unresolved "*" -shared -soname `basename $[@]`'
+ test $cf_cv_ld_rpath = yes && cf_ld_rpath_opt="-rpath"
+ 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" ; then
+ LOCAL_LDFLAGS='-Wl,-rpath,../lib'
+ LOCAL_LDFLAGS2='-Wl,-rpath,../../lib'
+ fi
+ cf_cv_rm_so_locs=yes
+ ;;
+ sco3.2v5*) # (also uw2* and UW7) hops 13-Apr-98
+ # tested with osr5.0.5
+ if test $ac_cv_prog_gcc = yes; then
+ CC_SHARED_OPTS='-melf -fpic'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -dy -G -h `basename [$]@.$(ABI_VERSION)` -o [$]@'
+ if test $cf_cv_ld_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 $ac_cv_prog_gcc = yes; then
+ CC_SHARED_OPTS='-fpic'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -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
+ if test $ac_cv_prog_gcc = yes; then
+ CC_SHARED_OPTS='-fpic'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -dy -G -h `basename $[@].$(ABI_VERSION)` -o $[@]'
+ if test $cf_cv_ld_rpath = yes ; then
+ cf_ld_rpath_opt="-R"
+ EXTRA_LDFLAGS="-R ../lib:\$(libdir) $EXTRA_LDFLAGS"
+ fi
+ test $cf_cv_shlib_version = auto && cf_cv_shlib_version=rel
+ ;;
+ unix_sv*)
+ # tested with UnixWare 1.1.2
+ CC_SHARED_OPTS='-KPIC'
+ MK_SHARED_LIB='$(LD) -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 #(vi
+ rel|abi)
+ case "$MK_SHARED_LIB" in #(vi
+ *'-o $[@]')
+ if test "$cf_cv_do_symlinks" = reverse ; then
+ AC_ERROR(cannot use --with-shlib-version with this platform)
+ fi
+ if test "$cf_cv_shlib_version" = rel ; then
+ MK_SHARED_LIB="$MK_SHARED_LIB"'.$(REL_VERSION)'
+ else
+ MK_SHARED_LIB="$MK_SHARED_LIB"'.$(ABI_VERSION)'
+ fi
+ cf_cv_do_symlinks=yes
+ ;;
+ *)
+ AC_MSG_WARN(ignored --with-shlib-version)
+ ;;
+ esac
+ ;;
+ esac
+
+ if test -n "$cf_ld_rpath_opt" ; then
+ AC_MSG_CHECKING(if we need a space after rpath option)
+ cf_save_LIBS="$LIBS"
+ LIBS="$LIBS ${cf_ld_rpath_opt}/usr/lib"
+ 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 && cf_ld_rpath_opt="$cf_ld_rpath_opt "
+ MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\$(libdir)"
+ fi
+
+ AC_SUBST(CC_SHARED_OPTS)
+ AC_SUBST(LD_SHARED_OPTS)
+ AC_SUBST(MK_SHARED_LIB)
+ AC_SUBST(LINK_PROGS)
+ AC_SUBST(LINK_TESTS)
+ AC_SUBST(EXTRA_LDFLAGS)
+ AC_SUBST(LOCAL_LDFLAGS)
+ AC_SUBST(LOCAL_LDFLAGS2)
+ AC_SUBST(INSTALL_LIB)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Check for definitions & structures needed for window size-changing
+dnl FIXME: check that this works with "snake" (HP-UX 10.x)
+AC_DEFUN([CF_SIZECHANGE],
+[
+AC_MSG_CHECKING([declaration of size-change])
+AC_CACHE_VAL(cf_cv_sizechange,[
+ cf_cv_sizechange=unknown
+ cf_save_CFLAGS="$CFLAGS"
+
+for cf_opts in "" "NEED_PTEM_H"
+do
+
+ CFLAGS="$cf_save_CFLAGS"
+ test -n "$cf_opts" && CFLAGS="$CFLAGS -D$cf_opts"
+ AC_TRY_COMPILE([#include <sys/types.h>
+#if HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#if HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#endif
+#if NEED_PTEM_H
+/* This is a workaround for SCO: they neglected to define struct winsize in
+ * termios.h -- it's only in termio.h and ptem.h
+ */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+#if !defined(sun) || !defined(HAVE_TERMIOS_H)
+#include <sys/ioctl.h>
+#endif
+],[
+#ifdef TIOCGSIZE
+ struct ttysize win; /* FIXME: what system is this? */
+ int y = win.ts_lines;
+ int x = win.ts_cols;
+#else
+#ifdef TIOCGWINSZ
+ struct winsize win;
+ int y = win.ws_row;
+ int x = win.ws_col;
+#else
+ no TIOCGSIZE or TIOCGWINSZ
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+ ],
+ [cf_cv_sizechange=yes],
+ [cf_cv_sizechange=no])
+
+ CFLAGS="$cf_save_CFLAGS"
+ if test "$cf_cv_sizechange" = yes ; then
+ echo "size-change succeeded ($cf_opts)" >&AC_FD_CC
+ test -n "$cf_opts" && AC_DEFINE_UNQUOTED($cf_opts)
+ break
+ fi
+done
+ ])
+AC_MSG_RESULT($cf_cv_sizechange)
+test $cf_cv_sizechange != no && AC_DEFINE(HAVE_SIZECHANGE)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Check for datatype 'speed_t', which is normally declared via either
+dnl sys/types.h or termios.h
+AC_DEFUN([CF_SPEED_TYPE],
+[
+AC_MSG_CHECKING(for speed_t)
+OSPEED_INCLUDES=
+AC_TRY_COMPILE([#include <sys/types.h>],
+ [speed_t some_variable = 0],
+ [OSPEED_TYPE=speed_t],
+ [OSPEED_TYPE=unsigned])
+AC_TRY_COMPILE([#include <termios.h>],
+ [speed_t some_variable = 0],
+ [OSPEED_TYPE=speed_t
+ OSPEED_INCLUDES="#include <termios.h>"],[])
+AC_SUBST(OSPEED_TYPE)
+AC_SUBST(OSPEED_INCLUDES)
+if test "$OSPEED_TYPE" = "unsigned" ; then
+ AC_MSG_RESULT(no)
+ AC_DEFINE(speed_t,unsigned)
+else
+ AC_MSG_RESULT(yes)
+fi
+])dnl
+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_MSG_CHECKING(for src modules)
+
+# dependencies and linker-arguments for test-programs
+TEST_DEPS="${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEPS"
+TEST_ARGS="-l${LIB_NAME}${DFT_ARG_SUFFIX} $TEST_ARGS"
+
+# dependencies and linker-arguments for utility-programs
+PROG_ARGS="$TEST_ARGS"
+
+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 ! -f $srcdir/${cf_dir}/${cf_dir}.h; 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})
+ TEST_DEPS="${LIB_PREFIX}${cf_dir}${DFT_DEP_SUFFIX} $TEST_DEPS"
+ TEST_ARGS="-l${cf_dir}${DFT_ARG_SUFFIX} $TEST_ARGS"
+ fi
+ fi
+done
+AC_MSG_RESULT($cf_cv_src_modules)
+TEST_ARGS="-L${LIB_DIR} -L\$(libdir) $TEST_ARGS"
+AC_SUBST(TEST_DEPS)
+AC_SUBST(TEST_ARGS)
+
+PROG_ARGS="-L${LIB_DIR} -L\$(libdir) $PROG_ARGS"
+AC_SUBST(PROG_ARGS)
+
+SRC_SUBDIRS="man include"
+for cf_dir in $cf_cv_src_modules
+do
+ SRC_SUBDIRS="$SRC_SUBDIRS $cf_dir"
+done
+SRC_SUBDIRS="$SRC_SUBDIRS misc test"
+test $cf_cxx_library != no && SRC_SUBDIRS="$SRC_SUBDIRS c++"
+
+ADA_SUBDIRS=
+if test "$cf_cv_prog_gnat_correct" = yes && test -d $srcdir/Ada95; then
+ SRC_SUBDIRS="$SRC_SUBDIRS Ada95"
+ ADA_SUBDIRS="gen src samples"
+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 Remove "-g" option from the compiler options
+AC_DEFUN([CF_STRIP_G_OPT],
+[$1=`echo ${$1} | sed -e 's/-g //' -e 's/-g$//'`])dnl
+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.
+dnl
+dnl If needed, define SVR4_ACTION.
+AC_DEFUN([CF_STRUCT_SIGACTION],[
+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(SVR4_ACTION)],
+ [sigact_bad=unknown])])
+AC_MSG_RESULT($sigact_bad)
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Some machines require _POSIX_SOURCE to completely define struct termios.
+dnl If so, define SVR4_TERMIO
+AC_DEFUN([CF_STRUCT_TERMIOS],[
+if test $ac_cv_header_termios_h = yes ; then
+ case "$CFLAGS" 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],
+ termios_bad=no, [
+ AC_TRY_COMPILE([
+#define _POSIX_SOURCE
+#include <termios.h>],
+ [struct termios foo; int x = foo.c_iflag],
+ termios_bad=unknown,
+ termios_bad=yes AC_DEFINE(SVR4_TERMIO))
+ ])
+ AC_MSG_RESULT($termios_bad)
+ fi
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Shorthand macro for substituting things that the user may override
+dnl with an environment variable.
+dnl
+dnl $1 = long/descriptive name
+dnl $2 = environment variable
+dnl $3 = default value
+AC_DEFUN([CF_SUBST],
+[AC_CACHE_VAL(cf_cv_subst_$2,[
+AC_MSG_CHECKING(for $1 (symbol $2))
+test -z "[$]$2" && $2=$3
+AC_MSG_RESULT([$]$2)
+AC_SUBST($2)
+cf_cv_subst_$2=[$]$2])
+$2=${cf_cv_subst_$2}
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Get the version-number for use in shared-library naming, etc.
+AC_DEFUN([CF_SUBST_NCURSES_VERSION],
+[
+changequote(,)dnl
+NCURSES_MAJOR="`egrep '^NCURSES_MAJOR[ ]*=' $srcdir/dist.mk | sed -e 's/^[^0-9]*//'`"
+NCURSES_MINOR="`egrep '^NCURSES_MINOR[ ]*=' $srcdir/dist.mk | sed -e 's/^[^0-9]*//'`"
+NCURSES_PATCH="`egrep '^NCURSES_PATCH[ ]*=' $srcdir/dist.mk | sed -e 's/^[^0-9]*//'`"
+changequote([,])dnl
+cf_cv_abi_version=${NCURSES_MAJOR}
+cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR}
+dnl Show the computed version, for logging
+AC_MSG_RESULT(Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version (`date`))
+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_cc_bool_type)
+AC_SUBST(cf_cv_builtin_bool)
+AC_SUBST(cf_cv_type_of_bool)dnl
+])dnl
+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>
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#if 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)
+])dnl
+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_REQUIRE([CF_UNSIGNED_LITERALS])
+AC_MSG_CHECKING([for type of chtype])
+AC_CACHE_VAL(cf_cv_typeof_chtype,[
+ AC_TRY_RUN([
+#if USE_WIDEC_SUPPORT
+#include <stddef.h> /* we want wchar_t */
+#define WANT_BITS 39
+#else
+#define WANT_BITS 31
+#endif
+#include <stdio.h>
+int main()
+{
+ FILE *fp = fopen("cf_test.out", "w");
+ if (fp != 0) {
+ char *result = "long";
+#if USE_WIDEC_SUPPORT
+ /*
+ * If wchar_t is smaller than a long, it must be an int or a
+ * short. We prefer not to use a short anyway.
+ */
+ if (sizeof(unsigned long) > sizeof(wchar_t))
+ result = "int";
+#endif
+ if (sizeof(unsigned long) > sizeof(unsigned int)) {
+ int n;
+ unsigned int x;
+ for (n = 0; n < WANT_BITS; n++) {
+ unsigned int 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);
+ }
+ exit(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)
+
+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)
+
+])dnl
+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)
+])dnl
+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 Make an uppercase version of a variable
+dnl $1=uppercase($2)
+AC_DEFUN([CF_UPPER],
+[
+changequote(,)dnl
+$1=`echo $2 | tr '[a-z]' '[A-Z]'`
+changequote([,])dnl
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Compute the shift-mask that we'll use for wide-character indices. We use
+dnl all but the index portion of chtype for storing attributes.
+AC_DEFUN([CF_WIDEC_SHIFT],
+[
+AC_REQUIRE([CF_TYPEOF_CHTYPE])
+AC_MSG_CHECKING([for number of bits in chtype])
+AC_CACHE_VAL(cf_cv_shift_limit,[
+ AC_TRY_RUN([
+#include <stdio.h>
+int main()
+{
+ FILE *fp = fopen("cf_test.out", "w");
+ if (fp != 0) {
+ int n;
+ unsigned TYPEOF_CHTYPE x = 1L;
+ for (n = 0; ; n++) {
+ unsigned long y = (x >> n);
+ if (y != 1 || x == 0)
+ break;
+ x <<= 1;
+ }
+ fprintf(fp, "%d", n);
+ fclose(fp);
+ }
+ exit(0);
+}
+ ],
+ [cf_cv_shift_limit=`cat cf_test.out`],
+ [cf_cv_shift_limit=32],
+ [cf_cv_shift_limit=32])
+ rm -f cf_test.out
+ ])
+AC_MSG_RESULT($cf_cv_shift_limit)
+AC_SUBST(cf_cv_shift_limit)
+
+AC_MSG_CHECKING([for width of character-index])
+AC_CACHE_VAL(cf_cv_widec_shift,[
+if test ".$with_widec" = ".yes" ; then
+ cf_attrs_width=39
+ if ( expr $cf_cv_shift_limit \> $cf_attrs_width >/dev/null )
+ then
+ cf_cv_widec_shift=`expr 16 + $cf_cv_shift_limit - $cf_attrs_width`
+ else
+ cf_cv_widec_shift=16
+ fi
+else
+ cf_cv_widec_shift=8
+fi
+])
+AC_MSG_RESULT($cf_cv_widec_shift)
+AC_SUBST(cf_cv_widec_shift)
+])dnl
+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's 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
+CF_PATH_SYNTAX(withval)
+eval $3="$withval"
+AC_SUBST($3)dnl
+])dnl
+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's an expression & cannot be in the help-message
+dnl
+AC_DEFUN([CF_WITH_PATHLIST],[
+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="${IFS}:"
+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}:"
+ cf_dst_path="${cf_dst_path}${cf_src_path}"
+done
+IFS="$ac_save_ifs"
+
+eval $3="$cf_dst_path"
+AC_SUBST($3)dnl
+])dnl
diff --git a/contrib/ncurses/announce.html b/contrib/ncurses/announce.html
new file mode 100644
index 000000000000..aa05b002d32c
--- /dev/null
+++ b/contrib/ncurses/announce.html
@@ -0,0 +1,387 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<!--
+ $Id: announce.html,v 1.30 1999/05/16 17:01:39 juergen Exp $
+-->
+<HTML>
+<HEAD>
+<TITLE>Announcing ncurses 5.0</TITLE>
+<link rev=made href="mailto:bug-ncurses@gnu.org">
+</HEAD>
+<BODY>
+
+<H1>Announcing ncurses 5.0</H1>
+
+The ncurses (new curses) library is a free software emulation of
+curses in System V Release 4.0, 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 SYSV-curses enhancements over BSD curses.<P>
+
+In mid-June 1995, the maintainer of 4.4BSD curses declared that he
+considered 4.4BSD curses obsolete, and is encouraging the keepers of
+Unix releases such as BSD/OS, freeBSD and netBSD to switch over to
+ncurses.<P>
+
+The ncurses code was developed under GNU/Linux. It should port easily to
+any ANSI/POSIX-conforming UNIX. It has even been ported to OS/2 Warp!<P>
+
+The distribution includes the library and support utilities, including a
+terminfo compiler tic(1), a decompiler infocmp(1), clear(1), tput(1), tset(1),
+and a termcap conversion tool captoinfo(1). Full manual pages are provided for
+the library and tools.<P>
+
+The ncurses distribution is available via anonymous FTP at
+the GNU distribution site
+<A HREF="ftp://ftp.gnu.org/pub/gnu">ftp://ftp.gnu.org/pub/gnu</A>.
+It is also available at
+<A HREF="ftp://ftp.clark.net/pub/dickey/ncurses">ftp://ftp.clark.net/pub/dickey/ncurses</A>.
+
+<H1>Release Notes</H1>
+
+We decided to release ncurses as a new whole number release (5.0) because it
+incorporates several interface changes, including some that would invalidate
+existing shared libraries. These are the highlights from the change-log
+since ncurses 4.2 release.
+<p>
+Interface changes:
+<ul>
+ <li>The principal source of changes to the interface comes from the
+ release of X/Open Curses in 1997. Earlier versions of ncurses (4.0
+ and before) were based on a draft version of the specification. The
+ release version adds parameters to some functions to support the
+ evolving internationalization of curses. These summarize the impact:
+<ul>
+ <li>modified several prototypes to correspond with 1997 version of
+ X/Open Curses (affects ABI since developers have used attr_get).
+
+ <li>corrected prototypes for slk_* functions, using chtype rather than
+ attr_t.
+
+ <li>the slk_attr_{set,off,on} functions need an additional void*
+ parameter according to XSI.
+
+ <li>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.
+
+ <li>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.
+
+ <li>reviewed/corrected macros in curses.h as per XSI document.
+
+ <li>add set_a_attributes and set_pglen_inch to terminfo structure, as per
+ XSI and Solaris 2.5.
+</ul>
+ <li>The newest version of the X/Open Curses is implemented on Solaris
+ and other vendor's systems. It adds new features to the terminfo
+ descriptions:
+<ul>
+ <li>implement tparm %l format.
+
+ <li>implement tparm printf-style width and precision for %s, %d, %x, %o
+ as per XSI.
+</ul>
+ <li>We made additional changes to reduce impact by future interface
+ changes:
+<ul>
+ <li>change key_names[] array to static since it is not part of the curses
+ interface.
+
+ <li>move macro winch to a function, to hide details of struct ldat
+</ul>
+ <li>modify configure script to embed ABI in shared libraries for HP-UX
+ 10.x (detailed request by Tim Mooney).
+
+ <li>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).
+</ul>
+New features:
+<ul>
+ <li>enable sigwinch handler by default.
+
+ <li>turn on hashmap scrolling code by default
+
+ <li>improved support for termcap applications
+<ul>
+ <li>modify tput to accept termcap names as an alternative to terminfo
+ names.
+
+ <li>provide support for termcap PC variable by copying it from terminfo
+ data and using it as the padding character in tputs.
+
+ <li>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.
+
+ <li>change name-comparisons in lib_termcap to compare no more than 2
+ characters.
+
+ <li>add configure option --enable-tcap-names, which essentially
+ allows users to define new capabilities as in termcap.
+</ul>
+ <li>add mouse support to ncurses menus.
+
+ <li>add mouse and dll support for OS/2 EMX
+
+ <li>modify terminfo parsing to accept octal and hexadecimal constants
+
+ <li>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.
+
+ <li>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.
+
+ <li>add -f option to infocmp and tic, which formats the terminfo
+ if/then/else/endif so that they are readable (with newlines and
+ tabs).
+
+ <li>modify tic to compile into %'char' form in preference to %{number},
+ since that is a little more efficient.
+</ul>
+Major bug fixes:
+<ul>
+ <li>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.
+
+ <li>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.
+
+ <li>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.
+
+ <li>modify setupterm so that cancelled strings are treated the same as
+ absent strings, cancelled and absent booleans false (does not affect
+ tic, infocmp).
+
+ <li>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.
+
+ <li>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.
+
+ <li>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.
+</ul>
+
+<H1>Features of Ncurses</H1>
+
+The ncurses package is fully compatible with SVr4 (System V Release 4) curses:<P>
+
+<UL>
+<LI>All 257 of the SVr4 calls have been implemented (and are documented).
+<LI>Full support for SVr4 curses features including keyboard mapping, color,
+forms-drawing with ACS characters, and automatic recognition of keypad
+and function keys.
+<LI>An emulation of the SVr4 panels library, supporting
+a stack of windows with backing store, is included.
+<LI>An emulation of the SVr4 menus library, supporting
+a uniform but flexible interface for menu programming, is included.
+<LI>An emulation of the SVr4 form library, supporting
+data collection through on-screen forms, is included.
+<LI>Binary terminfo entries generated by the ncurses tic(1) implementation
+are bit-for-bit-compatible with the entry format SVr4 curses uses.
+<LI>The utilities have options to allow you to filter terminfo
+entries for use with less capable <STRONG>curses</STRONG>/<STRONG>terminfo</STRONG>
+versions such as the HP/UX and AIX ports.</UL>
+
+The ncurses package also has many useful extensions over SVr4:<P>
+
+<UL>
+<LI>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,
+but not all EXTENDED features). Most EXTENDED-level features not directly
+concerned with wide-character support are implemented, including many
+function calls not supported under SVr4 curses (but portability of all
+calls is documented so you can use the SVr4 subset only).
+<LI>Unlike SVr4 curses, ncurses can write to the rightmost-bottommost corner
+of the screen if your terminal has an insert-character capability.
+<LI>Ada95 and C++ bindings.
+<LI>Support for mouse event reporting with X Window xterm and OS/2 console windows.
+<LI>Extended mouse support via Alessandro Rubini's gpm package.
+<LI>The function <CODE>wresize()</CODE> allows you to resize windows, preserving
+their data.
+<LI>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.
+<LI>The functions <CODE>keyok()</CODE>
+and <CODE>define_key()</CODE> 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.
+<LI>Support for 16-color terminals, such as aixterm and XFree86 xterm.
+<LI>Better cursor-movement optimization. The package now features a
+cursor-local-movement computation more efficient than either BSD's
+or System V's.
+<LI>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.
+<LI>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.
+<LI>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).
+<LI>The tic(1)/captoinfo utility provided with ncurses has the
+ability to translate many termcaps from the XENIX, IBM and
+AT&amp;T extension sets.
+<LI>A BSD-like tset(1) utility is provided.
+<LI>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.
+<LI>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.)
+<LI>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.
+<LI>A script (<STRONG>capconvert</STRONG>) is provided to help BSD users
+transition from termcap to terminfo. It gathers the information in a
+TERMCAP environment variable and/or a ~/.termcap local entries file
+and converts it to an equivalent local terminfo tree under $HOME/.terminfo.
+<LI>Automatic fallback to the /etc/termcap file can be compiled in
+when it is not possible to build a terminfo tree. This feature is neither
+fast nor cheap, you don't want to use it unless you have to,
+but it's there.
+<LI>The table-of-entries utility <STRONG>toe</STRONG> makes it easy for users to
+see exactly what terminal types are available on the system.
+<LI>The library 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>.
+<LI>An HTML "Introduction to Programming with NCURSES" document provides
+a narrative introduction to the curses programming interface.
+</UL>
+
+<H1>State of the Package</H1>
+
+Numerous bugs present in earlier versions have been fixed; the
+library is far more reliable than it used to be. Bounds checking in many
+`dangerous' entry points has been improved. The code is now type-safe
+according to gcc -Wall. The library has been checked for malloc leaks and
+arena corruption by the Purify memory-allocation tester.<P>
+
+The ncurses code has been tested with a wide variety of applications
+including (versions starting with those noted):<P>
+<DL>
+<DT> ded
+<DD> directory-editor
+<A HREF="ftp://ftp.clark.net/pub/dickey/ded">ftp://ftp.clark.net/pub/dickey/ded</A>.
+<DT> dialog
+<DD> the underlying application used in Slackware's setup, and the basis
+for similar applications on GNU/Linux.
+<DT> lynx-2.7
+<DD> the character-screen WWW browser
+<DT> Midnight Commander 4.1
+<DD> file manager
+<DT> mutt 0.88
+<DD> mail utility
+<DT> ncftp 2.0
+<DD> file-transfer utility
+<DT> nvi
+<DD> New vi versions 1.50 are able to use ncurses versions 1.9.7 and later.
+<DT> taper
+<DD> tape archive utility
+<DT> vh-1.6
+<DD> Volks-Hypertext browser for the Jargon File
+</DL>
+as well as some that use ncurses for the terminfo support alone:
+<DL>
+<DT> minicom-1.75
+<DD> terminal emulator
+<DT> tin-unoff
+<DD> tin 1.4 newsreader, supporting color, MIME
+<A HREF="ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff">ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff</A>.
+<DT> vile
+<DD> vi-like-emacs
+<A HREF="ftp://ftp.clark.net/pub/dickey/vile">ftp://ftp.clark.net/pub/dickey/vile</A>.
+</DL>
+<P>
+
+The ncurses distribution includes a selection of test programs (including
+a few games).
+
+<H2>Who's Who and What's What</H2>
+
+The original developers of ncurses are <A
+HREF="mailto:zmbenhal@netcom.com">Zeyd Ben-Halim</A> and
+<A HREF="http://www.ccil.org/~esr/home.html">Eric S. Raymond</A>.
+Ongoing work is being done by
+<A HREF="mailto:dickey@clark.net">Thomas Dickey</A>
+and
+<A HREF="mailto:juergen.pfeifer@gmx.net">J&uuml;rgen Pfeifer</A>.
+<A HREF="mailto:florian@gnu.org">Florian La Roche</A>
+acts as the maintainer for the Free Software Foundation, which holds the
+copyright on ncurses.
+Contact the current maintainers at
+<A HREF="mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</A>.
+<P>
+
+To join the ncurses mailing list, please write email to
+<CODE>bug-ncurses-request@gnu.org</CODE> containing the line:
+<PRE>
+ subscribe &lt;name&gt;@&lt;host.domain&gt;
+</PRE>
+
+This list is open to anyone interested in helping with the development and
+testing of this package.<P>
+
+Beta versions of ncurses and patches to the current release are made available at
+<A HREF="ftp://ftp.clark.net/pub/dickey/ncurses">ftp://ftp.clark.net/pub/dickey/ncurses</A>.
+
+<H2>Future Plans</H2>
+<UL>
+<LI>Extended-level XPG4 conformance, with internationalization support.
+<LI>Ports to more systems, including DOS and Windows.
+</UL>
+We need people to help with these projects. If you are interested in working
+on them, please join the ncurses list.
+
+<H2>Other Related Resources</H2>
+
+The distribution includes and uses a version of the terminfo-format
+terminal description file maintained by Eric Raymond.
+<A HREF="http://earthspace.net/~esr/terminfo">http://earthspace.net/~esr/terminfo</A>.<P>
+
+You can find lots of information on terminal-related topics
+not covered in the terminfo file at
+<A HREF="http://www.cs.utk.edu/~shuford/terminal_index.html">Richard Shuford's
+archive</A>.
+</BODY>
+</HTML>
+<!--
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# mode:html
+# case-fold-search:nil
+# fill-column:70
+# End:
+-->
diff --git a/contrib/ncurses/announce.html.in b/contrib/ncurses/announce.html.in
new file mode 100644
index 000000000000..ca3773fa4e01
--- /dev/null
+++ b/contrib/ncurses/announce.html.in
@@ -0,0 +1,387 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<!--
+ $Id: announce.html.in,v 1.30 1999/05/16 17:01:39 juergen Exp $
+-->
+<HTML>
+<HEAD>
+<TITLE>Announcing ncurses @VERSION@</TITLE>
+<link rev=made href="mailto:bug-ncurses@gnu.org">
+</HEAD>
+<BODY>
+
+<H1>Announcing ncurses @VERSION@</H1>
+
+The ncurses (new curses) library is a free software emulation of
+curses in System V Release 4.0, 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 SYSV-curses enhancements over BSD curses.<P>
+
+In mid-June 1995, the maintainer of 4.4BSD curses declared that he
+considered 4.4BSD curses obsolete, and is encouraging the keepers of
+Unix releases such as BSD/OS, freeBSD and netBSD to switch over to
+ncurses.<P>
+
+The ncurses code was developed under GNU/Linux. It should port easily to
+any ANSI/POSIX-conforming UNIX. It has even been ported to OS/2 Warp!<P>
+
+The distribution includes the library and support utilities, including a
+terminfo compiler tic(1), a decompiler infocmp(1), clear(1), tput(1), tset(1),
+and a termcap conversion tool captoinfo(1). Full manual pages are provided for
+the library and tools.<P>
+
+The ncurses distribution is available via anonymous FTP at
+the GNU distribution site
+<A HREF="ftp://ftp.gnu.org/pub/gnu">ftp://ftp.gnu.org/pub/gnu</A>.
+It is also available at
+<A HREF="ftp://ftp.clark.net/pub/dickey/ncurses">ftp://ftp.clark.net/pub/dickey/ncurses</A>.
+
+<H1>Release Notes</H1>
+
+We decided to release ncurses as a new whole number release (5.0) because it
+incorporates several interface changes, including some that would invalidate
+existing shared libraries. These are the highlights from the change-log
+since ncurses 4.2 release.
+<p>
+Interface changes:
+<ul>
+ <li>The principal source of changes to the interface comes from the
+ release of X/Open Curses in 1997. Earlier versions of ncurses (4.0
+ and before) were based on a draft version of the specification. The
+ release version adds parameters to some functions to support the
+ evolving internationalization of curses. These summarize the impact:
+<ul>
+ <li>modified several prototypes to correspond with 1997 version of
+ X/Open Curses (affects ABI since developers have used attr_get).
+
+ <li>corrected prototypes for slk_* functions, using chtype rather than
+ attr_t.
+
+ <li>the slk_attr_{set,off,on} functions need an additional void*
+ parameter according to XSI.
+
+ <li>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.
+
+ <li>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.
+
+ <li>reviewed/corrected macros in curses.h as per XSI document.
+
+ <li>add set_a_attributes and set_pglen_inch to terminfo structure, as per
+ XSI and Solaris 2.5.
+</ul>
+ <li>The newest version of the X/Open Curses is implemented on Solaris
+ and other vendor's systems. It adds new features to the terminfo
+ descriptions:
+<ul>
+ <li>implement tparm %l format.
+
+ <li>implement tparm printf-style width and precision for %s, %d, %x, %o
+ as per XSI.
+</ul>
+ <li>We made additional changes to reduce impact by future interface
+ changes:
+<ul>
+ <li>change key_names[] array to static since it is not part of the curses
+ interface.
+
+ <li>move macro winch to a function, to hide details of struct ldat
+</ul>
+ <li>modify configure script to embed ABI in shared libraries for HP-UX
+ 10.x (detailed request by Tim Mooney).
+
+ <li>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).
+</ul>
+New features:
+<ul>
+ <li>enable sigwinch handler by default.
+
+ <li>turn on hashmap scrolling code by default
+
+ <li>improved support for termcap applications
+<ul>
+ <li>modify tput to accept termcap names as an alternative to terminfo
+ names.
+
+ <li>provide support for termcap PC variable by copying it from terminfo
+ data and using it as the padding character in tputs.
+
+ <li>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.
+
+ <li>change name-comparisons in lib_termcap to compare no more than 2
+ characters.
+
+ <li>add configure option --enable-tcap-names, which essentially
+ allows users to define new capabilities as in termcap.
+</ul>
+ <li>add mouse support to ncurses menus.
+
+ <li>add mouse and dll support for OS/2 EMX
+
+ <li>modify terminfo parsing to accept octal and hexadecimal constants
+
+ <li>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.
+
+ <li>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.
+
+ <li>add -f option to infocmp and tic, which formats the terminfo
+ if/then/else/endif so that they are readable (with newlines and
+ tabs).
+
+ <li>modify tic to compile into %'char' form in preference to %{number},
+ since that is a little more efficient.
+</ul>
+Major bug fixes:
+<ul>
+ <li>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.
+
+ <li>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.
+
+ <li>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.
+
+ <li>modify setupterm so that cancelled strings are treated the same as
+ absent strings, cancelled and absent booleans false (does not affect
+ tic, infocmp).
+
+ <li>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.
+
+ <li>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.
+
+ <li>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.
+</ul>
+
+<H1>Features of Ncurses</H1>
+
+The ncurses package is fully compatible with SVr4 (System V Release 4) curses:<P>
+
+<UL>
+<LI>All 257 of the SVr4 calls have been implemented (and are documented).
+<LI>Full support for SVr4 curses features including keyboard mapping, color,
+forms-drawing with ACS characters, and automatic recognition of keypad
+and function keys.
+<LI>An emulation of the SVr4 panels library, supporting
+a stack of windows with backing store, is included.
+<LI>An emulation of the SVr4 menus library, supporting
+a uniform but flexible interface for menu programming, is included.
+<LI>An emulation of the SVr4 form library, supporting
+data collection through on-screen forms, is included.
+<LI>Binary terminfo entries generated by the ncurses tic(1) implementation
+are bit-for-bit-compatible with the entry format SVr4 curses uses.
+<LI>The utilities have options to allow you to filter terminfo
+entries for use with less capable <STRONG>curses</STRONG>/<STRONG>terminfo</STRONG>
+versions such as the HP/UX and AIX ports.</UL>
+
+The ncurses package also has many useful extensions over SVr4:<P>
+
+<UL>
+<LI>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,
+but not all EXTENDED features). Most EXTENDED-level features not directly
+concerned with wide-character support are implemented, including many
+function calls not supported under SVr4 curses (but portability of all
+calls is documented so you can use the SVr4 subset only).
+<LI>Unlike SVr4 curses, ncurses can write to the rightmost-bottommost corner
+of the screen if your terminal has an insert-character capability.
+<LI>Ada95 and C++ bindings.
+<LI>Support for mouse event reporting with X Window xterm and OS/2 console windows.
+<LI>Extended mouse support via Alessandro Rubini's gpm package.
+<LI>The function <CODE>wresize()</CODE> allows you to resize windows, preserving
+their data.
+<LI>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.
+<LI>The functions <CODE>keyok()</CODE>
+and <CODE>define_key()</CODE> 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.
+<LI>Support for 16-color terminals, such as aixterm and XFree86 xterm.
+<LI>Better cursor-movement optimization. The package now features a
+cursor-local-movement computation more efficient than either BSD's
+or System V's.
+<LI>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.
+<LI>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.
+<LI>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).
+<LI>The tic(1)/captoinfo utility provided with ncurses has the
+ability to translate many termcaps from the XENIX, IBM and
+AT&amp;T extension sets.
+<LI>A BSD-like tset(1) utility is provided.
+<LI>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.
+<LI>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.)
+<LI>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.
+<LI>A script (<STRONG>capconvert</STRONG>) is provided to help BSD users
+transition from termcap to terminfo. It gathers the information in a
+TERMCAP environment variable and/or a ~/.termcap local entries file
+and converts it to an equivalent local terminfo tree under $HOME/.terminfo.
+<LI>Automatic fallback to the /etc/termcap file can be compiled in
+when it is not possible to build a terminfo tree. This feature is neither
+fast nor cheap, you don't want to use it unless you have to,
+but it's there.
+<LI>The table-of-entries utility <STRONG>toe</STRONG> makes it easy for users to
+see exactly what terminal types are available on the system.
+<LI>The library 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>.
+<LI>An HTML "Introduction to Programming with NCURSES" document provides
+a narrative introduction to the curses programming interface.
+</UL>
+
+<H1>State of the Package</H1>
+
+Numerous bugs present in earlier versions have been fixed; the
+library is far more reliable than it used to be. Bounds checking in many
+`dangerous' entry points has been improved. The code is now type-safe
+according to gcc -Wall. The library has been checked for malloc leaks and
+arena corruption by the Purify memory-allocation tester.<P>
+
+The ncurses code has been tested with a wide variety of applications
+including (versions starting with those noted):<P>
+<DL>
+<DT> ded
+<DD> directory-editor
+<A HREF="ftp://ftp.clark.net/pub/dickey/ded">ftp://ftp.clark.net/pub/dickey/ded</A>.
+<DT> dialog
+<DD> the underlying application used in Slackware's setup, and the basis
+for similar applications on GNU/Linux.
+<DT> lynx-2.7
+<DD> the character-screen WWW browser
+<DT> Midnight Commander 4.1
+<DD> file manager
+<DT> mutt 0.88
+<DD> mail utility
+<DT> ncftp 2.0
+<DD> file-transfer utility
+<DT> nvi
+<DD> New vi versions 1.50 are able to use ncurses versions 1.9.7 and later.
+<DT> taper
+<DD> tape archive utility
+<DT> vh-1.6
+<DD> Volks-Hypertext browser for the Jargon File
+</DL>
+as well as some that use ncurses for the terminfo support alone:
+<DL>
+<DT> minicom-1.75
+<DD> terminal emulator
+<DT> tin-unoff
+<DD> tin 1.4 newsreader, supporting color, MIME
+<A HREF="ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff">ftp://ftp.akk.uni-karlsruhe.de/pub/news/clients/tin-unoff</A>.
+<DT> vile
+<DD> vi-like-emacs
+<A HREF="ftp://ftp.clark.net/pub/dickey/vile">ftp://ftp.clark.net/pub/dickey/vile</A>.
+</DL>
+<P>
+
+The ncurses distribution includes a selection of test programs (including
+a few games).
+
+<H2>Who's Who and What's What</H2>
+
+The original developers of ncurses are <A
+HREF="mailto:zmbenhal@netcom.com">Zeyd Ben-Halim</A> and
+<A HREF="http://www.ccil.org/~esr/home.html">Eric S. Raymond</A>.
+Ongoing work is being done by
+<A HREF="mailto:dickey@clark.net">Thomas Dickey</A>
+and
+<A HREF="mailto:juergen.pfeifer@gmx.net">J&uuml;rgen Pfeifer</A>.
+<A HREF="mailto:florian@gnu.org">Florian La Roche</A>
+acts as the maintainer for the Free Software Foundation, which holds the
+copyright on ncurses.
+Contact the current maintainers at
+<A HREF="mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</A>.
+<P>
+
+To join the ncurses mailing list, please write email to
+<CODE>bug-ncurses-request@gnu.org</CODE> containing the line:
+<PRE>
+ subscribe &lt;name&gt;@&lt;host.domain&gt;
+</PRE>
+
+This list is open to anyone interested in helping with the development and
+testing of this package.<P>
+
+Beta versions of ncurses and patches to the current release are made available at
+<A HREF="ftp://ftp.clark.net/pub/dickey/ncurses">ftp://ftp.clark.net/pub/dickey/ncurses</A>.
+
+<H2>Future Plans</H2>
+<UL>
+<LI>Extended-level XPG4 conformance, with internationalization support.
+<LI>Ports to more systems, including DOS and Windows.
+</UL>
+We need people to help with these projects. If you are interested in working
+on them, please join the ncurses list.
+
+<H2>Other Related Resources</H2>
+
+The distribution includes and uses a version of the terminfo-format
+terminal description file maintained by Eric Raymond.
+<A HREF="http://earthspace.net/~esr/terminfo">http://earthspace.net/~esr/terminfo</A>.<P>
+
+You can find lots of information on terminal-related topics
+not covered in the terminfo file at
+<A HREF="http://www.cs.utk.edu/~shuford/terminal_index.html">Richard Shuford's
+archive</A>.
+</BODY>
+</HTML>
+<!--
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# mode:html
+# case-fold-search:nil
+# fill-column:70
+# End:
+-->
diff --git a/contrib/ncurses/c++/Makefile.in b/contrib/ncurses/c++/Makefile.in
new file mode 100644
index 000000000000..38c5bd864323
--- /dev/null
+++ b/contrib/ncurses/c++/Makefile.in
@@ -0,0 +1,185 @@
+# $Id: Makefile.in,v 1.48 1999/07/31 09:47:11 juergen Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# Simple makefile for c++ window class demo
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL = /bin/sh
+
+MODEL = ../@DFT_OBJ_SUBDIR@
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+AR = @AR@
+AR_OPTS = @AR_OPTS@
+RANLIB = @RANLIB@
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+CXXLIBS = @CXXLIBS@
+
+INCDIR = ../include
+CPPFLAGS = -I../c++ -I$(INCDIR) -I$(srcdir) -DHAVE_CONFIG_H @CPPFLAGS@
+
+CCFLAGS = $(CPPFLAGS) $(CXXFLAGS)
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CXX_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -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@
+
+LINK = @LINK_PROGS@ $(CXX)
+
+LIBROOT = ncurses++
+LIBNAME = lib$(LIBROOT).a
+
+LDFLAGS = @EXTRA_LDFLAGS@ -L../lib -L$(libdir) \
+ -l$(LIBROOT) \
+ @TEST_ARGS@ @LDFLAGS@ \
+ @LD_MODEL@ @LIBS@ @EXTRA_LIBS@ @LOCAL_LDFLAGS@ $(CXXLIBS)
+
+LDFLAGS_NORMAL = $(LDFLAGS)
+LDFLAGS_DEBUG = $(LDFLAGS) @CC_G_OPT@
+LDFLAGS_PROFILE = $(LDFLAGS) -pg
+LDFLAGS_SHARED = $(LDFLAGS) @LD_SHARED_OPTS@
+
+LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@)
+
+AUTO_SRC = \
+ etip.h
+
+all: $(AUTO_SRC) ../lib/$(LIBNAME) demo
+
+sources : $(AUTO_SRC)
+
+# Build a conventional library for installing, since a shared library would
+# pull in all of the ncurses libraries (panel, menu, form, ncurses) as direct
+# dependencies.
+LIB_OBJS = \
+ $(MODEL)/cursesf.o \
+ $(MODEL)/cursesm.o \
+ $(MODEL)/cursesw.o \
+ $(MODEL)/cursespad.o \
+ $(MODEL)/cursesp.o \
+ $(MODEL)/cursslk.o \
+ $(MODEL)/cursesapp.o \
+ $(MODEL)/cursesmain.o
+
+../lib/$(LIBNAME) : $(LIB_OBJS)
+ $(AR) $(AR_OPTS) $@ $?
+ $(RANLIB) $@
+
+OBJS_DEMO = $(MODEL)/demo.o
+
+$(MODEL)/demo.o : $(srcdir)/demo.cc \
+ $(cursesf_h) $(cursesm_h) $(cursesapp_h)
+
+demo: $(OBJS_DEMO) \
+ ../lib/$(LIBNAME) \
+ @TEST_DEPS@
+ @ECHO_LINK@ $(LINK) -o $@ $(OBJS_DEMO) $(LDFLAGS_DEFAULT)
+
+etip.h: $(srcdir)/etip.h.in $(srcdir)/edit_cfg.sh
+ cp $(srcdir)/etip.h.in $@
+ sh $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@
+
+$(INSTALL_PREFIX)$(libdir) :
+ $(srcdir)/../mkinstalldirs $@
+
+install \
+install.libs:: ../lib/$(LIBNAME) $(INSTALL_PREFIX)$(libdir)
+ $(INSTALL) ../lib/$(LIBNAME) $(INSTALL_PREFIX)$(libdir)/$(LIBNAME)
+
+uninstall \
+uninstall.libs::
+ -rm -f $(INSTALL_PREFIX)$(libdir)/$(LIBNAME)
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+
+clean :: mostlyclean
+ -rm -f demo $(AUTO_SRC) ../lib/$(LIBNAME) $(LIB_OBJS) $(OBJS_DEMO)
+
+distclean :: clean
+ -rm -f Makefile
+
+realclean :: distclean
+
+###############################################################################
+
+cursesw_h = $(srcdir)/cursesw.h \
+ etip.h \
+ $(INCDIR)/curses.h
+
+cursesp_h = $(srcdir)/cursesp.h \
+ $(cursesw_h) \
+ $(INCDIR)/panel.h
+
+cursesf_h = $(srcdir)/cursesf.h \
+ $(cursesp_h) \
+ $(INCDIR)/form.h
+
+cursesm_h = $(srcdir)/cursesm.h \
+ $(cursesp_h) \
+ $(INCDIR)/menu.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) $@
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/contrib/ncurses/c++/NEWS b/contrib/ncurses/c++/NEWS
new file mode 100644
index 000000000000..299292d18a7e
--- /dev/null
+++ b/contrib/ncurses/c++/NEWS
@@ -0,0 +1,42 @@
+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/contrib/ncurses/c++/PROBLEMS b/contrib/ncurses/c++/PROBLEMS
new file mode 100644
index 000000000000..81c1ebaf8946
--- /dev/null
+++ b/contrib/ncurses/c++/PROBLEMS
@@ -0,0 +1,5 @@
+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/contrib/ncurses/c++/README-first b/contrib/ncurses/c++/README-first
new file mode 100644
index 000000000000..eb37ac670247
--- /dev/null
+++ b/contrib/ncurses/c++/README-first
@@ -0,0 +1,58 @@
+ 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 is derived
+from the libg++ CursesWindow class but enhanced 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. E.g. you don't 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.
+
+ ATTENTION LINUX USERS: There is currently some discussion of
+ replacing the BSD curses in the Linux libc with ncurses. If
+ this is done we could perhaps include these classes in the Linux
+ libg++ replacing the original CursesWindow class (and renaming it
+ to CursesWindow). This could be done because NCursesWindow can
+ be made easily to a superset of the CursesWindow class.
+
+
+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>
+
+Author of this release:
+ Juergen Pfeifer <juergen.pfeifer@gmx.net>
diff --git a/contrib/ncurses/c++/cursesapp.cc b/contrib/ncurses/c++/cursesapp.cc
new file mode 100644
index 000000000000..ae88b44e0a4c
--- /dev/null
+++ b/contrib/ncurses/c++/cursesapp.cc
@@ -0,0 +1,146 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+#include "cursesapp.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursesapp.cc,v 1.4 1999/05/16 17:31:11 juergen 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;
+
+NCursesApplication::~NCursesApplication() {
+ Soft_Label_Key_Set* S;
+
+ delete titleWindow;
+ while( (S=top()) ) {
+ pop();
+ delete S;
+ }
+ delete Root_Window;
+ ::endwin();
+}
+
+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);
+ 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 && top())
+ top()->show();
+ }
+ return (slk_stack ? FALSE : TRUE);
+}
+
+Soft_Label_Key_Set* NCursesApplication::top() const {
+ if (slk_stack)
+ return slk_stack->SLKs;
+ else
+ return (Soft_Label_Key_Set*)0;
+}
+
+int NCursesApplication::operator()(void) {
+ bool bColors = b_Colors;
+ Soft_Label_Key_Set* S;
+
+ 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);
+ 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;
+ if (theApp)
+ THROW(new NCursesException("Application object already created."));
+ else
+ theApp = this;
+}
diff --git a/contrib/ncurses/c++/cursesapp.h b/contrib/ncurses/c++/cursesapp.h
new file mode 100644
index 000000000000..f13fd1bdb457
--- /dev/null
+++ b/contrib/ncurses/c++/cursesapp.h
@@ -0,0 +1,163 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+// $Id: cursesapp.h,v 1.5 1999/05/16 17:29:59 juergen Exp $
+
+#ifndef _CURSESAPP_H
+#define _CURSESAPP_H
+
+#include <cursslk.h>
+
+class 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 {
+ }
+
+ // 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);
+
+public:
+ virtual ~NCursesApplication();
+
+ // Get a pointer to the current application object
+ static NCursesApplication* getApplication() {
+ return theApp;
+ }
+
+ // 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[]) {
+ }
+
+ // 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 ? COLOR_PAIR(1) : A_BOLD;
+ }
+
+ // Attributes to use for menu and forms backgrounds
+ virtual chtype backgrounds() const {
+ return b_Colors ? COLOR_PAIR(2) : A_NORMAL;
+ }
+
+ // Attributes to use for inactive (menu) elements
+ virtual chtype inactives() const {
+ return b_Colors ? (COLOR_PAIR(3)|A_DIM) : A_DIM;
+ }
+
+ // Attributes to use for (form) labels and SLKs
+ virtual chtype labels() const {
+ return b_Colors ? COLOR_PAIR(4) : A_NORMAL;
+ }
+
+ // Attributes to use for form backgrounds
+ virtual chtype dialog_backgrounds() const {
+ return b_Colors ? COLOR_PAIR(4) : A_NORMAL;
+ }
+
+ // Attributes to use as default for (form) window backgrounds
+ virtual chtype window_backgrounds() const {
+ return b_Colors ? COLOR_PAIR(5) : A_NORMAL;
+ }
+
+ // Attributes to use for the title window
+ virtual chtype screen_titles() const {
+ return b_Colors ? COLOR_PAIR(6) : A_BOLD;
+ }
+
+};
+
+#endif // _CURSESAPP_H
diff --git a/contrib/ncurses/c++/cursesf.cc b/contrib/ncurses/c++/cursesf.cc
new file mode 100644
index 000000000000..12b9cd4fcce2
--- /dev/null
+++ b/contrib/ncurses/c++/cursesf.cc
@@ -0,0 +1,423 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+#include "cursesf.h"
+#include "cursesapp.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursesf.cc,v 1.9 1999/05/16 17:29:36 juergen Exp $")
+
+NCursesFormField::~NCursesFormField () {
+ 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;
+
+ assert(nfields);
+
+ 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)
+ delete[] ::form_fields(form);
+ 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 = (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,(void*)hook);
+
+ ::set_form_init (form, NCursesForm::frm_init);
+ ::set_form_term (form, NCursesForm::frm_term);
+ ::set_field_init (form, NCursesForm::fld_init);
+ ::set_field_term (form, NCursesForm::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 = (NCursesWindow*)0;
+ b_sub_owner = FALSE;
+ }
+ options_on(O_NL_OVERLOAD);
+ setDefaultAttributes();
+}
+
+NCursesForm::~NCursesForm() {
+ UserHook* hook = (UserHook*)::form_userptr(form);
+ delete hook;
+ if (b_sub_owner) {
+ delete sub;
+ ::set_form_sub(form,(WINDOW *)0);
+ }
+ if (form) {
+ FIELD** fields = ::form_fields(form);
+ int cnt = count();
+
+ OnError(::set_form_fields(form,(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
+NCursesForm::frm_init(FORM *f) {
+ getHook(f)->On_Form_Init();
+}
+
+void
+NCursesForm::frm_term(FORM *f) {
+ getHook(f)->On_Form_Termination();
+}
+
+void
+NCursesForm::fld_init(FORM *f) {
+ NCursesForm* F = getHook(f);
+ F->On_Field_Init (*(F->current_field ()));
+}
+
+void
+NCursesForm::fld_term(FORM *f) {
+ NCursesForm* F = 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
+NCursesForm::On_Field_Termination(NCursesFormField& 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 {
+ beep();
+}
+
+void NCursesForm::On_Invalid_Field(int c) const {
+ beep();
+}
+
+void NCursesForm::On_Unknown_Command(int c) const {
+ beep();
+}
+
+static const int CMD_QUIT = MAX_COMMAND + 1;
+
+NCursesFormField*
+NCursesForm::operator()(void) {
+ int drvCmnd;
+ int err;
+ int c;
+
+ post();
+ show();
+ refresh();
+
+ while (((drvCmnd = virtualize((c=getch()))) != CMD_QUIT)) {
+ 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 UserDefinedFieldType::fcheck(FIELD *f, const void *u) {
+ NCursesFormField* F = (NCursesFormField*)u;
+ assert(F);
+ UserDefinedFieldType* udf = (UserDefinedFieldType*)(F->fieldtype());
+ assert(udf);
+ return udf->field_check(*F);
+}
+
+bool UserDefinedFieldType::ccheck(int c, const void *u) {
+ NCursesFormField* F = (NCursesFormField*)u;
+ assert(F);
+ UserDefinedFieldType* udf =
+ (UserDefinedFieldType*)(F->fieldtype());
+ assert(udf);
+ return udf->char_check(c);
+}
+
+void* UserDefinedFieldType::makearg(va_list* va) {
+ return va_arg(*va,NCursesFormField*);
+}
+
+FIELDTYPE* UserDefinedFieldType::generic_fieldtype =
+ ::new_fieldtype(UserDefinedFieldType::fcheck,
+ UserDefinedFieldType::ccheck);
+
+FIELDTYPE* UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice =
+ ::new_fieldtype(UserDefinedFieldType::fcheck,
+ UserDefinedFieldType::ccheck);
+
+bool UserDefinedFieldType_With_Choice::next_choice(FIELD *f, const void *u) {
+ NCursesFormField* F = (NCursesFormField*)u;
+ assert(F);
+ UserDefinedFieldType_With_Choice* udf =
+ (UserDefinedFieldType_With_Choice*)(F->fieldtype());
+ assert(udf);
+ return udf->next(*F);
+}
+
+bool UserDefinedFieldType_With_Choice::prev_choice(FIELD *f, const void *u) {
+ NCursesFormField* F = (NCursesFormField*)u;
+ assert(F);
+ UserDefinedFieldType_With_Choice* udf =
+ (UserDefinedFieldType_With_Choice*)(F->fieldtype());
+ assert(udf);
+ return udf->previous(*F);
+}
+
+class UDF_Init {
+private:
+ int code;
+ static UDF_Init* I;
+public:
+ UDF_Init() {
+ code = ::set_fieldtype_arg(UserDefinedFieldType::generic_fieldtype,
+ UserDefinedFieldType::makearg,
+ NULL,
+ NULL);
+ if (code==E_OK)
+ code = ::set_fieldtype_arg
+ (UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice,
+ UserDefinedFieldType::makearg,
+ NULL,
+ NULL);
+ if (code==E_OK)
+ code = ::set_fieldtype_choice
+ (UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice,
+ UserDefinedFieldType_With_Choice::next_choice,
+ UserDefinedFieldType_With_Choice::prev_choice);
+ }
+};
+
+UDF_Init* UDF_Init::I = new UDF_Init();
+
diff --git a/contrib/ncurses/c++/cursesf.h b/contrib/ncurses/c++/cursesf.h
new file mode 100644
index 000000000000..1119f5cbc70a
--- /dev/null
+++ b/contrib/ncurses/c++/cursesf.h
@@ -0,0 +1,823 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+// $Id: cursesf.h,v 1.10 1999/05/16 17:31:42 juergen Exp $
+
+#ifndef _CURSESF_H
+#define _CURSESF_H
+
+#include <cursesp.h>
+
+extern "C" {
+# include <form.h>
+}
+//
+// -------------------------------------------------------------------------
+// The abstract base class for buitin and user defined Fieldtypes.
+// -------------------------------------------------------------------------
+//
+class NCursesFormField; // forward declaration
+
+// Class to represent builtin field types as well as C++ written new
+// fieldtypes (see classes UserDefineFieldType...
+class NCursesFieldType {
+ friend class NCursesFormField;
+
+protected:
+ FIELDTYPE* fieldtype;
+
+ inline void OnError(int err) const THROWS(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((FIELDTYPE*)0) {
+ }
+};
+
+//
+// -------------------------------------------------------------------------
+// The class representing a forms field, wrapping the lowlevel FIELD struct
+// -------------------------------------------------------------------------
+//
+class NCursesFormField {
+ friend class NCursesForm;
+
+protected:
+ FIELD *field; // lowlevel structure
+ NCursesFieldType* ftype; // Associated field type
+
+ // Error handler
+ inline void OnError (int err) const THROWS(NCursesFormException) {
+ if (err != E_OK)
+ THROW(new NCursesFormException (err));
+ }
+
+public:
+ // Create a 'Null' field. Can be used to delimit a field list
+ NCursesFormField()
+ : field((FIELD*)0), ftype((NCursesFieldType*)0) {
+ }
+
+ // Create a new field
+ NCursesFormField (int rows,
+ int cols,
+ int first_row = 0,
+ int first_col = 0,
+ int offscreen_rows = 0,
+ int additional_buffers = 0)
+ : ftype((NCursesFieldType*)0) {
+ field = ::new_field(rows,cols,first_row,first_col,
+ offscreen_rows, additional_buffers);
+ if (!field)
+ OnError(errno);
+ }
+
+ virtual ~NCursesFormField ();
+
+ // 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& cols,
+ int& first_row, int& first_col,
+ int& offscreen_rows, int& additional_buffers) const {
+ OnError(::field_info(field, &rows, &cols,
+ &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 fore) {
+ OnError(::set_field_fore(field,fore));
+ }
+
+ // 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 back) {
+ OnError(::set_field_back(field,back));
+ }
+
+ // 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 pad) {
+ OnError(::set_field_pad(field,pad));
+ }
+
+ // Retrieve the fields padding character
+ inline int pad() const {
+ return ::field_pad(field);
+ }
+
+ // Switch on the fields options
+ inline void options_on (Field_Options options) {
+ OnError (::field_opts_on (field, options));
+ }
+
+ // Switch off the fields options
+ inline void options_off (Field_Options options) {
+ OnError (::field_opts_off (field, options));
+ }
+
+ // Retrieve the fields options
+ inline Field_Options options () const {
+ return ::field_opts (field);
+ }
+
+ // Set the fields options
+ inline void set_options (Field_Options options) {
+ OnError (::set_field_opts (field, options));
+ }
+
+ // 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 defaukt 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;
+ }
+
+};
+
+//
+// -------------------------------------------------------------------------
+// The class representing a form, wrapping the lowlevel FORM struct
+// -------------------------------------------------------------------------
+//
+class 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 = (UserHook*)::form_userptr(f);
+ assert(hook && hook->m_owner==f);
+ return (NCursesForm*)(hook->m_back);
+ }
+
+ // 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.
+ static void frm_init(FORM *);
+ static void frm_term(FORM *);
+ static void fld_init(FORM *);
+ static void fld_term(FORM *);
+
+ // Calculate FIELD* array for the menu
+ FIELD** mapFields(NCursesFormField* nfields[]);
+
+protected:
+ // internal routines
+ inline void set_user(void *user) {
+ UserHook* uptr = (UserHook*)::form_userptr (form);
+ assert (uptr && uptr->m_back==this && uptr->m_owner==form);
+ uptr->m_user = user;
+ }
+
+ inline void *get_user() {
+ UserHook* uptr = (UserHook*)::form_userptr (form);
+ assert (uptr && 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 THROWS(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 lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0)
+ : NCursesPanel(lines,cols,begin_y,begin_x),
+ form ((FORM*)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() {
+ InitForm(Fields, with_frame, autoDelete_Fields);
+ }
+
+ // Create a form in a panel with the given position and size.
+ NCursesForm (NCursesFormField* Fields[],
+ int lines,
+ int cols,
+ int begin_y,
+ int begin_x,
+ bool with_frame=FALSE, // reserve space for a frame?
+ bool autoDelete_Fields=FALSE) // do automatic cleanup?
+ : NCursesPanel(lines, cols, begin_y, begin_x) {
+ InitForm(Fields, with_frame, autoDelete_Fields);
+ }
+
+ virtual ~NCursesForm();
+
+ // 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) {
+ if (b_framed)
+ NCursesPanel::frame(title,btitle);
+ else
+ OnError(E_SYSTEM_ERROR);
+ }
+
+ inline void boldframe(const char *title=NULL, const char* btitle=NULL) {
+ if (b_framed)
+ NCursesPanel::boldframe(title,btitle);
+ else
+ OnError(E_SYSTEM_ERROR);
+ }
+
+ inline void label(const char *topLabel, const char *bottomLabel) {
+ 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& cols) const {
+ OnError(::scale_form(form,&rows,&cols));
+ }
+
+ // 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 page) {
+ OnError(::set_form_page(form,page));
+ }
+
+ // Retrieve current page number
+ int page() const {
+ return ::form_page(form);
+ }
+
+ // Switch on the forms options
+ inline void options_on (Form_Options options) {
+ OnError (::form_opts_on (form, options));
+ }
+
+ // Switch off the forms options
+ inline void options_off (Form_Options options) {
+ OnError (::form_opts_off (form, options));
+ }
+
+ // Retrieve the forms options
+ inline Form_Options options () const {
+ return ::form_opts (form);
+ }
+
+ // Set the forms options
+ inline void set_options (Form_Options options) {
+ OnError (::set_form_opts (form, options));
+ }
+
+ // 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 NCursesUserField : public NCursesFormField
+{
+public:
+ NCursesUserField (int rows,
+ int cols,
+ int first_row = 0,
+ int first_col = 0,
+ const T* p_UserData = (T*)0,
+ int offscreen_rows = 0,
+ int additional_buffers = 0)
+ : NCursesFormField (rows, cols,
+ first_row, first_col,
+ offscreen_rows, additional_buffers) {
+ if (field)
+ OnError(::set_field_userptr(field,(void *)p_UserData));
+ }
+
+ virtual ~NCursesUserField() {};
+
+ inline const T* UserData (void) const {
+ return (const T*)::field_userptr (field);
+ }
+
+ inline virtual void setUserData(const T* p_UserData) {
+ if (field)
+ OnError (::set_field_userptr (field, (void *)p_UserData));
+ }
+};
+//
+// -------------------------------------------------------------------------
+// The same mechanism is used to attach user data to a form
+// -------------------------------------------------------------------------
+//
+template<class T> class NCursesUserForm : public NCursesForm
+{
+protected:
+ // 'Internal' constructor, builds an object without association to a
+ // field array.
+ NCursesUserForm( int lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0,
+ const T* p_UserData = (T*)0)
+ : NCursesForm(lines,cols,begin_y,begin_x) {
+ if (form)
+ set_user ((void *)p_UserData);
+ }
+
+public:
+ NCursesUserForm (NCursesFormField Fields[],
+ bool with_frame=FALSE,
+ bool autoDelete_Fields=FALSE)
+ : NCursesForm (Fields, with_frame, autoDelete_Fields) {
+ };
+
+ NCursesUserForm (NCursesFormField Fields[],
+ const T* p_UserData = (T*)0,
+ bool with_frame=FALSE,
+ bool autoDelete_Fields=FALSE)
+ : NCursesForm (Fields, with_frame, autoDelete_Fields) {
+ if (form)
+ set_user ((void *)p_UserData);
+ };
+
+ NCursesUserForm (NCursesFormField Fields[],
+ int lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0,
+ const T* p_UserData = (T*)0,
+ bool with_frame=FALSE,
+ bool autoDelete_Fields=FALSE)
+ : NCursesForm (Fields, lines, cols, begin_y, begin_x,
+ with_frame, autoDelete_Fields) {
+ if (form)
+ set_user ((void *)p_UserData);
+ };
+
+ virtual ~NCursesUserForm() {
+ };
+
+ inline T* UserData (void) const {
+ return (T*)get_user ();
+ };
+
+ inline virtual void setUserData (const T* p_UserData) {
+ if (form)
+ set_user ((void *)p_UserData);
+ }
+
+};
+//
+// -------------------------------------------------------------------------
+// Builtin Fieldtypes
+// -------------------------------------------------------------------------
+//
+class Alpha_Field : public NCursesFieldType {
+private:
+ int min_field_width;
+
+ void set(NCursesFormField& f) {
+ OnError(::set_field_type(f.get_field(),fieldtype,min_field_width));
+ }
+
+public:
+ Alpha_Field(int width)
+ : NCursesFieldType(TYPE_ALPHA),
+ min_field_width(width) {
+ }
+};
+
+class Alphanumeric_Field : public NCursesFieldType {
+private:
+ int min_field_width;
+
+ void set(NCursesFormField& f) {
+ OnError(::set_field_type(f.get_field(),fieldtype,min_field_width));
+ }
+
+public:
+ Alphanumeric_Field(int width)
+ : NCursesFieldType(TYPE_ALNUM),
+ min_field_width(width) {
+ }
+};
+
+class Integer_Field : public NCursesFieldType {
+private:
+ int precision;
+ long lower_limit, upper_limit;
+
+ void set(NCursesFormField& f) {
+ 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 Numeric_Field : public NCursesFieldType {
+private:
+ int precision;
+ double lower_limit, upper_limit;
+
+ void set(NCursesFormField& f) {
+ 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 Regular_Expression_Field : public NCursesFieldType {
+private:
+ char* regex;
+
+ void set(NCursesFormField& f) {
+ OnError(::set_field_type(f.get_field(),fieldtype,regex));
+ }
+
+public:
+ Regular_Expression_Field(const char *expr)
+ : NCursesFieldType(TYPE_REGEXP) {
+ regex = new char[1+::strlen(expr)];
+ (strcpy)(regex,expr);
+ }
+
+ ~Regular_Expression_Field() {
+ delete[] regex;
+ }
+};
+
+class Enumeration_Field : public NCursesFieldType {
+private:
+ char** list;
+ int case_sensitive;
+ int non_unique_matches;
+
+ void set(NCursesFormField& f) {
+ OnError(::set_field_type(f.get_field(),fieldtype,
+ list,case_sensitive,non_unique_matches));
+ }
+public:
+ Enumeration_Field(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) {
+ }
+};
+
+class IPV4_Address_Field : public NCursesFieldType {
+private:
+ void set(NCursesFormField& f) {
+ OnError(::set_field_type(f.get_field(),fieldtype));
+ }
+
+public:
+ IPV4_Address_Field() : NCursesFieldType(TYPE_IPV4) {
+ }
+};
+//
+// -------------------------------------------------------------------------
+// Abstract base class for User-Defined Fieldtypes
+// -------------------------------------------------------------------------
+//
+class 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.
+ static bool fcheck(FIELD *, const void*);
+ static bool ccheck(int c, const void *);
+ static void* makearg(va_list*);
+
+ void set(NCursesFormField& f) {
+ 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() : NCursesFieldType(generic_fieldtype) {
+ }
+};
+//
+// -------------------------------------------------------------------------
+// Abstract base class for User-Defined Fieldtypes with Choice functions
+// -------------------------------------------------------------------------
+//
+class 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.
+ static bool next_choice(FIELD*, const void *);
+ static bool 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() {
+ fieldtype = generic_fieldtype_with_choice;
+ }
+};
+
+#endif // _CURSESF_H
+
diff --git a/contrib/ncurses/c++/cursesm.cc b/contrib/ncurses/c++/cursesm.cc
new file mode 100644
index 000000000000..599b5f178885
--- /dev/null
+++ b/contrib/ncurses/c++/cursesm.cc
@@ -0,0 +1,383 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+#include "cursesm.h"
+#include "cursesapp.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursesm.cc,v 1.11 1999/07/31 09:45:23 juergen Exp $")
+
+NCursesMenuItem::~NCursesMenuItem() {
+ if (item)
+ OnError(::free_item(item));
+}
+
+bool
+NCursesMenuItem::action() {
+ return FALSE;
+};
+
+NCursesMenuCallbackItem::~NCursesMenuCallbackItem() {
+}
+
+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
+NCursesMenu::mnu_init(MENU *m) {
+ getHook(m)->On_Menu_Init();
+}
+
+void
+NCursesMenu::mnu_term(MENU *m) {
+ getHook(m)->On_Menu_Termination();
+}
+
+void
+NCursesMenu::itm_init(MENU *m) {
+ NCursesMenu* M = getHook(m);
+ M->On_Item_Init (*(M->current_item ()));
+}
+
+void
+NCursesMenu::itm_term(MENU *m) {
+ NCursesMenu* M = 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** items = new ITEM*[itemCount + 1];
+
+ for (lcv=0;nitems[lcv]->item;++lcv) {
+ items[lcv] = nitems[lcv]->item;
+ }
+ items[lcv] = NULL;
+
+ my_items = nitems;
+
+ if (menu)
+ delete[] ::menu_items(menu);
+ return items;
+}
+
+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 = (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,(void*)hook);
+
+ ::set_menu_init (menu, NCursesMenu::mnu_init);
+ ::set_menu_term (menu, NCursesMenu::mnu_term);
+ ::set_item_init (menu, NCursesMenu::itm_init);
+ ::set_item_term (menu, NCursesMenu::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 = (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() {
+ UserHook* hook = (UserHook*)::menu_userptr(menu);
+ delete hook;
+ if (b_sub_owner) {
+ delete sub;
+ ::set_menu_sub(menu,(WINDOW *)0);
+ }
+ if (menu) {
+ ITEM** itms = ::menu_items(menu);
+ int cnt = count();
+
+ OnError(::set_menu_items(menu,(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 err;
+ int c;
+ bool b_action = FALSE;
+
+ post();
+ show();
+ refresh();
+
+ while (!b_action && ((drvCmnd = virtualize((c=getch()))) != CMD_QUIT)) {
+
+ 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);
+ 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
+NCursesMenu::On_Item_Termination(NCursesMenuItem& item) {
+}
+
+void
+NCursesMenu::On_Request_Denied(int c) const {
+ beep();
+}
+
+void
+NCursesMenu::On_Not_Selectable(int c) const {
+ beep();
+}
+
+void
+NCursesMenu::On_No_Match(int c) const {
+ beep();
+}
+
+void
+NCursesMenu::On_Unknown_Command(int c) const {
+ beep();
+}
+
diff --git a/contrib/ncurses/c++/cursesm.h b/contrib/ncurses/c++/cursesm.h
new file mode 100644
index 000000000000..5037ae23fb75
--- /dev/null
+++ b/contrib/ncurses/c++/cursesm.h
@@ -0,0 +1,592 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+// $Id: cursesm.h,v 1.12 1999/05/16 17:30:27 juergen Exp $
+
+#ifndef _CURSESM_H
+#define _CURSESM_H
+
+#include <cursesp.h>
+
+extern "C" {
+# include <menu.h>
+}
+//
+// -------------------------------------------------------------------------
+// This wraps the ITEM type of <menu.h>
+// -------------------------------------------------------------------------
+//
+class NCursesMenuItem {
+ friend class NCursesMenu;
+
+protected:
+ ITEM *item;
+
+ inline void OnError (int err) const THROWS(NCursesMenuException) {
+ if (err != E_OK)
+ THROW(new NCursesMenuException (err));
+ }
+
+public:
+ NCursesMenuItem (const char* p_name = NULL,
+ const char* p_descript = NULL ) {
+ item = p_name ? ::new_item (p_name, p_descript) : (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.
+
+ virtual ~NCursesMenuItem ();
+ // 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 options) {
+ OnError (::item_opts_on (item, options));
+ }
+ // Switch on the items options
+
+ inline void options_off (Item_Options options) {
+ OnError (::item_opts_off (item, options));
+ }
+ // 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 options) {
+ OnError (::set_item_opts (item, options));
+ }
+ // 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 NCursesMenuCallbackItem : public NCursesMenuItem {
+private:
+ const ITEMCALLBACK* p_fct;
+
+public:
+ NCursesMenuCallbackItem(const ITEMCALLBACK* fct = NULL,
+ const char* p_name = NULL,
+ const char* p_descript = NULL )
+ : NCursesMenuItem (p_name, p_descript),
+ p_fct (fct) {
+ }
+
+ virtual ~NCursesMenuCallbackItem();
+
+ bool action();
+};
+//
+// -------------------------------------------------------------------------
+// This wraps the MENU type of <menu.h>
+// -------------------------------------------------------------------------
+//
+class 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 = (UserHook*)::menu_userptr(m);
+ assert(hook && hook->m_owner==m);
+ return (NCursesMenu*)(hook->m_back);
+ }
+
+ // 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.
+ static void mnu_init(MENU *);
+ static void mnu_term(MENU *);
+ static void itm_init(MENU *);
+ static void itm_term(MENU *);
+
+ // Calculate ITEM* array for the menu
+ ITEM** mapItems(NCursesMenuItem* nitems[]);
+
+protected:
+ // internal routines
+ inline void set_user(void *user) {
+ UserHook* uptr = (UserHook*)::menu_userptr (menu);
+ assert (uptr && uptr->m_back==this && uptr->m_owner==menu);
+ uptr->m_user = user;
+ }
+
+ inline void *get_user() {
+ UserHook* uptr = (UserHook*)::menu_userptr (menu);
+ assert (uptr && 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 THROWS(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 lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0)
+ : NCursesPanel(lines,cols,begin_y,begin_x),
+ menu ((MENU*)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() {
+ InitMenu(Items, with_frame, autoDelete_Items);
+ }
+
+ // Make a menu with a window of this size.
+ NCursesMenu (NCursesMenuItem* Items[],
+ int lines,
+ int cols,
+ 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(lines, cols, begin_y, begin_x) {
+ InitMenu(Items, with_frame, autoDelete_Items);
+ }
+
+ virtual ~NCursesMenu ();
+
+ // 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 numer 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& cols) {
+ ::menu_format(menu,&rows,&cols);
+ }
+
+ // 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 *mark) {
+ OnError (::set_menu_mark (menu, mark));
+ }
+
+ // 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) {
+ if (b_framed)
+ NCursesPanel::frame(title,btitle);
+ else
+ OnError(E_SYSTEM_ERROR);
+ }
+
+ inline void boldframe(const char *title=NULL, const char* btitle=NULL) {
+ if (b_framed)
+ NCursesPanel::boldframe(title,btitle);
+ else
+ OnError(E_SYSTEM_ERROR);
+ }
+
+ inline void label(const char *topLabel, const char *bottomLabel) {
+ 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 NCursesUserItem : public NCursesMenuItem
+{
+public:
+ NCursesUserItem (const char* p_name,
+ const char* p_descript = NULL,
+ const T* p_UserData = (T*)0)
+ : NCursesMenuItem (p_name, p_descript) {
+ if (item)
+ OnError (::set_item_userptr (item, (void *)p_UserData));
+ };
+
+ virtual ~NCursesUserItem() {};
+
+ inline const T* UserData (void) const {
+ return (const T*)::item_userptr (item);
+ };
+
+ inline virtual void setUserData(const T* p_UserData) {
+ if (item)
+ OnError (::set_item_userptr (item, (void *)p_UserData));
+ }
+};
+//
+// -------------------------------------------------------------------------
+// The same mechanism is used to attach user data to a menu
+// -------------------------------------------------------------------------
+//
+template<class T> class NCursesUserMenu : public NCursesMenu
+{
+protected:
+ NCursesUserMenu( int lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0,
+ const T* p_UserData = (T*)0)
+ : NCursesMenu(lines,cols,begin_y,begin_x) {
+ if (menu)
+ set_user ((void *)p_UserData);
+ }
+
+public:
+ NCursesUserMenu (NCursesMenuItem Items[],
+ const T* p_UserData = (T*)0,
+ bool with_frame=FALSE,
+ bool autoDelete_Items=FALSE)
+ : NCursesMenu (Items, with_frame, autoDelete_Items) {
+ if (menu)
+ set_user ((void *)p_UserData);
+ };
+
+ NCursesUserMenu (NCursesMenuItem Items[],
+ int lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0,
+ const T* p_UserData = (T*)0,
+ bool with_frame=FALSE)
+ : NCursesMenu (Items, lines, cols, begin_y, begin_x, with_frame) {
+ if (menu)
+ set_user ((void *)p_UserData);
+ };
+
+ virtual ~NCursesUserMenu() {
+ };
+
+ inline T* UserData (void) const {
+ return (T*)get_user ();
+ };
+
+ inline virtual void setUserData (const T* p_UserData) {
+ if (menu)
+ set_user ((void *)p_UserData);
+ }
+};
+
+#endif // _CURSESM_H
diff --git a/contrib/ncurses/c++/cursesmain.cc b/contrib/ncurses/c++/cursesmain.cc
new file mode 100644
index 000000000000..09400b8d690a
--- /dev/null
+++ b/contrib/ncurses/c++/cursesmain.cc
@@ -0,0 +1,51 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+#include "cursesapp.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursesmain.cc,v 1.5 1999/05/16 17:31:22 juergen Exp $")
+
+/* 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 main(int argc, char* argv[])
+{
+ NCursesApplication* A = NCursesApplication::getApplication();
+ if (!A)
+ return(1);
+ A->handleArgs(argc,argv);
+ ::endwin();
+ return((*A)());
+}
diff --git a/contrib/ncurses/c++/cursesp.cc b/contrib/ncurses/c++/cursesp.cc
new file mode 100644
index 000000000000..e0c17aea7eb4
--- /dev/null
+++ b/contrib/ncurses/c++/cursesp.cc
@@ -0,0 +1,123 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1993,1997 *
+ ****************************************************************************/
+
+#include "cursesp.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursesp.cc,v 1.14 1999/05/16 17:30:51 juergen Exp $")
+
+NCursesPanel* NCursesPanel::dummy = (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, (void *)hook);
+}
+
+NCursesPanel::~NCursesPanel() {
+ UserHook* hook = (UserHook*)::panel_userptr(p);
+ assert(hook && 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 *label) {
+ if (label) {
+ int x = (maxx() - strlen(label)) / 2;
+ if (x<0)
+ x=0;
+ OnError(addstr(row, x, label, width()));
+ }
+}
diff --git a/contrib/ncurses/c++/cursesp.h b/contrib/ncurses/c++/cursesp.h
new file mode 100644
index 000000000000..51cb4cdbf847
--- /dev/null
+++ b/contrib/ncurses/c++/cursesp.h
@@ -0,0 +1,186 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+#ifndef _CURSESP_H
+#define _CURSESP_H
+
+// $Id: cursesp.h,v 1.11 1999/07/31 09:46:05 juergen Exp $
+
+#include <cursesw.h>
+
+extern "C" {
+# include <panel.h>
+}
+
+class 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;
+
+ void init(); // Initialize the panel object
+
+protected:
+ void set_user(void *user) {
+ UserHook* uptr = (UserHook*)::panel_userptr (p);
+ assert (uptr && uptr->m_back==this && uptr->m_owner==p);
+ uptr->m_user = user;
+ }
+ // Set the user pointer of the panel.
+
+ void *get_user() {
+ UserHook* uptr = (UserHook*)::panel_userptr (p);
+ assert (uptr && uptr->m_back==this && uptr->m_owner==p);
+ return uptr->m_user;
+ }
+
+ void OnError (int err) const THROWS((NCursesPanelException)) {
+ if (err==ERR)
+ THROW(new NCursesPanelException (this, err));
+ }
+ // If err is equal to the curses error indicator ERR, an error handler
+ // is called.
+
+public:
+ NCursesPanel(int lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0)
+ : NCursesWindow(lines,cols,begin_y,begin_x) {
+ init();
+ }
+ // Create a panel with this size starting at the requested position.
+
+ NCursesPanel() : NCursesWindow(::stdscr) { init(); }
+ // This constructor creates the default Panel associated with the
+ // ::stdscr window
+
+ virtual ~NCursesPanel();
+
+ // 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) {
+ 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();
+ // Propagate all panel changes to the virtual screen and update the
+ // physical screen.
+
+ virtual int noutrefresh();
+ // 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 lines,
+ int cols,
+ int begin_y = 0,
+ int begin_x = 0,
+ const T* p_UserData = (T*)0)
+ : NCursesPanel (lines, cols, begin_y, begin_x) {
+ if (p)
+ set_user ((void *)p_UserData);
+ };
+ // This creates an user panel of the requested size with associated
+ // user data pointed to by p_UserData.
+
+ NCursesUserPanel(const T* p_UserData = (T*)0) : NCursesPanel() {
+ if (p)
+ set_user((void *)p_UserData);
+ };
+ // This creates an user panel associated with the ::stdscr and user data
+ // pointed to by p_UserData.
+
+ virtual ~NCursesUserPanel() {};
+
+ T* UserData (void) const {
+ return (T*)get_user ();
+ };
+ // Retrieve the user data associated with the panel.
+
+ virtual void setUserData (const T* p_UserData) {
+ if (p)
+ set_user ((void *)p_UserData);
+ }
+ // Associate the user panel with the user data pointed to by p_UserData.
+};
+
+#endif // _CURSESP_H
diff --git a/contrib/ncurses/c++/cursespad.cc b/contrib/ncurses/c++/cursespad.cc
new file mode 100644
index 000000000000..78af365e1451
--- /dev/null
+++ b/contrib/ncurses/c++/cursespad.cc
@@ -0,0 +1,270 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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 <juergen.pfeifer@gmx.net> 1999 *
+ ****************************************************************************/
+
+#include "etip.h"
+#include "cursesw.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursespad.cc,v 1.1 1999/07/31 09:47:21 juergen Exp $")
+
+NCursesPad::NCursesPad(int lines, int cols)
+ : NCursesWindow(),
+ viewWin((NCursesWindow*)0),
+ viewSub((NCursesWindow*)0),
+ h_gridsize(0), v_gridsize(0),
+ min_row(0), min_col(0)
+{
+ w = ::newpad(lines,cols);
+ if ((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 ((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 && ((NCursesWindow*)0 != viewWin)) {
+ res = (viewWin->refresh());
+ }
+ return(res);
+}
+
+int NCursesPad::noutrefresh() {
+ int res = OK;
+ NCursesWindow* W = Win();
+ if ((NCursesWindow*)0 != W) {
+ res = copywin(*W,min_row,min_col,
+ 0,0,W->maxy(),W->maxx(),
+ FALSE);
+ if (res==OK) {
+ W->syncup();
+ res = viewWin->noutrefresh();
+ }
+ }
+ return (res);
+}
+
+void NCursesPad::setWindow(NCursesWindow& view,
+ int v_grid = 1,
+ int h_grid = 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 ((NCursesWindow*)0 == viewWin)
+ err_handler("Pad has no viewport");
+ if (!viewWin->isDescendant(sub))
+ THROW(new NCursesException("NCursesFramePad", E_SYSTEM_ERROR));
+ viewSub = &sub;
+}
+
+void NCursesFramedPad::OnOperation(int pad_req) {
+ NCursesWindow* W = Win();
+ NCursesWindow* Win = getWindow();
+
+ if (((NCursesWindow*)0 != W) && ((NCursesWindow*)0 != Win)) {
+ int Width = W->width();
+ int Height = W->height();
+ int i, row, col, h_len, v_len;
+
+ h_len = (Width*Width + width() - 1)/width();
+ if (h_len==0)
+ h_len = 1;
+ if (h_len > Width)
+ h_len = Width;
+
+ v_len = (Height*Height + height() - 1)/height();
+ if (v_len==0)
+ v_len = 1;
+ if (v_len > Height)
+ v_len = Height;
+
+ col = (min_col * Width + width() - 1) / width();
+ if (col + h_len > Width)
+ col = Width - h_len;
+
+ row = (min_row * Height + height() - 1) / height();
+ if (row + v_len > Height)
+ row = Height - v_len;
+
+ Win->vline(1,Width+1,Height);
+ Win->attron(A_REVERSE);
+ if (v_len>=2) {
+ Win->addch(row+1,Width+1,ACS_UARROW);
+ for(i=2;i<v_len;i++)
+ Win->addch(row+i,Width+1,' ');
+ Win->addch(row+v_len,Width+1,ACS_DARROW);
+ }
+ else {
+ for(i=1;i<=v_len;i++)
+ Win->addch(row+i,Width+1,' ');
+ }
+ Win->attroff(A_REVERSE);
+
+ Win->hline(Height+1,1,Width);
+ Win->attron(A_REVERSE);
+ if (h_len >= 2) {
+ Win->addch(Height+1,col+1,ACS_LARROW);
+ for(i=2;i<h_len;i++)
+ Win->addch(Height+1,col+i,' ');
+ Win->addch(Height+1,col+h_len,ACS_RARROW);
+ }
+ else {
+ for(i=1;i<=h_len;i++)
+ Win->addch(Height+1,col+i,' ');
+ }
+ Win->attroff(A_REVERSE);
+ }
+}
diff --git a/contrib/ncurses/c++/cursesw.cc b/contrib/ncurses/c++/cursesw.cc
new file mode 100644
index 000000000000..4973e3a715a5
--- /dev/null
+++ b/contrib/ncurses/c++/cursesw.cc
@@ -0,0 +1,431 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+
+/*
+ Copyright (C) 1989 Free Software Foundation
+ written by Eric Newton (newton@rocky.oswego.edu)
+
+ This file is part of the GNU C++ Library. This library is free
+ software; you can redistribute it and/or modify it under the terms of
+ the GNU Library General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your
+ option) any later version. This library 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 Library General Public License for more details.
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ modified by Ulrich Drepper (drepper@karlsruhe.gmd.de)
+ and Anatoly Ivasyuk (anatoly@nick.csh.rit.edu)
+
+ modified by Juergen Pfeifer (juergen.pfeifer@gmx.net)
+*/
+
+#include "cursesw.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursesw.cc,v 1.13 1999/07/31 09:46:30 juergen Exp $")
+
+#define COLORS_NEED_INITIALIZATION -1
+#define COLORS_NOT_INITIALIZED 0
+#define COLORS_MONOCHROME 1
+#define COLORS_ARE_REALLY_THERE 2
+
+// declare static variables for the class
+long NCursesWindow::count = 0L;
+bool NCursesWindow::b_initialized = FALSE;
+
+#if defined(__GNUG__)
+# ifndef _IO_va_list
+# define _IO_va_list char *
+# endif
+#endif
+
+int
+NCursesWindow::scanw(const char* fmt, ...)
+{
+#if defined(__GNUG__)
+ va_list args;
+ va_start(args, fmt);
+ char buf[BUFSIZ];
+ int result = wgetstr(w, buf);
+ if (result == OK) {
+ strstreambuf ss(buf, BUFSIZ);
+ result = ss.vscan(fmt, (_IO_va_list)args);
+ }
+ va_end(args);
+ return result;
+#else
+ return ERR;
+#endif
+}
+
+
+int
+NCursesWindow::scanw(int y, int x, const char* fmt, ...)
+{
+#if defined(__GNUG__)
+ va_list args;
+ va_start(args, fmt);
+ char buf[BUFSIZ];
+ int result = wmove(w, y, x);
+ if (result == OK) {
+ result = wgetstr(w, buf);
+ if (result == OK) {
+ strstreambuf ss(buf, BUFSIZ);
+ result = ss.vscan(fmt, (_IO_va_list)args);
+ }
+ }
+ va_end(args);
+ return result;
+#else
+ return ERR;
+#endif
+}
+
+
+int
+NCursesWindow::printw(const char * fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ char buf[BUFSIZ];
+ vsprintf(buf, fmt, args);
+ va_end(args);
+ return waddstr(w, buf);
+}
+
+
+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) {
+ char buf[BUFSIZ];
+ vsprintf(buf, fmt, args);
+ result = waddstr(w, buf);
+ }
+ va_end(args);
+ return result;
+}
+
+
+void
+NCursesWindow::init(void)
+{
+ leaveok(0);
+ keypad(1);
+ meta(1);
+}
+
+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();
+ }
+}
+
+NCursesWindow::NCursesWindow() {
+ if (!b_initialized)
+ initialize();
+
+ w = (WINDOW *)0;
+ init();
+ alloced = FALSE;
+ subwins = par = sib = 0;
+ count++;
+}
+
+NCursesWindow::NCursesWindow(int lines, int cols, int begin_y, int begin_x)
+{
+ if (!b_initialized)
+ initialize();
+
+ w = ::newwin(lines, cols, begin_y, begin_x);
+ if (w == 0) {
+ err_handler("Cannot construct window");
+ }
+ init();
+
+ alloced = TRUE;
+ subwins = par = sib = 0;
+ count++;
+}
+
+NCursesWindow::NCursesWindow(WINDOW* &window)
+{
+ if (!b_initialized)
+ initialize();
+
+ w = window;
+ init();
+ alloced = FALSE;
+ subwins = par = sib = 0;
+ count++;
+}
+
+NCursesWindow::NCursesWindow(NCursesWindow& win, int l, int c,
+ int begin_y, int begin_x, char absrel)
+{
+ if (absrel == 'a') { // absolute origin
+ begin_y -= win.begy();
+ begin_x -= win.begx();
+ }
+
+ // Even though we treat subwindows as a tree, the standard curses
+ // library needs the `subwin' call to link to the parent in
+ // order to correctly perform refreshes, etc.
+ // Friendly enough, this also works for pads.
+ w = ::derwin(win.w, l, c, begin_y, begin_x);
+ if (w == 0) {
+ err_handler("Cannot construct subwindow");
+ }
+
+ par = &win;
+ sib = win.subwins;
+ win.subwins = this;
+ subwins = 0;
+ alloced = TRUE;
+ count++;
+}
+
+NCursesWindow::NCursesWindow(NCursesWindow& win, bool do_box = TRUE)
+{
+ w = :: derwin(win.w,win.height()-2,win.width()-2,1,1);
+ if (w == 0) {
+ err_handler("Cannot construct subwindow");
+ }
+
+ par = &win;
+ sib = win.subwins;
+ win.subwins = this;
+ subwins = 0;
+ alloced = TRUE;
+ count++;
+
+ 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;
+
+extern "C" int _nc_ripoffline(int,int (*init)(WINDOW*,int));
+
+NCursesWindow::NCursesWindow(WINDOW *win, int cols) {
+ w = win;
+ assert((w->_maxx+1)==cols);
+ alloced = FALSE;
+ subwins = par = sib = 0;
+}
+
+int NCursesWindow::ripoff_init(WINDOW *w, int cols)
+{
+ int res = ERR;
+
+ RIPOFFINIT init = *prip++;
+ if (init) {
+ NCursesWindow* W = new NCursesWindow(w,cols);
+ res = init(*W);
+ }
+ return res;
+}
+
+int NCursesWindow::ripoffline(int ripoff_lines,
+ int (*init)(NCursesWindow& win)) {
+ int code = ::_nc_ripoffline(ripoff_lines,ripoff_init);
+ if (code==OK && init && ripoff_lines) {
+ R_INIT[r_init_idx++] = init;
+ }
+ return code;
+}
+
+bool
+NCursesWindow::isDescendant(NCursesWindow& win) {
+ for (NCursesWindow* p = subwins; p != NULL; p = p->sib) {
+ if (p==&win)
+ return TRUE;
+ else {
+ if (p->isDescendant(win))
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void
+NCursesWindow::kill_subwindows()
+{
+ for (NCursesWindow* p = subwins; p != 0; p = p->sib) {
+ p->kill_subwindows();
+ if (p->alloced) {
+ if (p->w != 0)
+ ::delwin(p->w);
+ p->alloced = FALSE;
+ }
+ p->w = 0; // cause a run-time error if anyone attempts to use...
+ }
+}
+
+
+NCursesWindow::~NCursesWindow()
+{
+ kill_subwindows();
+
+ if (par != 0) { // Snip us from the parent's list of subwindows.
+ NCursesWindow * win = par->subwins;
+ NCursesWindow * trail = 0;
+ for (;;) {
+ if (win == 0)
+ break;
+ else if (win == this) {
+ if (trail != 0)
+ trail->sib = win->sib;
+ else
+ par->subwins = win->sib;
+ break;
+ } else {
+ trail = win;
+ win = win->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;
+ }
+}
+
+short
+NCursesWindow::getcolor(int getback) const
+{
+ short fore, back;
+
+ if (colorInitialized==COLORS_ARE_REALLY_THERE) {
+ if (pair_content(PAIR_NUMBER(w->_attrs), &fore, &back))
+ 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()
+{
+ if (colorInitialized==COLORS_ARE_REALLY_THERE)
+ return COLORS;
+ else
+ return 1; // monochrome (actually there are two ;-)
+}
+
+short
+NCursesWindow::getcolor() const
+{
+ if (colorInitialized==COLORS_ARE_REALLY_THERE)
+ return PAIR_NUMBER(w->_attrs);
+ else
+ return 0; // we only have pair zero
+}
+
+int
+NCursesWindow::setpalette(short fore, short back, short pair)
+{
+ if (colorInitialized==COLORS_ARE_REALLY_THERE)
+ return init_pair(pair, fore, back);
+ else
+ return OK;
+}
+
+int
+NCursesWindow::setpalette(short fore, short back)
+{
+ if (colorInitialized==COLORS_ARE_REALLY_THERE)
+ return setpalette(fore, back, PAIR_NUMBER(w->_attrs));
+ else
+ return OK;
+}
+
+
+int
+NCursesWindow::setcolor(short pair)
+{
+ if (colorInitialized==COLORS_ARE_REALLY_THERE) {
+ if ((pair < 1) || (pair > COLOR_PAIRS))
+ err_handler("Can't set color pair");
+
+ attroff(A_COLOR);
+ attrset(COLOR_PAIR(pair));
+ }
+ return OK;
+}
+
+extern "C" int _nc_has_mouse(void);
+
+bool NCursesWindow::has_mouse() const {
+ return ((::has_key(KEY_MOUSE) || ::_nc_has_mouse())
+ ? TRUE : FALSE);
+}
diff --git a/contrib/ncurses/c++/cursesw.h b/contrib/ncurses/c++/cursesw.h
new file mode 100644
index 000000000000..0d2665e30f5e
--- /dev/null
+++ b/contrib/ncurses/c++/cursesw.h
@@ -0,0 +1,1375 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+#ifndef _CURSESW_H
+#define _CURSESW_H
+
+// $Id: cursesw.h,v 1.16 1999/07/31 09:46:43 juergen Exp $
+
+#include <etip.h>
+#include <stdio.h>
+#include <stdarg.h>
+#ifdef __MWERKS__
+/* This is a bogus check, stringstream is actually ANSI C++ standard,
+ * but old compilers like GCC don't have it, and new compilers like Metrowerks
+ * don't have strstream
+ */
+#include <sstream>
+#else
+#include <strstream.h>
+#endif
+
+extern "C" {
+# include <curses.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 echochar
+inline int UNDEF(echochar)(chtype ch) { return echochar(ch); }
+#undef echochar
+#define echochar UNDEF(echochar)
+#endif
+
+#ifdef insdelln
+inline int UNDEF(insdelln)(int n) { return insdelln(n); }
+#undef insdelln
+#define insdelln UNDEF(insdelln)
+#endif
+
+#ifdef addstr
+/* The (char*) cast is to hack around missing const's */
+inline int UNDEF(addstr)(const char * str) { return addstr((char*)str); }
+#undef addstr
+#define addstr UNDEF(addstr)
+#endif
+
+#ifdef attron
+inline int UNDEF(attron)(chtype at) { return attron(at); }
+#undef attron
+#define attron UNDEF(attron)
+#endif
+
+#ifdef attroff
+inline int UNDEF(attroff)(chtype at) { return attroff(at); }
+#undef attroff
+#define attroff UNDEF(attroff)
+#endif
+
+#ifdef attrset
+inline chtype UNDEF(attrset)(chtype at) { return attrset(at); }
+#undef attrset
+#define attrset UNDEF(attrset)
+#endif
+
+#ifdef color_set
+inline chtype UNDEF(color_set)(short p,void* opts) { return color_set(p,opts); }
+#undef color_set
+#define color_set UNDEF(color_set)
+#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 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 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 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" int 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 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 erase
+inline int UNDEF(erase)() { return erase(); }
+#undef erase
+#define erase UNDEF(erase)
+#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 getch
+inline int UNDEF(getch)() { return getch(); }
+#undef getch
+#define getch UNDEF(getch)
+#endif
+
+#ifdef getstr
+inline int UNDEF(getstr)(char *_str) { return getstr(_str); }
+#undef getstr
+#define getstr UNDEF(getstr)
+#endif
+
+#ifdef instr
+inline int UNDEF(instr)(char *_str) { return instr(_str); }
+#undef instr
+#define instr UNDEF(instr)
+#endif
+
+#ifdef innstr
+inline int UNDEF(innstr)(char *_str, int n) { return innstr(_str,n); }
+#undef innstr
+#define innstr UNDEF(innstr)
+#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 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 winsstr
+inline int UNDEF(winsstr)(WINDOW *w, const char *_str) {
+ return winsstr(w,_str); }
+#undef winsstr
+#define winsstr UNDEF(winsstr)
+#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 insstr
+inline int UNDEF(insstr)(const char *_str) {
+ return insstr(_str); }
+#undef insstr
+#define insstr UNDEF(insstr)
+#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 insnstr
+inline int UNDEF(insnstr)(const char *_str, int n) {
+ return insnstr(_str,n); }
+#undef insnstr
+#define insnstr UNDEF(insnstr)
+#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 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 getnstr
+inline int UNDEF(getnstr)(char *_str, int n) { return getnstr(_str,n); }
+#undef getnstr
+#define getnstr UNDEF(getnstr)
+#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 getbegyx
+inline void UNDEF(getbegyx)(WINDOW* win, int& y, int& x) { getbegyx(win, y, x); }
+#undef getbegyx
+#define getbegyx UNDEF(getbegyx)
+#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 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 insch
+inline int UNDEF(insch)(char c) { return insch(c); }
+#undef insch
+#define insch UNDEF(insch)
+#endif
+
+#ifdef insertln
+inline int UNDEF(insertln)() { return insertln(); }
+#undef insertln
+#define insertln UNDEF(insertln)
+#endif
+
+#ifdef leaveok
+inline int UNDEF(leaveok)(WINDOW* win, bool bf) { return leaveok(win, bf); }
+#undef leaveok
+#define leaveok UNDEF(leaveok)
+#else
+extern "C" int 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 refresh
+inline int UNDEF(refresh)() { return refresh(); }
+#undef refresh
+#define refresh UNDEF(refresh)
+#endif
+
+#ifdef redrawwin
+inline int UNDEF(redrawwin)(WINDOW *win) { return redrawwin(win); }
+#undef redrawwin
+#define redrawwin UNDEF(redrawwin)
+#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" int scrollok(WINDOW*, bool);
+#else
+extern "C" int 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 waddstr
+inline int UNDEF(waddstr)(WINDOW *win, char *str) { return waddstr(win, str); }
+#undef waddstr
+#define waddstr UNDEF(waddstr)
+#endif
+
+#ifdef waddchstr
+inline int UNDEF(waddchstr)(WINDOW *win, chtype *at) { return waddchstr(win, at); }
+#undef waddchstr
+#define waddchstr UNDEF(waddchstr)
+#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
+
+
+#ifdef wattroff
+inline int UNDEF(wattroff)(WINDOW *win, int att) { return wattroff(win, att); }
+#undef wattroff
+#define wattroff UNDEF(wattroff)
+#endif
+
+#ifdef chgat
+inline int UNDEF(chgat)(int n,attr_t attr, short color, const void *opts) {
+ return chgat(n,attr,color,opts); }
+#undef chgat
+#define chgat UNDEF(chgat)
+#endif
+
+#ifdef mvchgat
+inline int UNDEF(mvchgat)(int y, int x, int n,
+ attr_t attr, short color, const void *opts) {
+ return mvchgat(y,x,n,attr,color,opts); }
+#undef mvchgat
+#define mvchgat UNDEF(mvchgat)
+#endif
+
+#ifdef mvwchgat
+inline int UNDEF(mvwchgat)(WINDOW *win, int y, int x, int n,
+ attr_t attr, short color, const void *opts) {
+ return mvwchgat(win,y,x,n,attr,color,opts); }
+#undef mvwchgat
+#define mvwchgat UNDEF(mvwchgat)
+#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 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, 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, chtype *str)
+{ return mvwaddchstr(win, y, x, str); }
+#undef mvwaddchstr
+#define mvwaddchstr UNDEF(mvwaddchstr)
+#endif
+
+#ifdef addnstr
+inline int UNDEF(addnstr)(const char *str, int n)
+{ return addnstr((char*)str, n); }
+#undef addnstr
+#define addnstr UNDEF(addnstr)
+#endif
+
+#ifdef mvwaddnstr
+inline int UNDEF(mvwaddnstr)(WINDOW *win, int y, int x, const char *str, int n)
+{ return mvwaddnstr(win, y, x, (char*)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, (char*)str); }
+#undef mvwaddstr
+#define mvwaddstr UNDEF(mvwaddstr)
+#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 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 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 mvwinch
+inline chtype UNDEF(mvwinch)(WINDOW *win, int y, int x) {
+ return mvwinch(win, y, x);}
+#undef mvwinch
+#define mvwinch UNDEF(mvwinch)
+#endif
+
+#ifdef mvwinsch
+inline int UNDEF(mvwinsch)(WINDOW *win, int y, int x, char c)
+{ return mvwinsch(win, y, x, c); }
+#undef mvwinsch
+#define mvwinsch UNDEF(mvwinsch)
+#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, (char*)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, (char*)str); }
+#undef mvaddstr
+#define mvaddstr UNDEF(mvaddstr)
+#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 mvgetstr
+inline int UNDEF(mvgetstr)(int y, int x, char *str) {return mvgetstr(y, x, str);}
+#undef mvgetstr
+#define mvgetstr UNDEF(mvgetstr)
+#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 mvinch
+inline chtype UNDEF(mvinch)(int y, int x) { return mvinch(y, x);}
+#undef mvinch
+#define mvinch UNDEF(mvinch)
+#endif
+
+#ifdef mvinsch
+inline int UNDEF(mvinsch)(int y, int x, char c)
+{ return mvinsch(y, x, c); }
+#undef mvinsch
+#define mvinsch UNDEF(mvinsch)
+#endif
+
+#ifdef napms
+inline void UNDEF(napms)(unsigned long x) { napms(x); }
+#undef napms
+#define napms UNDEF(napms)
+#endif
+
+#ifdef fixterm
+inline int UNDEF(fixterm)(void) { return fixterm(); }
+#undef fixterm
+#define fixterm UNDEF(fixterm)
+#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 crmode
+inline int UNDEF(crmode)(void) { return crmode(); }
+#undef crmode
+#define crmode UNDEF(crmode)
+#endif
+
+#ifdef nocrmode
+inline int UNDEF(nocrmode)(void) { return nocrmode(); }
+#undef nocrmode
+#define nocrmode UNDEF(nocrmode)
+#endif
+
+#ifdef getbkgd
+inline chtype UNDEF(getbkgd)(const WINDOW *win) { return getbkgd(win); }
+#undef getbkgd
+#define getbkgd UNDEF(getbkgd)
+#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
+
+/*
+ *
+ * C++ class for windows.
+ *
+ *
+ */
+
+class NCursesWindow
+{
+ friend class NCursesMenu;
+ friend class NCursesForm;
+
+private:
+ static bool b_initialized;
+ static void initialize();
+ static int ripoff_init(WINDOW *,int);
+
+ void init();
+
+ short getcolor(int getback) const;
+
+ static int setpalette(short fore, short back, short pair);
+ static int colorInitialized;
+
+ // This private constructor is only used during the initialization
+ // of windows generated by ripoffline() calls.
+ NCursesWindow(WINDOW* win, int cols);
+
+protected:
+ 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:
+ NCursesWindow(WINDOW* &window); // useful only for stdscr
+
+ NCursesWindow(int lines, // number of lines
+ int cols, // number of columns
+ int begin_y, // line origin
+ int begin_x); // col origin
+
+ NCursesWindow(NCursesWindow& par,// parent window
+ int lines, // number of lines
+ int cols, // number of columns
+ int begin_y, // absolute or relative
+ int begin_x, // origins:
+ char absrel = 'a');// if `a', by & bx 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.
+
+ virtual ~NCursesWindow();
+
+ 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 defered until ncurses gets initialized.
+ // The initialization function is then called.
+
+ // -------------------------------------------------------------------------
+ // terminal status
+ // -------------------------------------------------------------------------
+ int lines() const { return LINES; }
+ // Number of lines on terminal, *not* window
+
+ int cols() const { return COLS; }
+ // Number of cols on terminal, *not* window
+
+ int tabsize() const { 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 w->_begx; }
+ // Column of top left corner relative to stdscr
+
+ int begy() const { return w->_begy; }
+ // Line of top left corner relative to stdscr
+
+ int maxx() const { return w->_maxx; }
+ // Largest x coord in window
+
+ int maxy() const { return w->_maxy; }
+ // Largest y coord in window
+
+ short getcolor() const;
+ // Actual color pair
+
+ short foreground() const { return getcolor(0); }
+ // Actual foreground color
+
+ short background() const { return getcolor(1); }
+ // Actual background color
+
+ int setpalette(short fore, short back);
+ // Set color palette entry
+
+ int setcolor(short 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
+
+ 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. This only works if you're
+ // using the GNU C++ compiler.
+#if __GNUG__ >= 2
+ __attribute__ ((format (scanf, 2, 3)));
+#else
+ ;
+#endif
+
+ int scanw(int y, int x, const char* fmt, ...)
+ // Move the cursor to the requested position and then perform a scanw
+ // from the window. This nly works if you're using the GNU C++ compiler.
+#if __GNUG__ >= 2
+ __attribute__ ((format (scanf, 4, 5)));
+#else
+ ;
+#endif
+
+ // -------------------------------------------------------------------------
+ // 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, (char*)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,(char*)str,n); }
+ // Move the cursor to the requested position and then perform the addstr
+ // as described above.
+
+ int printw(const char* fmt, ...)
+ // Do a formatted print to the window.
+#if __GNUG__ >= 2
+ __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
+ __attribute__ ((format (printf, 4, 5)));
+#else
+ ;
+#endif
+
+ 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 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, at); }
+ // Switch off the window attributes;
+
+ int attrset(chtype at) { return ::wattrset(w, at); }
+ // Set the window attributes;
+
+ int color_set(short 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, short 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, short 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 specifiy 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 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,(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: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 whereever
+ // 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 keypad(bool bf) { return ::keypad(w, bf); }
+ // If called with bf=TRUE, the application will interpret function keys.
+
+ 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 overlay=TRUE) {
+ return ::copywin(w,win.w,sminrow,smincol,dminrow,dmincol,
+ dmaxrow,dmaxcol,(int)(overlay?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.
+
+ // -------------------------------------------------------------------------
+ // 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 NCursesColorWindow : public NCursesWindow {
+public:
+ NCursesColorWindow(WINDOW* &window) // useful only for stdscr
+ : NCursesWindow(window) {
+ useColors(); }
+
+ NCursesColorWindow(int lines, // number of lines
+ int cols, // number of columns
+ int begin_y, // line origin
+ int begin_x) // col origin
+ : NCursesWindow(lines,cols,begin_y,begin_x) {
+ useColors(); }
+
+ NCursesColorWindow(NCursesWindow& par,// parent window
+ int lines, // number of lines
+ int cols, // number of columns
+ int begin_y, // absolute or relative
+ int begin_x, // origins:
+ char absrel = 'a') // if `a', by & bx are
+ : NCursesWindow(par,lines,cols, // absolute screen pos,
+ begin_y,begin_x, // else if `r', they are
+ absrel ) { // relative to par origin
+ useColors(); }
+};
+
+// -------------------------------------------------------------------------
+// Pad Support. We allow an association of a pad with a "real" window
+// through which the pad may be viewed.
+// -------------------------------------------------------------------------
+class 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:NULL));
+ }
+
+ 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;
+
+ static const Pad_Request PAD_LOW = REQ_PAD_REFRESH; // lowest op-code
+ static const Pad_Request PAD_HIGH = REQ_PAD_EXIT; // highest op-code
+
+ 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) {
+ ::beep();
+ }
+ // This is called if the driver returns an unknown op-code
+
+ virtual void OnNavigationError(int pad_req) {
+ ::beep();
+ }
+ // This is called if a navigation request couldn't be satisfied
+
+ virtual void OnOperation(int pad_req) {
+ };
+ // OnOperation is called if a Pad_Operation was executed and just before
+ // the refresh() operation is done.
+
+public:
+ NCursesPad(int lines, int cols);
+ // create a pad with the given size
+
+ virtual ~NCursesPad() {}
+
+ int echochar(const chtype ch) { return ::pechochar(w,ch); }
+ // Put the attributed character onto the pad and immediately do a
+ // prefresh().
+
+ int refresh();
+ // 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();
+ // 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 like 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 NCursesFramedPad : public NCursesPad {
+private:
+ static const char* const msg = "Operation not allowed";
+
+protected:
+ virtual void OnOperation(int pad_req);
+
+public:
+ NCursesFramedPad(NCursesWindow& win, int lines, int cols,
+ int v_grid = 1, int h_grid = 1)
+ : NCursesPad(lines,cols) {
+ NCursesPad::setWindow(win,v_grid,h_grid);
+ NCursesPad::setSubWindow(*(new NCursesWindow(win)));
+ }
+ // Construct the FramedPad with the given Window win as viewport.
+
+ virtual ~NCursesFramedPad() {
+ delete getSubWindow();
+ }
+
+ void setWindow(NCursesWindow& view, int v_grid = 1, int h_grid = 1) {
+ err_handler(msg);
+ }
+ // Disable this call; the viewport is already defined
+
+ void setSubWindow(NCursesWindow& sub) {
+ err_handler(msg);
+ }
+ // Disable this call; the viewport subwindow is already defined
+
+};
+
+#endif // _CURSESW_H
diff --git a/contrib/ncurses/c++/cursslk.cc b/contrib/ncurses/c++/cursslk.cc
new file mode 100644
index 000000000000..82ff83e11954
--- /dev/null
+++ b/contrib/ncurses/c++/cursslk.cc
@@ -0,0 +1,121 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+#include "cursslk.h"
+#include "cursesapp.h"
+#include "internal.h"
+
+MODULE_ID("$Id: cursslk.cc,v 1.5 1999/05/16 17:31:01 juergen Exp $")
+
+void Soft_Label_Key_Set::Soft_Label_Key::operator=(char *text) {
+ delete[] label;
+ label = new char[1 + ::strlen(text)];
+ (strcpy)(label,text);
+}
+
+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() {
+ 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() {
+ if (format==None)
+ Error("No default SLK layout");
+ init();
+}
+
+Soft_Label_Key_Set::Soft_Label_Key_Set(Soft_Label_Key_Set::Label_Layout fmt) {
+ if (fmt==None)
+ Error("Invalid SLK Layout");
+ if (count++==0) {
+ format = fmt;
+ if (ERR == ::slk_init((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() {
+ 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];
+}
+
+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/contrib/ncurses/c++/cursslk.h b/contrib/ncurses/c++/cursslk.h
new file mode 100644
index 000000000000..1598b0634bab
--- /dev/null
+++ b/contrib/ncurses/c++/cursslk.h
@@ -0,0 +1,205 @@
+// * this is for making emacs happy: -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+// $Id: cursslk.h,v 1.5 1999/05/16 17:30:08 juergen Exp $
+
+#ifndef _CURSSLK_H
+#define _CURSSLK_H
+
+#include <cursesw.h>
+
+class Soft_Label_Key_Set {
+public:
+ // This inner class represents the attributes of a Soft Label Key (SLK)
+ class 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((char*)0),format(Left),num(-1) {
+ }
+
+ virtual ~Soft_Label_Key() {
+ delete[] label;
+ };
+
+ public:
+ // Set the text of the Label
+ void operator=(char *text);
+
+ // Set the Justification of the Label
+ inline void operator=(Justification just) {
+ format = just;
+ }
+
+ // Retrieve the text of the label
+ inline char* operator()(void) const {
+ return 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).
+ 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();
+
+ virtual ~Soft_Label_Key_Set();
+
+ // Get Label# i. Label counting starts with 1!
+ Soft_Label_Key& operator[](int i);
+
+ // Retrieve number of Labels
+ inline int labels() const { return num_labels; }
+
+ // 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 // _CURSSLK_H
diff --git a/contrib/ncurses/c++/demo.cc b/contrib/ncurses/c++/demo.cc
new file mode 100644
index 000000000000..6ac4650fb54c
--- /dev/null
+++ b/contrib/ncurses/c++/demo.cc
@@ -0,0 +1,449 @@
+/*
+ * 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 <juergen.pfeifer@gmx.net>
+ *
+ * $Id: demo.cc,v 1.17 1999/07/31 09:47:17 juergen Exp $
+ */
+
+#include "cursesapp.h"
+#include "cursesm.h"
+#include "cursesf.h"
+
+#if HAVE_LIBC_H
+# include <libc.h>
+#endif
+
+extern "C" unsigned int sleep(unsigned int);
+
+#undef index // needed for NeXT
+
+//
+// -------------------------------------------------------------------------
+//
+class SillyDemo
+{
+ public:
+ void run(int sleeptime) {
+
+ NCursesPanel *std = 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.
+
+ std->box();
+ std->move(std->height()/2,1);
+ std->hline(std->width()-2);
+ std->move(1,std->width()/2);
+ std->vline(std->height()-2);
+ std->addch(0,std->width()/2,ACS_TTEE);
+ std->addch(std->height()-1,std->width()/2,ACS_BTEE);
+ std->addch(std->height()/2,0,ACS_LTEE);
+ std->addch(std->height()/2,std->width()-1,ACS_RTEE);
+ std->addch(std->height()/2,std->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 std is just convenient - We know it's always
+ // valid until the end of the program.
+
+ std->refresh();
+ sleep(sleeptime);
+
+ // Show what happens when panels are deleted and moved.
+
+ sleep(sleeptime);
+ delete u;
+ std->refresh();
+
+ sleep(sleeptime);
+ delete z;
+ std->refresh();
+
+ sleep(sleeptime);
+ delete v;
+ std->refresh();
+
+ // show how it looks when a panel moves
+ sleep(sleeptime);
+ y->mvwin(5,30);
+ std->refresh();
+
+ sleep(sleeptime);
+ delete y;
+ std->refresh();
+
+ // show how it looks when you raise a panel
+ sleep(sleeptime);
+ w->top();
+ std->refresh();
+
+ sleep(sleeptime);
+ delete w;
+ std->refresh();
+
+ sleep(sleeptime);
+ delete x;
+
+ std->clear();
+ std->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 std;
+ }
+};
+
+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, (const char*)0, p_UserData)
+ {};
+
+ ~MyAction() {}
+
+ bool action() {
+ SillyDemo a;
+ a.run(NCursesUserItem<T>::UserData()->sleeptime());
+ return FALSE;
+ }
+};
+
+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,(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) {
+ 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 char *weekdays[];
+
+public:
+ TestForm() : NCursesForm(13,51,(lines()-15)/2,(cols()-53)/2) {
+
+ 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() {
+ delete mft;
+ delete ift;
+ delete eft;
+ }
+};
+
+char* TestForm::weekdays[] = {
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday", (char *)0 };
+//
+// -------------------------------------------------------------------------
+//
+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[5];
+ ::sprintf(buf,"Frm%02d",i);
+ (*S)[i] = buf; // Text
+ (*S)[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification
+ }
+ NCursesApplication::getApplication()->push(*S);
+ F();
+ NCursesApplication::getApplication()->pop();
+ 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 std;
+ NCursesPanel P(std.lines()-2,std.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((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 MyMenu : public NCursesMenu
+{
+private:
+ NCursesPanel* P;
+ NCursesMenuItem** I;
+ UserData *u;
+ static const int n_items = 7;
+
+public:
+ MyMenu ()
+ : NCursesMenu (n_items+2, 8, (lines()-10)/2, (cols()-10)/2)
+ {
+ 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 PassiveItem("Six");
+ 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()
+ {
+ 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[5];
+ ::sprintf(buf,"Key%02d",i);
+ S[i] = buf; // Text
+ S[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification
+ }
+}
+
+void TestApplication::title() {
+ const char * const title = "Simple C++ Binding Demo";
+ const int len = ::strlen(title);
+
+ titleWindow->bkgd(screen_titles());
+ titleWindow->addstr(0,(titleWindow->cols()-len)/2,title);
+ titleWindow->noutrefresh();
+}
+
+
+int TestApplication::run() {
+ MyMenu M;
+ M();
+ return 0;
+}
+
+//
+// -------------------------------------------------------------------------
+//
+static TestApplication Demo;
diff --git a/contrib/ncurses/c++/edit_cfg.sh b/contrib/ncurses/c++/edit_cfg.sh
new file mode 100755
index 000000000000..04f4e2225dca
--- /dev/null
+++ b/contrib/ncurses/c++/edit_cfg.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+# $Id: edit_cfg.sh,v 1.4 1998/02/11 12:13:41 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1997
+#
+# Edit the default value of the etip.h file based on the autoconf-generated
+# values:
+#
+# $1 = ncurses_cfg.h
+# $2 = etip.h
+#
+for name in \
+ HAVE_BUILTIN_H \
+ HAVE_TYPEINFO \
+ HAVE_VALUES_H
+do
+ mv $2 $2.bak
+ if ( grep "[ ]$name[ ]1" $1 2>&1 >/dev/null)
+ then
+ sed -e 's/define '$name'.*$/ define '$name' 1/' $2.bak >$2
+ else
+ sed -e 's/define '$name'.*$/ define '$name' 0/' $2.bak >$2
+ fi
+ if (cmp -s $2 $2.bak)
+ then
+ echo '** same: '$name
+ mv $2.bak $2
+ else
+ echo '** edit: '$name
+ rm -f $2.bak
+ fi
+done
diff --git a/contrib/ncurses/c++/etip.h.in b/contrib/ncurses/c++/etip.h.in
new file mode 100644
index 000000000000..0f7ae823b3cb
--- /dev/null
+++ b/contrib/ncurses/c++/etip.h.in
@@ -0,0 +1,248 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+// $Id: etip.h.in,v 1.10 1999/05/16 17:29:47 juergen Exp $
+
+#ifndef _ETIP_H
+#define _ETIP_H
+
+// These are substituted at configure/build time
+#ifndef HAVE_BUILTIN_H
+#define HAVE_BUILTIN_H 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
+
+#ifdef __GNUG__
+# if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
+# if HAVE_TYPEINFO
+# include <typeinfo>
+# endif
+# endif
+#endif
+
+#if defined(__GNUG__)
+# if HAVE_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
+# include <builtin.h>
+# undef exception
+# endif
+#elif defined (__SUNPRO_CC)
+# include <generic.h>
+# include <string.h>
+#else
+# include <string.h>
+#endif
+
+extern "C" {
+#if HAVE_VALUES_H
+# include <values.h>
+#endif
+
+#include <assert.h>
+#include <eti.h>
+#include <errno.h>
+}
+
+// Forward Declarations
+class NCursesPanel;
+class NCursesMenu;
+class NCursesForm;
+
+class NCursesException
+{
+public:
+ const char *message;
+ int errorno;
+
+ NCursesException (const char* msg, int err)
+ : message(msg), errorno (err)
+ {};
+
+ NCursesException (const char* msg)
+ : message(msg), errorno (E_SYSTEM_ERROR)
+ {};
+
+ virtual const char *classname() const {
+ return "NCursesWindow";
+ }
+};
+
+class NCursesPanelException : public NCursesException
+{
+public:
+ const NCursesPanel* p;
+
+ NCursesPanelException (const char *msg, int err) :
+ NCursesException (msg, err),
+ p ((NCursesPanel*)0)
+ {};
+
+ NCursesPanelException (const NCursesPanel* panel,
+ const char *msg,
+ int err) :
+ NCursesException (msg, err),
+ p (panel)
+ {};
+
+ NCursesPanelException (int err) :
+ NCursesException ("panel library error", err),
+ p ((NCursesPanel*)0)
+ {};
+
+ NCursesPanelException (const NCursesPanel* panel,
+ int err) :
+ NCursesException ("panel library error", err),
+ p (panel)
+ {};
+
+ virtual const char *classname() const {
+ return "NCursesPanel";
+ }
+
+};
+
+class NCursesMenuException : public NCursesException
+{
+public:
+ const NCursesMenu* m;
+
+ NCursesMenuException (const char *msg, int err) :
+ NCursesException (msg, err),
+ m ((NCursesMenu *)0)
+ {};
+
+ NCursesMenuException (const NCursesMenu* menu,
+ const char *msg,
+ int err) :
+ NCursesException (msg, err),
+ m (menu)
+ {};
+
+ NCursesMenuException (int err) :
+ NCursesException ("menu library error", err),
+ m ((NCursesMenu *)0)
+ {};
+
+ NCursesMenuException (const NCursesMenu* menu,
+ int err) :
+ NCursesException ("menu library error", err),
+ m (menu)
+ {};
+
+ virtual const char *classname() const {
+ return "NCursesMenu";
+ }
+
+};
+
+class NCursesFormException : public NCursesException
+{
+public:
+ const NCursesForm* f;
+
+ NCursesFormException (const char *msg, int err) :
+ NCursesException (msg, err),
+ f ((NCursesForm*)0)
+ {};
+
+ NCursesFormException (const NCursesForm* form,
+ const char *msg,
+ int err) :
+ NCursesException (msg, err),
+ f (form)
+ {};
+
+ NCursesFormException (int err) :
+ NCursesException ("form library error", err),
+ f ((NCursesForm*)0)
+ {};
+
+ NCursesFormException (const NCursesForm* form,
+ int err) :
+ NCursesException ("form library error", err),
+ f (form)
+ {};
+
+ virtual const char *classname() const {
+ return "NCursesForm";
+ }
+
+};
+
+#if !(defined(__GNUG__)||defined(__SUNPRO_CC))
+# include <iostream.h>
+ extern "C" void exit(int);
+#endif
+
+inline void THROW(const NCursesException *e) {
+#if defined(__GNUG__)
+# if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8))
+ (*lib_error_handler)(e?e->classname():"",e?e->message:"");
+#else
+ throw *e;
+#endif
+#elif defined(__SUNPRO_CC)
+ genericerror(1, ((e != 0) ? (char *)(e->message) : ""));
+#else
+ if (e)
+ cerr << e->message << endl;
+ exit(0);
+#endif
+}
+
+#define THROWS(s)
+
+#endif // _ETIP_H
diff --git a/contrib/ncurses/c++/headers b/contrib/ncurses/c++/headers
new file mode 100644
index 000000000000..3470386adf02
--- /dev/null
+++ b/contrib/ncurses/c++/headers
@@ -0,0 +1,39 @@
+# C++ headers
+# $Id: headers,v 1.2 1998/02/11 12:13:40 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1997
+#
+$(srcdir)/cursesapp.h
+$(srcdir)/cursesf.h
+$(srcdir)/cursesm.h
+$(srcdir)/cursesp.h
+$(srcdir)/cursesw.h
+$(srcdir)/cursslk.h
+etip.h
diff --git a/contrib/ncurses/c++/internal.h b/contrib/ncurses/c++/internal.h
new file mode 100644
index 000000000000..cdf256cbd71e
--- /dev/null
+++ b/contrib/ncurses/c++/internal.h
@@ -0,0 +1,47 @@
+// * This makes emacs happy -*-Mode: C++;-*-
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1997 *
+ ****************************************************************************/
+
+// $Id: internal.h,v 1.5 1999/05/16 17:29:25 juergen Exp $
+
+#ifndef _CPLUS_INTERNAL_H
+#define _CPLUS_INTERNAL_H 1
+
+#ifdef USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id) /*nothing*/
+#endif
+
+#define CTRL(x) ((x) & 0x1f)
+
+#endif
diff --git a/contrib/ncurses/c++/modules b/contrib/ncurses/c++/modules
new file mode 100644
index 000000000000..0709805847d2
--- /dev/null
+++ b/contrib/ncurses/c++/modules
@@ -0,0 +1,43 @@
+# Program modules
+# $Id: modules,v 1.6 1999/07/31 09:46:54 juergen Exp $
+##############################################################################
+# Copyright (c) 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> 1995,1997
+#
+
+@ base
+cursesf c++ $(srcdir) $(cursesf_h) $(cursesapp_h)
+cursesm c++ $(srcdir) $(cursesm_h) $(cursesapp_h)
+cursesp c++ $(srcdir) $(cursesp_h)
+cursesw c++ $(srcdir) $(cursesw_h)
+cursespad c++ $(srcdir) $(cursesw_h)
+cursslk c++ $(srcdir) $(cursslk_h) $(cursesapp_h)
+cursesapp c++ $(srcdir) $(cursesapp_h)
+cursesmain c++ $(srcdir) $(cursesapp_h)
+demo c++ $(srcdir) $(cursesf_h) $(cursesm_h) $(cursesapp_h)
diff --git a/contrib/ncurses/config.guess b/contrib/ncurses/config.guess
new file mode 100755
index 000000000000..729d6cfef518
--- /dev/null
+++ b/contrib/ncurses/config.guess
@@ -0,0 +1,969 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+#
+# 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 2 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# 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.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; 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
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ alpha:OSF1:*:*)
+ if test $UNAME_RELEASE = "V4.0"; then
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ fi
+ # 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.
+ cat <<EOF >dummy.s
+ .globl main
+ .ent main
+main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ ${CC-cc} dummy.s -o dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+ fi
+ rm -f dummy.s dummy
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ arc64:OpenBSD:*:*)
+ echo mips64el-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hkmips:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ arm32:NetBSD:*:*)
+ echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ SR2?01:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:*|MIS*:OSx*:*:*|MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ 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.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ 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'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:NetBSD:*:*)
+ echo powerpc-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ sed 's/^ //' << EOF >dummy.c
+ int main (argc, argv) int argc; char **argv; {
+ #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-cc} dummy.c -o dummy \
+ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ *:MVS:*:* | *:OS390:*:*|*:OS/390:*:*)
+ # uname -m gives a processor model number /* S/390 -- gil -- 1389 */
+ echo s390-ibm-os390 # on R1 and R2, uname -s reports OS390
+ exit 0 ;; # on R3, uname -s reports OS/390
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ sed 's/^ //' << EOF >dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:4)
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=4.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[34678]??:HP-UX:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/6?? | 9000/7?? | 9000/80[024] | 9000/8?[13679] | 9000/892 )
+ sed 's/^ //' << EOF >dummy.c
+ #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
+ (${CC-cc} dummy.c -o dummy 2>/dev/null ) && HP_ARCH=`./dummy`
+ rm -f dummy.c dummy
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ 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-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i?86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+ # uname on the ARM produces all sorts of strangeness, and we need to
+ # filter it out.
+ case "$UNAME_MACHINE" in
+ arm* | sa110*) UNAME_MACHINE="arm" ;;
+ esac
+
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+ ld_supported_emulations=`echo $ld_help_string \
+ | sed -ne '/supported emulations:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported emulations: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_emulations" in
+ i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
+ i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
+ sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;;
+ esac
+
+ if test "${UNAME_MACHINE}" = "alpha" ; then
+ sed 's/^ //' <<EOF >dummy.s
+ .globl main
+ .ent main
+ main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ LIBC=""
+ ${CC-cc} dummy.s -o dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+
+ objdump --private-headers dummy | \
+ grep ld.so.1 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f dummy.s dummy
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+ elif test "${UNAME_MACHINE}" = "mips" ; then
+ cat >dummy.c <<EOF
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#ifdef __MIPSEB__
+ printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+ printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld)
+ # or one that does not give us useful --help.
+ # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ # If ld does not provide *any* "supported emulations:"
+ # that means it is gnuoldld.
+ echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+ test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+ case "${UNAME_MACHINE}" in
+ i?86)
+ VENDOR=pc;
+ ;;
+ *)
+ VENDOR=unknown;
+ ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ cat >dummy.c <<EOF
+#include <features.h>
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#ifdef __ELF__
+# ifdef __GLIBC__
+# if (__GLIBC__ >= 2)
+ printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+ printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ fi ;;
+# 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.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ 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.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ # SysVr5/Unixware7
+ i?86:*:5*:* | i?86:SYSTEM_V:5*:*)
+ if uname -a | grep SCO >/dev/null 2>/dev/null ; then
+ (/bin/uname -s|egrep UnixWare >/dev/null) && UNAME_VER=uw${UNAME_VERSION}
+ if /bin/uname -X 2>/dev/null >/dev/null ; then
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ fi
+ echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}${UNAME_VER}
+ else
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv4.2uw${UNAME_VERSION}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ i?86:UnixWare:*:*)
+ if /bin/uname -X 2>/dev/null >/dev/null ; then
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ fi
+ echo ${UNAME_MACHINE}-unixware-${UNAME_RELEASE}-${UNAME_VERSION}
+ exit 0 ;;
+ pc:*:*:*)
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*: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 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ i?86:LynxOS:2.*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:*:6*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#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 (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#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`;
+ printf ("%s-next-nextstep%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)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/contrib/ncurses/config.sub b/contrib/ncurses/config.sub
new file mode 100755
index 000000000000..9c47333ac991
--- /dev/null
+++ b/contrib/ncurses/config.sub
@@ -0,0 +1,967 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# 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 2 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# 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.
+
+# 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.
+
+# 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.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ linux-gnu*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -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)
+ os=
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+ | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+ | 580 | i960 | h8300 \
+ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w \
+ | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
+ | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
+ | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+ | mipstx39 | mipstx39el \
+ | sparc | sparclet | sparclite | sparc64 | v850)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # 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[34567]86)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+ | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+ | xmp-* | ymp-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
+ | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
+ | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
+ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+ | sparc64-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* \
+ | mipstx39-* | mipstx39el-* \
+ | f301-*)
+ ;;
+ # 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)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-cbm
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-cbm
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ s390 | s390-ibm*)
+# OS/390 support after:
+# Linkname: Mortice Kern Systems (MKS) Inc. - OS/390 OpenEdition -- GNU Utilities Downloads
+# URL: http://www.mks.com/s390/gnu/download.htm#autoconf
+ basic_machine=s390-ibm # /* S/390 -- gil -- 1419 */
+ os=-os390
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[34567]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[34567]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[34567]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[34567]86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ mipsel*-linux*)
+ basic_machine=mipsel-unknown
+ os=-linux-gnu
+ ;;
+ mips*-linux*)
+ basic_machine=mips-unknown
+ os=-linux-gnu
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | nexen)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | k6 | 6x86)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | nexen-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | k6-* | 6x86-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# 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.
+ mips)
+ if [ x$os = x-linux-gnu ]; then
+ basic_machine=mips-unknown
+ else
+ basic_machine=mips-mips
+ fi
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+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.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* | -os390* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -uxpv* | -beos*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+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.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ s390-ibm)
+ os=-os390 # /* S/390 -- gil -- 1451 */
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-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
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f301-fujitsu)
+ os=-uxpv
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/contrib/ncurses/configure b/contrib/ncurses/configure
new file mode 100755
index 000000000000..466b08103835
--- /dev/null
+++ b/contrib/ncurses/configure
@@ -0,0 +1,7085 @@
+#! /bin/sh
+
+# From configure.in Revision: 1.169
+
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13.19990117
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+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
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # 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 ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$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" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) 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)
+ # 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
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --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
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+cat <<EOF
+--enable and --with options recognized:
+ --with-system-type=XXX test: override derived host system-type
+ --enable-add-ons=DIR... used to check if we are a glibc add-on.
+ --without-cxx suppress check for C++, don't build demo
+ --without-ada suppress check for Ada95, don't build demo
+ --without-progs suppress build with programs (e.g., tic)
+ --with-install-prefix prefixes actual install-location
+Options to Specify How Manpages are Installed:
+ --with-manpage-format specify manpage-format: gzip/compress/BSDI/normal and
+ optionally formatted, e.g., gzip,formatted
+ --with-manpage-renames specify manpage-renaming
+Options to Specify the Libraries Built/Used:
+ --with-shared generate shared-libraries
+ --with-normal generate normal-libraries (default)
+ --with-debug generate debug-libraries (default)
+EOF
+cat <<EOF
+ --with-profile generate profile-libraries
+ --with-termlib generate separate terminfo library
+ --with-dbmalloc test: use Conor Cahill's dbmalloc library
+ --with-dmalloc test: use Gray Watson's dmalloc library
+ --with-gpm use Alessandro Rubini's GPM library
+ --enable-rpath use rpath option when generating shared libraries
+ --with-shlib-version=X Specify rel or abi version for shared libs
+Fine-Tuning Your Configuration:
+ --disable-overwrite leave out the link to -lcurses
+ --disable-database use only built-in data
+ --disable-ext-funcs disable function-extensions
+ --with-fallbacks=XXX specify list of fallback terminal descriptions
+EOF
+cat <<EOF
+ --with-terminfo-dirs=XXX specify list of terminfo directories (default: DATADIR/terminfo)
+ --disable-big-core assume machine has little memory
+ --enable-termcap compile in termcap fallback support
+ --enable-getcap fast termcap load, no xrefs to terminfo
+ --enable-getcap-cache cache translated termcaps in ~/.terminfo
+ --enable-symlinks make tic use symbolic links not hard links
+ --enable-bsdpad recognize BSD-style prefix padding
+ --enable-const compile with extra/non-standard const
+ --with-rcs-ids compile-in RCS identifiers
+Experimental Code:
+ --with-develop enable all experimental options for testing
+ --enable-broken_linker compile with broken-linker support code
+EOF
+cat <<EOF
+ --enable-hard-tabs compile with experimental hard-tabs code
+ --enable-hashmap compile with experimental hashmap code
+ --enable-no-padding compile with experimental no-padding code
+ --enable-safe-sprintf compile with experimental safe-sprintf code
+ --disable-scroll-hints compile hashmap without scroll-hints code
+ --enable-tcap-names compile with experimental definable-name code
+ --enable-sigwinch compile with experimental SIGWINCH handler
+ --enable-widec compile with experimental wide-char code
+ --enable-xmc-glitch compile with experimental xmc code
+Testing/development Options:
+ --enable-echo build: display "compiling" commands (default)
+ --enable-warnings build: turn on GCC compiler warnings
+EOF
+cat <<EOF
+ --enable-assertions test: turn on generation of assertion code
+ --disable-leaks test: suppress permanent memory-leaks
+ --enable-expanded test: generate functions for certain macros
+ --disable-macros test: use functions rather than macros
+Ada95 Binding Options:
+ --with-ada-compiler=CMD Specify Ada95 compiler command (default gnatmake)
+ --with-ada-include=DIR Ada includes are in DIR (default: PREFIX/lib/gnu-Ada/adainclude)
+ --with-ada-objects=DIR Ada objects are in DIR (default: PREFIX/lib/gnu-Ada/adalib)
+EOF
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$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" ;;
+
+ -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 ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13.19990117"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ 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 "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+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_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+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
+
+# 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
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=ncurses/base/lib_initscr.c
+
+# 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 "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# 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 "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+NCURSES_MAJOR="`egrep '^NCURSES_MAJOR[ ]*=' $srcdir/dist.mk | sed -e 's/^[^0-9]*//'`"
+NCURSES_MINOR="`egrep '^NCURSES_MINOR[ ]*=' $srcdir/dist.mk | sed -e 's/^[^0-9]*//'`"
+NCURSES_PATCH="`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}
+echo "$ac_t""Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version (`date`)" 1>&6
+
+
+
+
+
+
+
+
+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
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+if test -f $srcdir/config.guess ; then
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:639: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+ 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 eval "test \"`echo '$''{'cf_cv_system_name'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&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 "$ac_t"""Configuring for $cf_cv_system_name"" 1>&6
+
+if test ".$system_name" != ".$cf_cv_system_name" ; then
+ echo "$ac_t""Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" 1>&6
+ { echo "configure: error: "Please remove config.cache and try again."" 1>&2; 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 "configure: warning: overriding system type to $withval" 1>&2
+ cf_cv_system_name=$withval
+fi
+
+
+# We need a configure script only when compiling as part of GNU C library.
+# Here we have to generate one of the files we need while compiling.
+#
+# The only problem is that users of the package might think they have to
+# run configure themself and find it irritating when nothing happens.
+#
+# So we try here to find out whether we are called from the glibc configure
+# or by a user.
+#
+
+# Check whether --enable-add-ons or --disable-add-ons was given.
+if test "${enable_add_ons+set}" = set; then
+ enableval="$enable_add_ons"
+ glibc_add_on=yes
+else
+ glibc_add_on=
+fi
+
+
+if test x"$glibc_add_on" = "xyes" ; then
+ rm -f $srcdir/Banner
+ # We are in glibc.
+ rm -f $srcdir/Makefile
+ cp $srcdir/Makefile.glibc $srcdir/Makefile
+ echo "ncurses `grep \"^[ ]*ncurses-version[ ]*=.*$\" \
+ $srcdir/Makefile | sed -e \
+ 's/^[ ]*ncurses-version[ ]*=[ ]*\([^ ^ ]*\)[ ]*$/\1/'`" > $srcdir/Banner
+ exit 0
+fi
+
+### Save the given $CFLAGS to allow user-override.
+cf_user_CFLAGS="$CFLAGS"
+
+### Default install-location
+
+echo $ac_n "checking for prefix""... $ac_c" 1>&6
+echo "configure:730: checking for prefix" >&5
+if test "x$prefix" = "xNONE" ; then
+ case "$cf_cv_system_name" in
+ # non-vendor systems don't have a conflict
+ openbsd*|netbsd*|freebsd*|linux*)
+ prefix=/usr
+ ;;
+ *) prefix=$ac_default_prefix
+ ;;
+ esac
+fi
+echo "$ac_t""$prefix" 1>&6
+
+if test "x$prefix" = "xNONE" ; then
+echo $ac_n "checking for default include-directory""... $ac_c" 1>&6
+echo "configure:745: checking for default include-directory" >&5
+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 NCURSES_VERSION $cf_dir/curses.h 2>&1 >/dev/null ) ; then
+ includedir="$cf_symbol"
+ test -n "$verbose" && echo $ac_n " found " 1>&6
+ break
+ fi
+ fi
+ test -n "$verbose" && echo " tested $cf_dir" 1>&6
+done
+echo "$ac_t""$includedir" 1>&6
+fi
+
+
+### Checks for programs.
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:775: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:805: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+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 $# -gt 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" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:856: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:888: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 899 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:904: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:930: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:935: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:944: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:963: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&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
+
+if test -n "$GCC" ; then
+echo $ac_n "checking version of gcc""... $ac_c" 1>&6
+echo "configure:996: checking version of gcc" >&5
+eval "$CC --version"
+fi
+if test $host != $build; then
+ for ac_prog in $CC 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1005: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$BUILD_CC"; then
+ ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_BUILD_CC="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+BUILD_CC="$ac_cv_prog_BUILD_CC"
+if test -n "$BUILD_CC"; then
+ echo "$ac_t""$BUILD_CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$BUILD_CC" && break
+done
+
+fi
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1036: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1051 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1057: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1068 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1074: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1085 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1091: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:1117: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat > conftest.$ac_ext <<EOF
+#line 1123 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+else
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat > conftest.$ac_ext <<EOF
+#line 1141 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+ fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:1163: checking for POSIXized ISC" >&5
+if test -d /etc/conf/kconfig.d &&
+ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+ echo "$ac_t""yes" 1>&6
+ ISC=yes # If later tests want to check for ISC.
+ cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+ if test "$GCC" = yes; then
+ CC="$CC -posix"
+ else
+ CC="$CC -Xp"
+ fi
+else
+ echo "$ac_t""no" 1>&6
+ ISC=
+fi
+
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1185: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'cf_cv_ansi_cc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+cf_cv_ansi_cc=no
+cf_save_CFLAGS="$CFLAGS"
+# 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 -Aa -D_HPUX_SOURCE
+# SVR4 -Xc
+# UnixWare 1.2 (cannot use -Xc, since ANSI/POSIX clashes)
+for cf_arg in "-DCC_HAS_PROTOS" \
+ "" \
+ -qlanglvl=ansi \
+ -std1 \
+ "-Aa -D_HPUX_SOURCE +e" \
+ "-Aa -D_HPUX_SOURCE" \
+ -Xc
+do
+ CFLAGS="$cf_save_CFLAGS $cf_arg"
+ cat > conftest.$ac_ext <<EOF
+#line 1209 "configure"
+#include "confdefs.h"
+
+#ifndef CC_HAS_PROTOS
+#if !defined(__STDC__) || (__STDC__ != 1)
+choke me
+#endif
+#endif
+
+int main() {
+
+ int test (int i, double x);
+ struct s1 {int (*f) (int a);};
+ struct s2 {int (*f) (double a);};
+; return 0; }
+EOF
+if { (eval echo configure:1225: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cf_cv_ansi_cc="$cf_arg"; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CFLAGS="$cf_save_CFLAGS"
+
+fi
+
+echo "$ac_t""$cf_cv_ansi_cc" 1>&6
+
+if test "$cf_cv_ansi_cc" != "no"; then
+if test ".$cf_cv_ansi_cc" != ".-DCC_HAS_PROTOS"; then
+ CFLAGS="$CFLAGS $cf_cv_ansi_cc"
+else
+ cat >> confdefs.h <<\EOF
+#define CC_HAS_PROTOS 1
+EOF
+
+fi
+fi
+
+
+if test "$cf_cv_ansi_cc" = "no"; then
+ { echo "configure: error: Your compiler does not appear to recognize prototypes.
+You have the following choices:
+ a. adjust your compiler options
+ b. get an up-to-date compiler
+ c. use a wrapper such as unproto" 1>&2; exit 1; }
+fi
+
+
+
+PROG_EXT=
+case $cf_cv_system_name in
+os2*)
+ # We make sure -Zexe is not used -- it would interfere with @PROG_EXT@
+ CFLAGS="$CFLAGS -Zmt -D__ST_MT_ERRNO__"
+ LDFLAGS=`echo "$LDFLAGS -Zmt -Zcrtdll" | sed "s/-Zexe//g"`
+ PROG_EXT=".exe"
+ ;;
+esac
+
+
+
+case "$cf_cv_system_name" in
+freebsd*) #(vi
+ 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1282: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_LDCONFIG'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$LDCONFIG" in
+ /*)
+ ac_cv_path_LDCONFIG="$LDCONFIG" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_LDCONFIG="$LDCONFIG" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$LDPATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_LDCONFIG="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+fi
+LDCONFIG="$ac_cv_path_LDCONFIG"
+if test -n "$LDCONFIG"; then
+ echo "$ac_t""$LDCONFIG" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ ;;
+esac
+
+
+echo $ac_n "checking if you want to build with C++""... $ac_c" 1>&6
+echo "configure:1319: checking if you want to build with C++" >&5
+
+# 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 "$ac_t""$cf_with_cxx" 1>&6
+if test "X$cf_with_cxx" != Xno ; then
+for ac_prog in $CCC c++ g++ gcc CC cxx 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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1336: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CXX="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CXX="$ac_cv_prog_CXX"
+if test -n "$CXX"; then
+ echo "$ac_t""$CXX" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$CXX" && break
+done
+test -n "$CXX" || CXX="gcc"
+
+
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1368: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1379 "configure"
+#include "confdefs.h"
+
+int main(){return(0);}
+EOF
+if { (eval echo configure:1384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cxx_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cxx_cross=no
+ else
+ ac_cv_prog_cxx_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cxx_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
+if test $ac_cv_prog_cxx_works = no; then
+ { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1410: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+cross_compiling=$ac_cv_prog_cxx_cross
+
+echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+echo "configure:1415: checking whether we are using GNU C++" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.C <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1424: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gxx=yes
+else
+ ac_cv_prog_gxx=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+
+if test $ac_cv_prog_gxx = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+
+ac_test_CXXFLAGS="${CXXFLAGS+set}"
+ac_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS=
+echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+echo "configure:1443: checking whether ${CXX-g++} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.cc
+if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+ ac_cv_prog_cxx_g=yes
+else
+ ac_cv_prog_cxx_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cxx_g" 1>&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
+
+fi
+if test -n "$GXX" ; then case "`${CXX-g++} --version`" in 1*|2.[0-6]*) GXX=""; CXX=""; ac_cv_prog_gxx=no; cf_cxx_library=no ; echo No: templates do not work;; esac; fi
+
+echo $ac_n "checking if you want to build with Ada95""... $ac_c" 1>&6
+echo "configure:1478: checking if you want to build with Ada95" >&5
+
+# 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
+
+echo "$ac_t""$cf_with_ada" 1>&6
+
+echo $ac_n "checking if you want to build programs such as tic""... $ac_c" 1>&6
+echo "configure:1491: checking if you want to build programs such as tic" >&5
+
+# 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 "$ac_t""$cf_with_progs" 1>&6
+
+modules_to_build="ncurses"
+if test "X$cf_with_progs" != Xno ; then
+modules_to_build="$modules_to_build progs tack"
+fi
+modules_to_build="$modules_to_build panel menu form"
+
+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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1514: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AWK="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AWK="$ac_cv_prog_AWK"
+if test -n "$AWK"; then
+ echo "$ac_t""$AWK" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$AWK" && break
+done
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1544: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 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 conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# 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
+# 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 $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1582: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/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 test -f $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.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+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 "$ac_t""$INSTALL" 1>&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_PROGRAM}'
+
+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 $ac_n "checking for long file names""... $ac_c" 1>&6
+echo "configure:1645: checking for long file names" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_long_file_names'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&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.
+ (echo 1 > $ac_dir/conftest9012345) 2>/dev/null
+ (echo 2 > $ac_dir/conftest9012346) 2>/dev/null
+ val=`cat $ac_dir/conftest9012345 2>/dev/null`
+ if test ! -f $ac_dir/conftest9012345 || test "$val" != 1; then
+ ac_cv_sys_long_file_names=no
+ rm -f $ac_dir/conftest9012345 $ac_dir/conftest9012346 2>/dev/null
+ break
+ fi
+ rm -f $ac_dir/conftest9012345 $ac_dir/conftest9012346 2>/dev/null
+done
+fi
+
+echo "$ac_t""$ac_cv_sys_long_file_names" 1>&6
+if test $ac_cv_sys_long_file_names = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_LONG_FILE_NAMES 1
+EOF
+
+fi
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1689: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1712: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+for ac_prog in tdlint lint alint
+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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1744: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LINT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$LINT"; then
+ ac_cv_prog_LINT="$LINT" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_LINT="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+LINT="$ac_cv_prog_LINT"
+if test -n "$LINT"; then
+ echo "$ac_t""$LINT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$LINT" && break
+done
+
+for ac_prog in man man_db
+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 $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1778: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_MAN'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$MAN"; then
+ ac_cv_prog_MAN="$MAN" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_MAN="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+MAN="$ac_cv_prog_MAN"
+if test -n "$MAN"; then
+ echo "$ac_t""$MAN" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$MAN" && break
+done
+
+
+
+if eval "test \"`echo '$''{'cf_cv_subst_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+echo $ac_n "checking for loader (symbol LD)""... $ac_c" 1>&6
+echo "configure:1814: checking for loader (symbol LD)" >&5
+test -z "$LD" && LD=ld
+echo "$ac_t""$LD" 1>&6
+
+cf_cv_subst_LD=$LD
+fi
+
+LD=${cf_cv_subst_LD}
+
+if eval "test \"`echo '$''{'cf_cv_subst_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+echo $ac_n "checking for archiver (symbol AR)""... $ac_c" 1>&6
+echo "configure:1828: checking for archiver (symbol AR)" >&5
+test -z "$AR" && AR=ar
+echo "$ac_t""$AR" 1>&6
+
+cf_cv_subst_AR=$AR
+fi
+
+AR=${cf_cv_subst_AR}
+
+if eval "test \"`echo '$''{'cf_cv_subst_AR_OPTS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+echo $ac_n "checking for archiver options (symbol AR_OPTS)""... $ac_c" 1>&6
+echo "configure:1842: checking for archiver options (symbol AR_OPTS)" >&5
+test -z "$AR_OPTS" && AR_OPTS=rv
+echo "$ac_t""$AR_OPTS" 1>&6
+
+cf_cv_subst_AR_OPTS=$AR_OPTS
+fi
+
+AR_OPTS=${cf_cv_subst_AR_OPTS}
+
+
+
+echo $ac_n "checking for makeflags variable""... $ac_c" 1>&6
+echo "configure:1854: checking for makeflags variable" >&5
+if eval "test \"`echo '$''{'cf_cv_makeflags'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cf_cv_makeflags=''
+ for cf_option in '-$(MAKEFLAGS)' '$(MFLAGS)'
+ do
+ cat >cf_makeflags.tmp <<CF_EOF
+all :
+ @ echo '.$cf_option'
+CF_EOF
+ cf_result=`${MAKE-make} -k -f cf_makeflags.tmp 2>/dev/null`
+ case "$cf_result" in
+ .*k)
+ 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 no match "$cf_result"
+ ;;
+ esac
+ done
+ rm -f cf_makeflags.tmp
+fi
+
+echo "$ac_t""$cf_cv_makeflags" 1>&6
+
+
+
+echo $ac_n "checking if you have specified an install-prefix""... $ac_c" 1>&6
+echo "configure:1890: checking if you have specified an install-prefix" >&5
+
+# 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 #(vi
+ yes|no) #(vi
+ ;;
+ *) INSTALL_PREFIX="$withval"
+ ;;
+ esac
+fi
+
+echo "$ac_t""$INSTALL_PREFIX" 1>&6
+
+
+###############################################################################
+
+
+ echo $ac_n "checking format of man-pages""... $ac_c" 1>&6
+echo "configure:1910: checking format of man-pages" >&5
+
+
+# Check whether --with-manpage-format or --without-manpage-format was given.
+if test "${with_manpage_format+set}" = set; then
+ withval="$with_manpage_format"
+ cf_manpage_form=$withval
+else
+ cf_manpage_form=unknown
+fi
+
+
+case ".$cf_manpage_form" in
+.gzip|.compress|.BSDI|.normal|.formatted) # (vi
+ ;;
+.unknown|.) # (vi
+ if test -z "$MANPATH" ; then
+ MANPATH="/usr/man:/usr/share/man"
+ fi
+ # look for the 'date' man-page (it's most likely to be installed!)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ cf_manpage_form=unknown
+ for cf_dir in $MANPATH; do
+ test -z "$cf_dir" && cf_dir=/usr/man
+ for cf_name in $cf_dir/*/date.[01]* $cf_dir/*/date
+ do
+ cf_test=`echo $cf_name | sed -e 's/*//'`
+ if test "x$cf_test" = "x$cf_name" ; then
+ case "$cf_name" in
+ *.gz) cf_manpage_form=gzip;;
+ *.Z) cf_manpage_form=compress;;
+ *.0) cf_manpage_form=BSDI,formatted;;
+ *) cf_manpage_form=normal;;
+ esac
+ break
+ fi
+ done
+ if test "$cf_manpage_form" != "unknown" ; then
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+.*) # (vi
+ echo "configure: warning: Unexpected manpage-format" 1>&2
+ ;;
+esac
+
+echo "$ac_t""$cf_manpage_form" 1>&6
+
+
+echo $ac_n "checking for manpage renaming""... $ac_c" 1>&6
+echo "configure:1962: checking for manpage renaming" >&5
+
+
+# Check whether --with-manpage-renames or --without-manpage-renames was given.
+if test "${with_manpage_renames+set}" = set; then
+ withval="$with_manpage_renames"
+ cf_manpage_renames=$withval
+else
+ cf_manpage_renames=yes
+fi
+
+
+case ".$cf_manpage_renames" in #(vi
+.no) #(vi
+ ;;
+.|.yes)
+ # Debian 'man' program?
+ if test -f /etc/debian_version ; then
+ cf_manpage_renames=`cd $srcdir && pwd`/man/man_db.renames
+ else
+ cf_manpage_renames=no
+ fi
+ ;;
+esac
+
+if test "$cf_manpage_renames" != no ; then
+ if test ! -f $cf_manpage_renames ; then
+ { echo "configure: error: not a filename: $cf_manpage_renames" 1>&2; exit 1; }
+ fi
+
+ test ! -d man && mkdir man
+
+ # Construct a sed-script to perform renaming within man-pages
+ if test -n "$cf_manpage_renames" ; then
+ test ! -d man && mkdir man
+ $srcdir/man/make_sed.sh $cf_manpage_renames >man/edit_man.sed
+ fi
+fi
+
+echo "$ac_t""$cf_manpage_renames" 1>&6
+
+
+ if test "$prefix" = "NONE" ; then
+ cf_prefix="$ac_default_prefix"
+ else
+ cf_prefix="$prefix"
+ fi
+
+ case "$cf_manpage_form" in # (vi
+ *formatted*) # (vi
+ cf_subdir='$mandir/cat'
+ cf_format=yes
+ ;;
+ *)
+ cf_subdir='$mandir/man'
+ cf_format=no
+ ;;
+ esac
+
+test ! -d man && mkdir man
+cat >man/edit_man.sh <<CF_EOF
+#! /bin/sh
+# this script is generated by the configure-script
+prefix="$cf_prefix"
+datadir="$datadir"
+MKDIRS="`cd $srcdir && pwd`/mkinstalldirs"
+INSTALL="$INSTALL"
+INSTALL_DATA="$INSTALL_DATA"
+TMP=\${TMPDIR-/tmp}/man\$\$
+trap "rm -f \$TMP" 0 1 2 5 15
+
+verb=\$1
+shift
+
+mandir=\$1
+shift
+
+for i in \$* ; do
+case \$i in #(vi
+*.orig|*.rej) ;; #(vi
+*.[0-9]*)
+ section=\`expr "\$i" : '.*\\.\\([0-9]\\)[xm]*'\`;
+ if test \$verb = installing ; then
+ if test ! -d $cf_subdir\${section} ; then
+ \$MKDIRS $cf_subdir\$section
+ fi
+ fi
+ source=\`basename \$i\`
+CF_EOF
+if test "$cf_manpage_renames" = no ; then
+cat >>man/edit_man.sh <<CF_EOF
+ target=$cf_subdir\${section}/\$source
+ sed -e "s,@DATADIR@,\$datadir," < \$i >\$TMP
+CF_EOF
+else
+cat >>man/edit_man.sh <<CF_EOF
+ target=\`grep "^\$source" $cf_manpage_renames | $AWK '{print \$2}'\`
+ if test -z "\$target" ; then
+ echo '? missing rename for '\$source
+ target="\$source"
+ fi
+ target="$cf_subdir\$section/\$target"
+ test \$verb = installing && sed -e "s,@DATADIR@,\$datadir," < \$i | sed -f edit_man.sed >\$TMP
+CF_EOF
+fi
+if test $cf_format = yes ; then
+cat >>man/edit_man.sh <<CF_EOF
+ nroff -man \$TMP >\$TMP.out
+ mv \$TMP.out \$TMP
+CF_EOF
+fi
+case "$cf_manpage_form" in #(vi
+*compress*) #(vi
+cat >>man/edit_man.sh <<CF_EOF
+ if test \$verb = installing ; then
+ if ( compress -f \$TMP )
+ then
+ mv \$TMP.Z \$TMP
+ fi
+ fi
+ target="\$target.Z"
+CF_EOF
+ ;;
+*gzip*) #(vi
+cat >>man/edit_man.sh <<CF_EOF
+ if test \$verb = installing ; then
+ if ( gzip -f \$TMP )
+ then
+ mv \$TMP.gz \$TMP
+ fi
+ fi
+ target="\$target.gz"
+CF_EOF
+ ;;
+*BSDI*)
+cat >>man/edit_man.sh <<CF_EOF
+ # BSDI installs only .0 suffixes in the cat directories
+ target="\`echo \$target|sed -e 's/\.[1-9]\+.\?/.0/'\`"
+CF_EOF
+ ;;
+esac
+cat >>man/edit_man.sh <<CF_EOF
+ echo \$verb \$target
+ if test \$verb = installing ; then
+ \$INSTALL_DATA \$TMP \$target
+ else
+ rm -f \$target
+ fi
+ ;;
+esac
+done
+CF_EOF
+chmod 755 man/edit_man.sh
+
+
+
+###############################################################################
+
+
+### 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 $ac_n "checking if you want to build shared libraries""... $ac_c" 1>&6
+echo "configure:2127: checking if you want to build shared libraries" >&5
+
+# 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 "$ac_t""$with_shared" 1>&6
+test "$with_shared" = "yes" && cf_list_models="$cf_list_models shared"
+
+echo $ac_n "checking if you want to build static libraries""... $ac_c" 1>&6
+echo "configure:2141: checking if you want to build static libraries" >&5
+
+# 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 "$ac_t""$with_normal" 1>&6
+test "$with_normal" = "yes" && cf_list_models="$cf_list_models normal"
+
+echo $ac_n "checking if you want to build debug libraries""... $ac_c" 1>&6
+echo "configure:2155: checking if you want to build debug libraries" >&5
+
+# 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 "$ac_t""$with_debug" 1>&6
+test "$with_debug" = "yes" && cf_list_models="$cf_list_models debug"
+
+echo $ac_n "checking if you want to build profiling libraries""... $ac_c" 1>&6
+echo "configure:2169: checking if you want to build profiling libraries" >&5
+
+# 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 "$ac_t""$with_profile" 1>&6
+test "$with_profile" = "yes" && cf_list_models="$cf_list_models profile"
+
+echo $ac_n "checking if you want to build a separate terminfo library""... $ac_c" 1>&6
+echo "configure:2183: checking if you want to build a separate terminfo library" >&5
+
+# 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 "$ac_t""$with_termlib" 1>&6
+
+### Checks for special libraries, must be done up-front.
+echo $ac_n "checking if you want to link with dbmalloc for testing""... $ac_c" 1>&6
+echo "configure:2197: checking if you want to link with dbmalloc for testing" >&5
+
+# Check whether --with-dbmalloc or --without-dbmalloc was given.
+if test "${with_dbmalloc+set}" = set; then
+ withval="$with_dbmalloc"
+ with_dbmalloc=$withval
+else
+ with_dbmalloc=no
+fi
+
+echo "$ac_t""$with_dbmalloc" 1>&6
+if test $with_dbmalloc = yes ; then
+ echo $ac_n "checking for debug_malloc in -ldbmalloc""... $ac_c" 1>&6
+echo "configure:2210: checking for debug_malloc in -ldbmalloc" >&5
+ac_lib_var=`echo dbmalloc'_'debug_malloc | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldbmalloc $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2218 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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() {
+debug_malloc()
+; return 0; }
+EOF
+if { (eval echo configure:2229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo dbmalloc | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-ldbmalloc $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking if you want to link with dmalloc for testing""... $ac_c" 1>&6
+echo "configure:2259: checking if you want to link with dmalloc for testing" >&5
+
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+ withval="$with_dmalloc"
+ with_dmalloc=$withval
+else
+ with_dmalloc=no
+fi
+
+echo "$ac_t""$with_dmalloc" 1>&6
+if test $with_dmalloc = yes ; then
+ echo $ac_n "checking for dmalloc_debug in -ldmalloc""... $ac_c" 1>&6
+echo "configure:2272: checking for dmalloc_debug in -ldmalloc" >&5
+ac_lib_var=`echo dmalloc'_'dmalloc_debug | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldmalloc $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2280 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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() {
+dmalloc_debug()
+; return 0; }
+EOF
+if { (eval echo configure:2291: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo dmalloc | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-ldmalloc $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+SHLIB_LIST=""
+echo $ac_n "checking if you want to link with the gpm mouse library""... $ac_c" 1>&6
+echo "configure:2322: checking if you want to link with the gpm mouse library" >&5
+
+# 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=no
+fi
+
+echo "$ac_t""$with_gpm" 1>&6
+if test $with_gpm = yes ; then
+ echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
+echo "configure:2335: checking for Gpm_Open in -lgpm" >&5
+ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lgpm -lcurses -ltermcap $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2343 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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() {
+Gpm_Open()
+; return 0; }
+EOF
+if { (eval echo configure:2354: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+
+ EXTRA_LIBS="-lgpm -lncurses $EXTRA_LIBS"
+ SHLIB_LIST="-lgpm $SHLIB_LIST"
+ cat >> confdefs.h <<\EOF
+#define HAVE_LIBGPM 1
+EOF
+
+ for ac_hdr in gpm.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2380: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2385 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2390: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+TINFO_LIST="$SHLIB_LIST"
+test $with_termlib = yes && SHLIB_LIST="$SHLIB_LIST -ltinfo"
+
+
+
+
+
+echo $ac_n "checking for specified models""... $ac_c" 1>&6
+echo "configure:2431: checking for specified models" >&5
+test -z "$cf_list_models" && cf_list_models=normal
+echo "$ac_t""$cf_list_models" 1>&6
+
+### Use the first model as the default, and save its suffix for use in building
+### up test-applications.
+DFT_LWR_MODEL=`echo $cf_list_models | $AWK '{print $1}'`
+
+DFT_UPR_MODEL=`echo $DFT_LWR_MODEL | tr '[a-z]' '[A-Z]'`
+
+
+ case $DFT_LWR_MODEL in
+ normal) DFT_DEP_SUFFIX='.a' ;;
+ debug) DFT_DEP_SUFFIX='_g.a' ;;
+ profile) DFT_DEP_SUFFIX='_p.a' ;;
+ shared)
+ case $cf_cv_system_name in
+ openbsd*|netbsd*|freebsd*)
+ DFT_DEP_SUFFIX='.so.$(REL_VERSION)' ;;
+ hpux*) DFT_DEP_SUFFIX='.sl' ;;
+ *) DFT_DEP_SUFFIX='.so' ;;
+ esac
+ esac
+
+ case $DFT_LWR_MODEL in
+ normal) DFT_ARG_SUFFIX='' ;;
+ debug) DFT_ARG_SUFFIX='_g' ;;
+ profile) DFT_ARG_SUFFIX='_p' ;;
+ shared) DFT_ARG_SUFFIX='' ;;
+ esac
+
+ case $DFT_LWR_MODEL in
+ normal) DFT_OBJ_SUBDIR='objects' ;;
+ debug) DFT_OBJ_SUBDIR='obj_g' ;;
+ profile) DFT_OBJ_SUBDIR='obj_p' ;;
+ shared) DFT_OBJ_SUBDIR='obj_s' ;;
+ esac
+
+TINFO_NAME=tinfo
+
+
+LIB_NAME=ncurses
+
+
+LIB_DIR=../lib
+
+ case $cf_cv_system_name in
+ os2) cf_prefix='' ;;
+ *) cf_prefix='lib' ;;
+ esac
+
+LIB_PREFIX=$LIB_DIR/$cf_prefix
+
+
+
+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
+
+
+if test X"$CXX_G_OPT" = X"" ; then
+ CXX_G_OPT='-g'
+ test -n "$GXX" && test "${ac_cv_prog_cxx_g}" != yes && CXX_G_OPT=''
+fi
+
+
+case $DFT_LWR_MODEL in
+normal) LD_MODEL='' ;;
+debug) LD_MODEL=$CC_G_OPT ;;
+profile) LD_MODEL='-pg';;
+shared) LD_MODEL='' ;;
+esac
+
+echo $ac_n "checking if rpath option should be used""... $ac_c" 1>&6
+echo "configure:2506: checking if rpath option should be used" >&5
+
+# Check whether --enable-rpath or --disable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+ enableval="$enable_rpath"
+ cf_cv_ld_rpath=$enableval
+else
+ cf_cv_ld_rpath=no
+fi
+
+echo "$ac_t""$cf_cv_ld_rpath" 1>&6
+
+
+
+ LOCAL_LDFLAGS=
+ LOCAL_LDFLAGS2=
+ LD_SHARED_OPTS=
+ INSTALL_LIB="-m 644"
+
+ cf_cv_do_symlinks=no
+
+ echo $ac_n "checking if release/abi version should be used for shared libs""... $ac_c" 1>&6
+echo "configure:2528: checking if release/abi version should be used for shared libs" >&5
+
+# 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 #(vi
+ yes) #(vi
+ cf_cv_shlib_version=auto
+ ;;
+ rel|abi|auto|no) #(vi
+ cf_cv_shlib_version=$withval
+ ;;
+ *)
+ { echo "configure: error: option value must be one of: rel, abi, auto or no" 1>&2; exit 1; }
+ ;;
+ esac
+
+else
+ cf_cv_shlib_version=auto
+fi
+
+ echo "$ac_t""$cf_cv_shlib_version" 1>&6
+
+ cf_cv_rm_so_locs=no
+
+ case $cf_cv_system_name in
+ hpux10.*)
+ # (tested with gcc 2.7.2 -- I don't have c89)
+ if test -n "$GCC"; then
+ CC_SHARED_OPTS='-fPIC'
+ LD_SHARED_OPTS='-Xlinker +b -Xlinker $(libdir)'
+ else
+ CC_SHARED_OPTS='+Z'
+ LD_SHARED_OPTS='-Wl,+b,$(libdir)'
+ fi
+ MK_SHARED_LIB='$(LD) +b $(libdir) -b +h `basename $@` -o $@'
+ # HP-UX shared libraries must be executable, and should be
+ # readonly to exploit a quirk in the memory manager.
+ INSTALL_LIB="-m 555"
+ cf_cv_do_symlinks=reverse
+ ;;
+ hpux*)
+ # (tested with gcc 2.7.2 -- I don't have c89)
+ if test -n "$GCC"; then
+ CC_SHARED_OPTS='-fPIC'
+ LD_SHARED_OPTS='-Xlinker +b -Xlinker $(libdir)'
+ else
+ CC_SHARED_OPTS='+Z'
+ LD_SHARED_OPTS='-Wl,+b,$(libdir)'
+ fi
+ MK_SHARED_LIB='$(LD) +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"
+ ;;
+ irix*)
+ # tested with IRIX 5.2 and 'cc'.
+ if test -n "$GCC"; then
+ CC_SHARED_OPTS='-fPIC'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -shared -rdata_shared -soname `basename $@` -o $@'
+ cf_cv_rm_so_locs=yes
+ ;;
+ linux*|gnu*)
+ # tested with Linux 2.0.29 and gcc 2.7.2 (ELF)
+ CC_SHARED_OPTS='-fpic'
+ test $cf_cv_ld_rpath = yes && cf_ld_rpath_opt="-Wl,-rpath,"
+ if test $DFT_LWR_MODEL = "shared" ; then
+ LOCAL_LDFLAGS='-Wl,-rpath,../lib'
+ LOCAL_LDFLAGS2='-Wl,-rpath,../../lib'
+ fi
+ test $cf_cv_shlib_version = auto && cf_cv_shlib_version=rel
+ if test $cf_cv_shlib_version = no ; then
+ MK_SHARED_LIB='gcc -shared -Wl,-stats,-lc -o $@'
+ else
+ MK_SHARED_LIB='gcc -shared -Wl,-soname,`basename $@.$(ABI_VERSION)`,-stats,-lc -o $@'
+ fi
+ ;;
+ openbsd2*)
+ CC_SHARED_OPTS='-fpic -DPIC'
+ MK_SHARED_LIB='$(LD) -Bshareable -soname,`basename $@.$(ABI_VERSION)` -o $@'
+ ;;
+ openbsd*|netbsd*|freebsd*)
+ CC_SHARED_OPTS='-fpic -DPIC'
+ MK_SHARED_LIB='$(LD) -Bshareable -o $@'
+ ;;
+ 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).
+ CC_SHARED_OPTS=''
+ MK_SHARED_LIB='$(LD) -set_version $(REL_VERSION):$(ABI_VERSION) -expect_unresolved "*" -shared -soname `basename $@`'
+ test $cf_cv_ld_rpath = yes && cf_ld_rpath_opt="-rpath"
+ 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" ; then
+ LOCAL_LDFLAGS='-Wl,-rpath,../lib'
+ LOCAL_LDFLAGS2='-Wl,-rpath,../../lib'
+ fi
+ cf_cv_rm_so_locs=yes
+ ;;
+ sco3.2v5*) # (also uw2* and UW7) hops 13-Apr-98
+ # tested with osr5.0.5
+ if test $ac_cv_prog_gcc = yes; then
+ CC_SHARED_OPTS='-melf -fpic'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -dy -G -h `basename $@.$(ABI_VERSION)` -o $@'
+ if test $cf_cv_ld_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 $ac_cv_prog_gcc = yes; then
+ CC_SHARED_OPTS='-fpic'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -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
+ if test $ac_cv_prog_gcc = yes; then
+ CC_SHARED_OPTS='-fpic'
+ else
+ CC_SHARED_OPTS='-KPIC'
+ fi
+ MK_SHARED_LIB='$(LD) -dy -G -h `basename $@.$(ABI_VERSION)` -o $@'
+ if test $cf_cv_ld_rpath = yes ; then
+ cf_ld_rpath_opt="-R"
+ EXTRA_LDFLAGS="-R ../lib:\$(libdir) $EXTRA_LDFLAGS"
+ fi
+ test $cf_cv_shlib_version = auto && cf_cv_shlib_version=rel
+ ;;
+ unix_sv*)
+ # tested with UnixWare 1.1.2
+ CC_SHARED_OPTS='-KPIC'
+ MK_SHARED_LIB='$(LD) -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 #(vi
+ rel|abi)
+ case "$MK_SHARED_LIB" in #(vi
+ *'-o $@')
+ if test "$cf_cv_do_symlinks" = reverse ; then
+ { echo "configure: error: cannot use --with-shlib-version with this platform" 1>&2; exit 1; }
+ fi
+ if test "$cf_cv_shlib_version" = rel ; then
+ MK_SHARED_LIB="$MK_SHARED_LIB"'.$(REL_VERSION)'
+ else
+ MK_SHARED_LIB="$MK_SHARED_LIB"'.$(ABI_VERSION)'
+ fi
+ cf_cv_do_symlinks=yes
+ ;;
+ *)
+ echo "configure: warning: ignored --with-shlib-version" 1>&2
+ ;;
+ esac
+ ;;
+ esac
+
+ if test -n "$cf_ld_rpath_opt" ; then
+ echo $ac_n "checking if we need a space after rpath option""... $ac_c" 1>&6
+echo "configure:2711: checking if we need a space after rpath option" >&5
+ cf_save_LIBS="$LIBS"
+ LIBS="$LIBS ${cf_ld_rpath_opt}/usr/lib"
+ cat > conftest.$ac_ext <<EOF
+#line 2715 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ cf_rpath_space=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_rpath_space=yes
+fi
+rm -f conftest*
+ LIBS="$cf_save_LIBS"
+ echo "$ac_t""$cf_rpath_space" 1>&6
+ test $cf_rpath_space = yes && cf_ld_rpath_opt="$cf_ld_rpath_opt "
+ MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\$(libdir)"
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+if test "$CC_SHARED_OPTS" = "unknown"; then
+ for model in $cf_list_models; do
+ if test "$model" = "shared"; then
+ { echo "configure: error: Shared libraries are not supported in this version" 1>&2; exit 1; }
+ fi
+ done
+fi
+
+###############################################################################
+
+
+### use option --disable-overwrite to leave out the link to -lcurses
+echo $ac_n "checking if you wish to install ncurses overwriting curses""... $ac_c" 1>&6
+echo "configure:2762: checking if you wish to install ncurses overwriting curses" >&5
+
+# Check whether --enable-overwrite or --disable-overwrite was given.
+if test "${enable_overwrite+set}" = set; then
+ enableval="$enable_overwrite"
+ with_overwrite=$enableval
+ test "$with_overwrite" = no && \
+ test "x$includedir" = 'x${prefix}/include' && \
+ includedir='$(prefix)/include/ncurses'
+
+else
+ with_overwrite=yes
+fi
+
+echo "$ac_t""$with_overwrite" 1>&6
+echo $ac_n "checking where we will install curses.h""... $ac_c" 1>&6
+echo "configure:2778: checking where we will install curses.h" >&5
+echo "$ac_t""$includedir" 1>&6
+
+echo $ac_n "checking if external terminfo-database is used""... $ac_c" 1>&6
+echo "configure:2782: checking if external terminfo-database is used" >&5
+
+# Check whether --enable-database or --disable-database was given.
+if test "${enable_database+set}" = set; then
+ enableval="$enable_database"
+ with_database=$enableval
+else
+ with_database=yes
+fi
+
+echo "$ac_t""$with_database" 1>&6
+test $with_database != no && cat >> confdefs.h <<\EOF
+#define USE_DATABASE 1
+EOF
+
+
+echo $ac_n "checking if you want to build with function extensions""... $ac_c" 1>&6
+echo "configure:2799: checking if you want to build with function extensions" >&5
+
+# 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 "$ac_t""$with_ext_funcs" 1>&6
+test "$with_ext_funcs" = yes && cat >> confdefs.h <<\EOF
+#define NCURSES_EXT_FUNCS 1
+EOF
+
+
+echo $ac_n "checking for list of fallback descriptions""... $ac_c" 1>&6
+echo "configure:2816: checking for list of fallback descriptions" >&5
+
+# 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 "$ac_t""$with_fallback" 1>&6
+FALLBACK_LIST=`echo $with_fallback|sed -e 's/,/ /g'`
+
+
+echo $ac_n "checking for list of terminfo directories""... $ac_c" 1>&6
+echo "configure:2831: checking for list of terminfo directories" >&5
+
+
+# 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="${IFS}:"
+cf_dst_path=
+for cf_src_path in $withval
+do
+
+case ".$cf_src_path" in #(vi
+./*) #(vi
+ ;;
+.\${*prefix}*) #(vi
+ eval cf_src_path="$cf_src_path"
+ case ".$cf_src_path" in #(vi
+ .NONE/*)
+ cf_src_path=`echo $cf_src_path | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+ esac
+ ;; #(vi
+.NONE/*)
+ cf_src_path=`echo $cf_src_path | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+*)
+ { echo "configure: error: expected a pathname" 1>&2; exit 1; }
+ ;;
+esac
+
+ test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}:"
+ cf_dst_path="${cf_dst_path}${cf_src_path}"
+done
+IFS="$ac_save_ifs"
+
+eval TERMINFO_DIRS="$cf_dst_path"
+
+echo "$ac_t""$TERMINFO_DIRS" 1>&6
+test -n "$TERMINFO_DIRS" && cat >> confdefs.h <<EOF
+#define TERMINFO_DIRS "$TERMINFO_DIRS"
+EOF
+
+
+if test $with_database = no ; then
+ if test -z $with_fallback ; then
+ { echo "configure: error: You have disabled the database w/o specifying fallbacks" 1>&2; exit 1; }
+ fi
+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 $ac_n "checking if big-core option selected""... $ac_c" 1>&6
+echo "configure:2888: checking if big-core option selected" >&5
+
+# 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 <<EOF
+#line 2899 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <string.h>
+int main() { exit(malloc(6000000L) == 0); }
+EOF
+if { (eval echo configure:2906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ with_big_core=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ with_big_core=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$with_big_core" 1>&6
+test "$with_big_core" = "yes" && cat >> confdefs.h <<\EOF
+#define HAVE_BIG_CORE 1
+EOF
+
+
+### use option --enable-termcap to compile in the termcap fallback support
+echo $ac_n "checking if you want termcap-fallback support""... $ac_c" 1>&6
+echo "configure:2928: checking if you want termcap-fallback support" >&5
+
+# 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 "$ac_t""$with_termcap" 1>&6
+
+if test "$with_termcap" != "yes" ; then
+ cat >> confdefs.h <<\EOF
+#define PURE_TERMINFO 1
+EOF
+
+else
+
+### use option --enable-getcap to use a hacked getcap for reading termcaps
+echo $ac_n "checking if fast termcap-loader is needed""... $ac_c" 1>&6
+echo "configure:2949: checking if fast termcap-loader is needed" >&5
+
+# 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 "$ac_t""$with_getcap" 1>&6
+test "$with_getcap" = "yes" && cat >> confdefs.h <<\EOF
+#define USE_GETCAP 1
+EOF
+
+
+echo $ac_n "checking if translated termcaps will be cached in ~/.terminfo""... $ac_c" 1>&6
+echo "configure:2966: checking if translated termcaps will be cached in ~/.terminfo" >&5
+
+# 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 "$ac_t""$with_getcap_cache" 1>&6
+test "$with_getcap_cache" = "yes" && cat >> confdefs.h <<\EOF
+#define USE_GETCAP_CACHE 1
+EOF
+
+
+fi
+
+### Use option --enable-symlinks to make tic use symlinks, not hard links
+### to reduce storage requirements for the terminfo database.
+
+for ac_func in \
+ remove \
+ unlink
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2992: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2997 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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();
+
+int main() {
+
+/* The GNU C library defines this 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)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3020: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+if test "$ac_cv_prog_cc_cross" = yes ; then
+ for ac_func in \
+ link \
+ symlink
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3051: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3056 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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();
+
+int main() {
+
+/* The GNU C library defines this 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)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+else
+ echo $ac_n "checking if link/symlink functions work""... $ac_c" 1>&6
+echo "configure:3105: checking if link/symlink functions work" >&5
+if eval "test \"`echo '$''{'cf_cv_link_funcs'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&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 <<EOF
+#line 3117 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+int main()
+{
+ int fail = 0;
+ char *src = "config.log";
+ char *dst = "conftest.chk";
+ struct stat src_sb;
+ struct stat dst_sb;
+
+ stat(src, &src_sb);
+ fail = ($cf_func("config.log", "conftest.chk") < 0)
+ || (stat(dst, &dst_sb) < 0)
+ || (dst_sb.st_mtime != src_sb.st_mtime);
+#ifdef HAVE_UNLINK
+ unlink(dst);
+#else
+ remove(dst);
+#endif
+ exit (fail);
+}
+
+EOF
+if { (eval echo configure:3146: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+
+ cf_cv_link_funcs="$cf_cv_link_funcs $cf_func"
+ eval 'ac_cv_func_'$cf_func'=yes'
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+
+ eval 'ac_cv_func_'$cf_func'=no'
+fi
+rm -fr conftest*
+fi
+
+ done
+ test -z "$cf_cv_link_funcs" && cf_cv_link_funcs=no
+
+fi
+
+echo "$ac_t""$cf_cv_link_funcs" 1>&6
+fi
+
+
+with_links=no
+with_symlinks=no
+
+if test "$ac_cv_func_link" != yes ; then
+ echo $ac_n "checking if tic should use symbolic links""... $ac_c" 1>&6
+echo "configure:3175: checking if tic should use symbolic links" >&5
+ if test "$ac_cv_func_symlink" = yes ; then
+ with_symlinks=yes
+ else
+ with_symlinks=no
+ fi
+ echo "$ac_t""$with_symlinks" 1>&6
+elif test "$ac_cv_func_symlink" != yes ; then
+ echo $ac_n "checking if tic should use hard links""... $ac_c" 1>&6
+echo "configure:3184: checking if tic should use hard links" >&5
+ if test "$ac_cv_func_link" = yes ; then
+ with_links=yes
+ else
+ with_links=no
+ fi
+ echo "$ac_t""$with_links" 1>&6
+else
+ echo $ac_n "checking if tic should use symbolic links""... $ac_c" 1>&6
+echo "configure:3193: checking if tic should use symbolic links" >&5
+
+# 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 "$ac_t""$with_symlinks" 1>&6
+fi
+
+test "$with_links" = yes && cat >> confdefs.h <<\EOF
+#define USE_LINKS 1
+EOF
+
+test "$with_symlinks" = yes && cat >> confdefs.h <<\EOF
+#define USE_SYMLINKS 1
+EOF
+
+
+### use option --enable-bsdpad to have tputs process BSD-style prefix padding
+echo $ac_n "checking if tputs should process BSD-style prefix padding""... $ac_c" 1>&6
+echo "configure:3217: checking if tputs should process BSD-style prefix padding" >&5
+
+# 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 "$ac_t""$with_bsdpad" 1>&6
+test "$with_bsdpad" = yes && cat >> confdefs.h <<\EOF
+#define BSD_TPUTS 1
+EOF
+
+
+### use option --enable-const to turn on use of const beyond that in XSI.
+echo $ac_n "checking for extended use of const keyword""... $ac_c" 1>&6
+echo "configure:3235: checking for extended use of const keyword" >&5
+
+# 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 "$ac_t""$with_ext_const" 1>&6
+NCURSES_CONST=""
+if test "$with_ext_const" = yes ; then
+ cat >> confdefs.h <<\EOF
+#define NCURSES_CONST const
+EOF
+
+ NCURSES_CONST=const
+fi
+
+
+### Enable compiling-in rcs id's
+echo $ac_n "checking if RCS identifiers should be compiled-in""... $ac_c" 1>&6
+echo "configure:3258: checking if RCS identifiers should be compiled-in" >&5
+
+# 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 "$ac_t""$with_rcs_ids" 1>&6
+test "$with_rcs_ids" = yes && cat >> confdefs.h <<\EOF
+#define USE_RCS_IDS 1
+EOF
+
+
+###############################################################################
+
+echo $ac_n "checking if you want all experimental code""... $ac_c" 1>&6
+echo "configure:3277: checking if you want all experimental code" >&5
+
+# 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 "$ac_t""$with_develop" 1>&6
+
+### use option --enable-broken-linker to force on use of broken-linker support
+echo $ac_n "checking if you want broken-linker support code""... $ac_c" 1>&6
+echo "configure:3291: checking if you want broken-linker support code" >&5
+
+# 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=$BROKEN_LINKER
+fi
+
+echo "$ac_t""$with_broken_linker" 1>&6
+test "$with_broken_linker" = yes && cat >> confdefs.h <<\EOF
+#define BROKEN_LINKER 1
+EOF
+
+
+### use option --enable-hard-tabs to turn on use of hard-tabs optimize
+echo $ac_n "checking if you want experimental hard-tabs code""... $ac_c" 1>&6
+echo "configure:3309: checking if you want experimental hard-tabs code" >&5
+
+# Check whether --enable-hard-tabs or --disable-hard-tabs was given.
+if test "${enable_hard_tabs+set}" = set; then
+ enableval="$enable_hard_tabs"
+ with_hardtabs=$enableval
+else
+ with_hardtabs=$with_develop
+fi
+
+echo "$ac_t""$with_hardtabs" 1>&6
+test "$with_hardtabs" = yes && cat >> confdefs.h <<\EOF
+#define USE_HARD_TABS 1
+EOF
+
+
+### use option --enable-hashmap to turn on use of hashmap scrolling logic
+echo $ac_n "checking if you want experimental hashmap code""... $ac_c" 1>&6
+echo "configure:3327: checking if you want experimental hashmap code" >&5
+
+# 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 "$ac_t""$with_hashmap" 1>&6
+test "$with_hashmap" = yes && cat >> confdefs.h <<\EOF
+#define USE_HASHMAP 1
+EOF
+
+
+echo $ac_n "checking if you want experimental no-padding code""... $ac_c" 1>&6
+echo "configure:3344: checking if you want experimental no-padding code" >&5
+
+# 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=yes
+fi
+
+echo "$ac_t""$with_no_padding" 1>&6
+test "$with_no_padding" = yes && cat >> confdefs.h <<\EOF
+#define NCURSES_NO_PADDING 1
+EOF
+
+
+echo $ac_n "checking if you want experimental safe-sprintf code""... $ac_c" 1>&6
+echo "configure:3361: checking if you want experimental safe-sprintf code" >&5
+
+# 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 "$ac_t""$with_safe_sprintf" 1>&6
+test "$with_safe_sprintf" = yes && cat >> confdefs.h <<\EOF
+#define USE_SAFE_SPRINTF 1
+EOF
+
+
+### use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic
+echo $ac_n "checking if you want to experiment without scrolling-hints code""... $ac_c" 1>&6
+echo "configure:3379: checking if you want to experiment without scrolling-hints code" >&5
+
+# 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;
+ # when hashmap is used scroll hints are useless
+ test $with_hashmap = yes && with_scroll_hints=no
+fi
+
+echo "$ac_t""$with_scroll_hints" 1>&6
+test "$with_scroll_hints" = yes && cat >> confdefs.h <<\EOF
+#define USE_SCROLL_HINTS 1
+EOF
+
+
+### use option --enable-tcap-names to allow user to define new capabilities
+echo $ac_n "checking if you want experimental definable names like termcap""... $ac_c" 1>&6
+echo "configure:3399: checking if you want experimental definable names like termcap" >&5
+
+# 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_develop
+fi
+
+echo "$ac_t""$with_tcap_names" 1>&6
+NCURSES_XNAMES=0
+test "$with_tcap_names" = yes && NCURSES_XNAMES=1
+
+
+### use option --enable-sigwinch to turn on use of SIGWINCH logic
+echo $ac_n "checking if you want experimental SIGWINCH handler""... $ac_c" 1>&6
+echo "configure:3416: checking if you want experimental SIGWINCH handler" >&5
+
+# 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=yes
+fi
+
+echo "$ac_t""$with_sigwinch" 1>&6
+test "$with_sigwinch" = yes && cat >> confdefs.h <<\EOF
+#define USE_SIGWINCH 1
+EOF
+
+
+### use option --enable-widec to turn on use of wide-character support
+echo $ac_n "checking if you want experimental wide-character code""... $ac_c" 1>&6
+echo "configure:3434: checking if you want experimental wide-character code" >&5
+
+# 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 "$ac_t""$with_widec" 1>&6
+test "$with_widec" = yes && cat >> confdefs.h <<\EOF
+#define USE_WIDEC_SUPPORT 1
+EOF
+
+
+### use option --enable-xmc-glitch to turn on use of magic-cookie optimize
+echo $ac_n "checking if you want experimental xmc code""... $ac_c" 1>&6
+echo "configure:3452: checking if you want experimental xmc code" >&5
+
+# Check whether --enable-xmc-glitch or --disable-xmc-glitch was given.
+if test "${enable_xmc_glitch+set}" = set; then
+ enableval="$enable_xmc_glitch"
+ with_xmc_glitch=$enableval
+else
+ with_xmc_glitch=$with_develop
+fi
+
+echo "$ac_t""$with_xmc_glitch" 1>&6
+test "$with_xmc_glitch" = yes && cat >> confdefs.h <<\EOF
+#define USE_XMC_SUPPORT 1
+EOF
+
+
+###############################################################################
+
+
+### use option --disable-echo to suppress full display compiling commands
+
+# Check whether --enable-echo or --disable-echo was given.
+if test "${enable_echo+set}" = set; then
+ enableval="$enable_echo"
+ with_echo=$enableval
+else
+ with_echo=yes
+fi
+
+if test "$with_echo" = yes; then
+ ECHO_LINK=
+else
+ ECHO_LINK='@ echo linking $@ ... ;'
+fi
+
+
+### use option --enable-warnings to turn on all gcc warnings
+
+# Check whether --enable-warnings or --disable-warnings was given.
+if test "${enable_warnings+set}" = set; then
+ enableval="$enable_warnings"
+ with_warnings=$enableval
+fi
+
+if test -n "$with_warnings"; then
+ ADAFLAGS="$ADAFLAGS -gnatg"
+
+if test -n "$GCC"
+then
+ cat > conftest.$ac_ext <<EOF
+#line 3502 "configure"
+int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
+EOF
+ echo "checking for gcc warning options" 1>&6
+echo "configure:3506: checking for gcc warning options" >&5
+ cf_save_CFLAGS="$CFLAGS"
+ EXTRA_CFLAGS="-W -Wall"
+ cf_warn_CONST=""
+ test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings"
+ for cf_opt in \
+ Wbad-function-cast \
+ Wcast-align \
+ Wcast-qual \
+ Winline \
+ Wmissing-declarations \
+ Wmissing-prototypes \
+ Wnested-externs \
+ Wpointer-arith \
+ Wshadow \
+ Wstrict-prototypes $cf_warn_CONST
+ do
+ CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+ if { (eval echo configure:3524: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ test -n "$verbose" && echo "$ac_t""... -$cf_opt" 1>&6
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+ test "$cf_opt" = Wcast-qual && EXTRA_CFLAGS="$EXTRA_CFLAGS -DXTSTRINGDEFINES"
+ fi
+ done
+ rm -f conftest*
+ CFLAGS="$cf_save_CFLAGS"
+fi
+
+
+fi
+
+if test -n "$GCC"
+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 -n "$GCC"
+then
+ echo "checking for gcc __attribute__ directives" 1>&6
+echo "configure:3556: checking for gcc __attribute__ directives" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 3558 "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 void oops(char *,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
+extern void foo(void) GCC_NORETURN;
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { return 0; }
+EOF
+ for cf_attribute in scanf printf unused noreturn
+ do
+
+CF_ATTRIBUTE=`echo $cf_attribute | tr '[a-z]' '[A-Z]'`
+
+ cf_directive="__attribute__(($cf_attribute))"
+ echo "checking for gcc $cf_directive" 1>&5
+ case $cf_attribute in
+ scanf|printf)
+ 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 configure:3596: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ test -n "$verbose" && echo "$ac_t""... $cf_attribute" 1>&6
+ cat conftest.h >>confdefs.h
+# else
+# sed -e 's/__attr.*/\/*nothing*\//' conftest.h >>confdefs.h
+ fi
+ done
+else
+ fgrep define conftest.i >>confdefs.h
+fi
+rm -rf conftest*
+fi
+
+
+### use option --enable-assertions to turn on generation of assertion code
+
+# 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
+
+if test -n "$GCC"
+then
+ if test $with_assertions = no
+ then
+ cat >> confdefs.h <<\EOF
+#define NDEBUG 1
+EOF
+
+ CPPFLAGS="$CPPFLAGS -DNDEBUG"
+ else
+ ADAFLAGS="$ADAFLAGS -gnata"
+ fi
+fi
+
+### use option --disable-leaks to suppress "permanent" leaks, for testing
+
+# Check whether --enable-leaks or --disable-leaks was given.
+if test "${enable_leaks+set}" = set; then
+ enableval="$enable_leaks"
+ test $enableval = no && cat >> confdefs.h <<\EOF
+#define 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 $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
+
+
+### Checks for libraries.
+echo $ac_n "checking for gettimeofday""... $ac_c" 1>&6
+echo "configure:3676: checking for gettimeofday" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gettimeofday'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3681 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char gettimeofday(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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() {
+
+/* The GNU C library defines this 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)
+choke me
+#else
+gettimeofday();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_gettimeofday=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_gettimeofday=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gettimeofday`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+
+
+echo $ac_n "checking for gettimeofday in -lbsd""... $ac_c" 1>&6
+echo "configure:3727: checking for gettimeofday in -lbsd" >&5
+ac_lib_var=`echo bsd'_'gettimeofday | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lbsd $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3735 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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() {
+gettimeofday()
+; return 0; }
+EOF
+if { (eval echo configure:3746: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+ LIBS="$LIBS -lbsd"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+MATH_LIB=""
+echo $ac_n "checking for sin""... $ac_c" 1>&6
+echo "configure:3774: checking for sin" >&5
+if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3779 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char sin(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char sin();
+
+int main() {
+
+/* The GNU C library defines this 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_sin) || defined (__stub___sin)
+choke me
+#else
+sin();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3802: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_sin=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_sin=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'sin`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
+echo "configure:3820: checking for sin in -lm" >&5
+ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3828 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char sin();
+
+int main() {
+sin()
+; return 0; }
+EOF
+if { (eval echo configure:3839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ MATH_LIB="-lm"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+
+### Checks for header files.
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:3865: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3870 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3878: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 3895 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f 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 <<EOF
+#line 3913 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f 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 <<EOF
+#line 3934 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:3945: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&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
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:3973: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3978 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:3986: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_header_dirent=$ac_hdr; break
+else
+ echo "$ac_t""no" 1>&6
+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 $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:4011: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldir $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4019 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:4030: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -ldir"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:4052: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lx $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4060 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:4071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -lx"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+echo $ac_n "checking for regular-expression headers""... $ac_c" 1>&6
+echo "configure:4095: checking for regular-expression headers" >&5
+if eval "test \"`echo '$''{'cf_cv_regex'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+cat > conftest.$ac_ext <<EOF
+#line 4101 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <regex.h>
+int main() {
+
+ regex_t *p;
+ int x = regcomp(p, "", 0);
+ int y = regexec(p, "", 0, 0, 0);
+ regfree(p);
+
+; return 0; }
+EOF
+if { (eval echo configure:4114: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ cf_cv_regex="regex.h"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+ cat > conftest.$ac_ext <<EOF
+#line 4123 "configure"
+#include "confdefs.h"
+#include <regexp.h>
+int main() {
+
+ char *p = compile("", "", "", 0);
+ int x = step("", "");
+
+; return 0; }
+EOF
+if { (eval echo configure:4133: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ cf_cv_regex="regexp.h"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+ cf_save_LIBS="$LIBS"
+ LIBS="-lgen $LIBS"
+ cat > conftest.$ac_ext <<EOF
+#line 4144 "configure"
+#include "confdefs.h"
+#include <regexpr.h>
+int main() {
+
+ char *p = compile("", "", "");
+ int x = step("", "");
+
+; return 0; }
+EOF
+if { (eval echo configure:4154: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ cf_cv_regex="regexpr.h"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ LIBS="$cf_save_LIBS"
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$cf_cv_regex" 1>&6
+case $cf_cv_regex in
+ 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_hdr in \
+fcntl.h \
+getopt.h \
+libc.h \
+limits.h \
+locale.h \
+sys/bsdtypes.h \
+sys/ioctl.h \
+sys/param.h \
+poll.h \
+sys/select.h \
+sys/stropts.h \
+sys/time.h \
+sys/times.h \
+termio.h \
+termios.h \
+ttyent.h \
+unistd.h \
+values.h \
+
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:4211: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4216 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4221: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+# check for ISC (this may also define _POSIX_SOURCE)
+# Note: even non-Posix ISC needs <sys/bsdtypes.h> to declare fd_set
+if test "$ISC" = yes ; then
+ echo $ac_n "checking for main in -lcposix""... $ac_c" 1>&6
+echo "configure:4252: checking for main in -lcposix" >&5
+ac_lib_var=`echo cposix'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lcposix $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4260 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:4267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo cposix | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lcposix $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ echo $ac_n "checking for bzero in -linet""... $ac_c" 1>&6
+echo "configure:4295: checking for bzero in -linet" >&5
+ac_lib_var=`echo inet'_'bzero | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-linet $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4303 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char bzero();
+
+int main() {
+bzero()
+; return 0; }
+EOF
+if { (eval echo configure:4314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -linet"
+else
+ echo "$ac_t""no" 1>&6
+fi
+ for ac_hdr in sys/termio.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:4337: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4342 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4347: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+fi
+
+
+echo $ac_n "checking if sys/time.h works with sys/select.h""... $ac_c" 1>&6
+echo "configure:4377: checking if sys/time.h works with sys/select.h" >&5
+if eval "test \"`echo '$''{'cf_cv_sys_time_select'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+cat > conftest.$ac_ext <<EOF
+#line 4383 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:4398: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cf_cv_sys_time_select=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_sys_time_select=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$cf_cv_sys_time_select" 1>&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
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:4427: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4432 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* 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;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:4481: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:4502: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat > conftest.$ac_ext <<EOF
+#line 4509 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:4516: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&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
+
+test $ac_cv_c_inline != no && cat >> confdefs.h <<\EOF
+#define CC_HAS_INLINE_FUNCS 1
+EOF
+
+
+
+echo $ac_n "checking if unsigned literals are legal""... $ac_c" 1>&6
+echo "configure:4548: checking if unsigned literals are legal" >&5
+if eval "test \"`echo '$''{'cf_cv_unsigned_literals'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 4554 "configure"
+#include "confdefs.h"
+
+int main() {
+long x = 1L + 1UL + 1U + 1
+; return 0; }
+EOF
+if { (eval echo configure:4561: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cf_cv_unsigned_literals=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_unsigned_literals=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$cf_cv_unsigned_literals" 1>&6
+
+
+
+echo $ac_n "checking for type of chtype""... $ac_c" 1>&6
+echo "configure:4579: checking for type of chtype" >&5
+if eval "test \"`echo '$''{'cf_cv_typeof_chtype'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ if test "$cross_compiling" = yes; then
+ cf_cv_typeof_chtype=long
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4588 "configure"
+#include "confdefs.h"
+
+#if USE_WIDEC_SUPPORT
+#include <stddef.h> /* we want wchar_t */
+#define WANT_BITS 39
+#else
+#define WANT_BITS 31
+#endif
+#include <stdio.h>
+int main()
+{
+ FILE *fp = fopen("cf_test.out", "w");
+ if (fp != 0) {
+ char *result = "long";
+#if USE_WIDEC_SUPPORT
+ /*
+ * If wchar_t is smaller than a long, it must be an int or a
+ * short. We prefer not to use a short anyway.
+ */
+ if (sizeof(unsigned long) > sizeof(wchar_t))
+ result = "int";
+#endif
+ if (sizeof(unsigned long) > sizeof(unsigned int)) {
+ int n;
+ unsigned int x;
+ for (n = 0; n < WANT_BITS; n++) {
+ unsigned int 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);
+ }
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:4634: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ cf_cv_typeof_chtype=`cat cf_test.out`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ cf_cv_typeof_chtype=long
+fi
+rm -fr conftest*
+fi
+
+ rm -f cf_test.out
+
+fi
+
+echo "$ac_t""$cf_cv_typeof_chtype" 1>&6
+
+
+cat >> confdefs.h <<EOF
+#define TYPEOF_CHTYPE $cf_cv_typeof_chtype
+EOF
+
+
+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"
+
+
+
+
+
+echo $ac_n "checking for number of bits in chtype""... $ac_c" 1>&6
+echo "configure:4667: checking for number of bits in chtype" >&5
+if eval "test \"`echo '$''{'cf_cv_shift_limit'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ if test "$cross_compiling" = yes; then
+ cf_cv_shift_limit=32
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4676 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+int main()
+{
+ FILE *fp = fopen("cf_test.out", "w");
+ if (fp != 0) {
+ int n;
+ unsigned TYPEOF_CHTYPE x = 1L;
+ for (n = 0; ; n++) {
+ unsigned long y = (x >> n);
+ if (y != 1 || x == 0)
+ break;
+ x <<= 1;
+ }
+ fprintf(fp, "%d", n);
+ fclose(fp);
+ }
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:4699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ cf_cv_shift_limit=`cat cf_test.out`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ cf_cv_shift_limit=32
+fi
+rm -fr conftest*
+fi
+
+ rm -f cf_test.out
+
+fi
+
+echo "$ac_t""$cf_cv_shift_limit" 1>&6
+
+
+echo $ac_n "checking for width of character-index""... $ac_c" 1>&6
+echo "configure:4719: checking for width of character-index" >&5
+if eval "test \"`echo '$''{'cf_cv_widec_shift'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+if test ".$with_widec" = ".yes" ; then
+ cf_attrs_width=39
+ if ( expr $cf_cv_shift_limit \> $cf_attrs_width >/dev/null )
+ then
+ cf_cv_widec_shift=`expr 16 + $cf_cv_shift_limit - $cf_attrs_width`
+ else
+ cf_cv_widec_shift=16
+ fi
+else
+ cf_cv_widec_shift=8
+fi
+
+fi
+
+echo "$ac_t""$cf_cv_widec_shift" 1>&6
+
+
+
+### Checks for external-data
+
+
+echo $ac_n "checking if external errno is declared""... $ac_c" 1>&6
+echo "configure:4746: checking if external errno is declared" >&5
+if eval "test \"`echo '$''{'cf_cv_dcl_errno'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 4752 "configure"
+#include "confdefs.h"
+
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/types.h>
+#include <errno.h>
+int main() {
+long x = (long) errno
+; return 0; }
+EOF
+if { (eval echo configure:4765: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ eval 'cf_cv_dcl_'errno'=yes'
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval 'cf_cv_dcl_'errno'=no'
+fi
+rm -f conftest*
+
+fi
+
+
+eval 'cf_result=$cf_cv_dcl_'errno
+echo "$ac_t""$cf_result" 1>&6
+
+if test "$cf_result" = no ; then
+ eval 'cf_result=DECL_'errno
+
+cf_result=`echo $cf_result | tr '[a-z]' '[A-Z]'`
+
+ cat >> confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+# It's possible (for near-UNIX clones) that the data doesn't exist
+
+echo $ac_n "checking if external errno exists""... $ac_c" 1>&6
+echo "configure:4796: checking if external errno exists" >&5
+if eval "test \"`echo '$''{'cf_cv_have_errno'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 4802 "configure"
+#include "confdefs.h"
+
+#undef errno
+extern int errno;
+
+int main() {
+errno = 2
+; return 0; }
+EOF
+if { (eval echo configure:4812: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval 'cf_cv_have_'errno'=yes'
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval 'cf_cv_have_'errno'=no'
+fi
+rm -f conftest*
+fi
+
+
+eval 'cf_result=$cf_cv_have_'errno
+echo "$ac_t""$cf_result" 1>&6
+
+if test "$cf_result" = yes ; then
+ eval 'cf_result=HAVE_'errno
+
+cf_result=`echo $cf_result | tr '[a-z]' '[A-Z]'`
+
+ cat >> confdefs.h <<EOF
+#define $cf_result 1
+EOF
+
+fi
+
+
+
+
+
+echo $ac_n "checking if data-only library module links""... $ac_c" 1>&6
+echo "configure:4844: checking if data-only library module links" >&5
+if eval "test \"`echo '$''{'cf_cv_link_dataonly'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ rm -f conftest.a
+ cat >conftest.$ac_ext <<EOF
+#line 4851 "configure"
+int testdata[3] = { 123, 456, 789 };
+EOF
+ if { (eval echo configure:4854: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } ; then
+ mv conftest.o data.o && \
+ ( $AR $AR_OPTS conftest.a data.o ) 2>&5 1>/dev/null
+ fi
+ rm -f conftest.$ac_ext data.o
+ cat >conftest.$ac_ext <<EOF
+#line 4860 "configure"
+int testfunc()
+{
+#if defined(NeXT)
+ exit(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 configure:4873: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ mv conftest.o func.o && \
+ ( $AR $AR_OPTS conftest.a func.o ) 2>&5 1>/dev/null
+ fi
+ rm -f conftest.$ac_ext func.o
+ ( eval $ac_cv_prog_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 <<EOF
+#line 4885 "configure"
+#include "confdefs.h"
+
+ int main()
+ {
+ extern int testfunc();
+ exit (!testfunc());
+ }
+
+EOF
+if { (eval echo configure:4895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ cf_cv_link_dataonly=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ cf_cv_link_dataonly=no
+fi
+rm -fr conftest*
+fi
+
+ LIBS="$cf_saveLIBS"
+
+fi
+
+echo "$ac_t""$cf_cv_link_dataonly" 1>&6
+test $cf_cv_link_dataonly = no && cat >> confdefs.h <<\EOF
+#define BROKEN_LINKER 1
+EOF
+
+
+
+echo $ac_n "checking for speed_t""... $ac_c" 1>&6
+echo "configure:4919: checking for speed_t" >&5
+OSPEED_INCLUDES=
+cat > conftest.$ac_ext <<EOF
+#line 4922 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+speed_t some_variable = 0
+; return 0; }
+EOF
+if { (eval echo configure:4929: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ OSPEED_TYPE=speed_t
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ OSPEED_TYPE=unsigned
+fi
+rm -f conftest*
+cat > conftest.$ac_ext <<EOF
+#line 4940 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int main() {
+speed_t some_variable = 0
+; return 0; }
+EOF
+if { (eval echo configure:4947: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ OSPEED_TYPE=speed_t
+ OSPEED_INCLUDES="#include <termios.h>"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+
+
+if test "$OSPEED_TYPE" = "unsigned" ; then
+ echo "$ac_t""no" 1>&6
+ cat >> confdefs.h <<\EOF
+#define speed_t unsigned
+EOF
+
+else
+ echo "$ac_t""yes" 1>&6
+fi
+
+
+### Checks for library functions.
+for ac_func in getcwd \
+getttynam \
+memccpy \
+nanosleep \
+poll \
+remove \
+select \
+setbuf \
+setbuffer \
+setvbuf \
+sigaction \
+sigvec \
+strdup \
+strstr \
+tcgetattr \
+tcgetpgrp \
+times \
+usleep \
+vfscanf \
+vsnprintf \
+vsscanf \
+
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:4994: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4999 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* 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();
+
+int main() {
+
+/* The GNU C library defines this 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)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:5022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+if test "$with_getcap" = "yes" ; then
+
+echo $ac_n "checking for terminal-capability database functions""... $ac_c" 1>&6
+echo "configure:5050: checking for terminal-capability database functions" >&5
+if eval "test \"`echo '$''{'cf_cv_cgetent'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+cat > conftest.$ac_ext <<EOF
+#line 5056 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+int main() {
+
+ char temp[128];
+ char *buf = temp;
+ char *db_array = temp;
+ cgetent(&buf, /* int *, */ &db_array, "vt100");
+ cgetcap(buf, "tc", '=');
+ cgetmatch(buf, "tc");
+
+; return 0; }
+EOF
+if { (eval echo configure:5071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ cf_cv_cgetent=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_cgetent=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$cf_cv_cgetent" 1>&6
+test $cf_cv_cgetent = yes && cat >> confdefs.h <<\EOF
+#define HAVE_BSD_CGETENT 1
+EOF
+
+
+fi
+
+
+echo $ac_n "checking for isascii""... $ac_c" 1>&6
+echo "configure:5094: checking for isascii" >&5
+if eval "test \"`echo '$''{'cf_cv_have_isascii'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 5100 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+int main() {
+int x = isascii(' ')
+; return 0; }
+EOF
+if { (eval echo configure:5107: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ cf_cv_have_isascii=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_have_isascii=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$cf_cv_have_isascii" 1>&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 $ac_n "checking whether sigaction needs _POSIX_SOURCE""... $ac_c" 1>&6
+echo "configure:5128: checking whether sigaction needs _POSIX_SOURCE" >&5
+cat > conftest.$ac_ext <<EOF
+#line 5130 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+#include <signal.h>
+int main() {
+struct sigaction act
+; return 0; }
+EOF
+if { (eval echo configure:5139: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ sigact_bad=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 5148 "configure"
+#include "confdefs.h"
+
+#define _POSIX_SOURCE
+#include <sys/types.h>
+#include <signal.h>
+int main() {
+struct sigaction act
+; return 0; }
+EOF
+if { (eval echo configure:5158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ sigact_bad=yes
+ cat >> confdefs.h <<\EOF
+#define SVR4_ACTION 1
+EOF
+
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ sigact_bad=unknown
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+echo "$ac_t""$sigact_bad" 1>&6
+fi
+
+
+if test $ac_cv_header_termios_h = yes ; then
+ case "$CFLAGS" in
+ *-D_POSIX_SOURCE*)
+ termios_bad=dunno ;;
+ *) termios_bad=maybe ;;
+ esac
+ if test $termios_bad = maybe ; then
+ echo $ac_n "checking whether termios.h needs _POSIX_SOURCE""... $ac_c" 1>&6
+echo "configure:5186: checking whether termios.h needs _POSIX_SOURCE" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 5188 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int main() {
+struct termios foo; int x = foo.c_iflag
+; return 0; }
+EOF
+if { (eval echo configure:5195: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ termios_bad=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+
+ cat > conftest.$ac_ext <<EOF
+#line 5204 "configure"
+#include "confdefs.h"
+
+#define _POSIX_SOURCE
+#include <termios.h>
+int main() {
+struct termios foo; int x = foo.c_iflag
+; return 0; }
+EOF
+if { (eval echo configure:5213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ termios_bad=unknown
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ termios_bad=yes cat >> confdefs.h <<\EOF
+#define SVR4_TERMIO 1
+EOF
+
+fi
+rm -f conftest*
+
+fi
+rm -f conftest*
+ echo "$ac_t""$termios_bad" 1>&6
+ fi
+fi
+
+
+if test "$cross_compiling" = yes ; then
+ echo "configure: warning: cross compiling: assume setvbuf params not reversed" 1>&2
+else
+ echo $ac_n "checking whether setvbuf arguments are reversed""... $ac_c" 1>&6
+echo "configure:5238: checking whether setvbuf arguments are reversed" >&5
+if eval "test \"`echo '$''{'ac_cv_func_setvbuf_reversed'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 5246 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+/* If setvbuf has the reversed format, exit 0. */
+main () {
+ /* 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)
+ exit(1);
+ putc('\r', stdout);
+ exit(0); /* Non-reversed systems segv here. */
+}
+EOF
+if { (eval echo configure:5260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_setvbuf_reversed=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_setvbuf_reversed=no
+fi
+rm -fr conftest*
+fi
+
+rm -f core core.* *.core
+fi
+
+echo "$ac_t""$ac_cv_func_setvbuf_reversed" 1>&6
+if test $ac_cv_func_setvbuf_reversed = yes; then
+ cat >> confdefs.h <<\EOF
+#define SETVBUF_REVERSED 1
+EOF
+
+fi
+
+fi
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:5285: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 5290 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int main() {
+int i;
+; return 0; }
+EOF
+if { (eval echo configure:5307: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_type_signal=void
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+
+echo $ac_n "checking for type sigaction_t""... $ac_c" 1>&6
+echo "configure:5327: checking for type sigaction_t" >&5
+if eval "test \"`echo '$''{'cf_cv_type_sigaction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 5333 "configure"
+#include "confdefs.h"
+
+#include <signal.h>
+int main() {
+sigaction_t x
+; return 0; }
+EOF
+if { (eval echo configure:5341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cf_cv_type_sigaction=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_type_sigaction=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$cf_cv_type_sigaction" 1>&6
+test $cf_cv_type_sigaction = yes && cat >> confdefs.h <<\EOF
+#define HAVE_TYPE_SIGACTION 1
+EOF
+
+
+
+echo $ac_n "checking declaration of size-change""... $ac_c" 1>&6
+echo "configure:5361: checking declaration of size-change" >&5
+if eval "test \"`echo '$''{'cf_cv_sizechange'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cf_cv_sizechange=unknown
+ cf_save_CFLAGS="$CFLAGS"
+
+for cf_opts in "" "NEED_PTEM_H"
+do
+
+ CFLAGS="$cf_save_CFLAGS"
+ test -n "$cf_opts" && CFLAGS="$CFLAGS -D$cf_opts"
+ cat > conftest.$ac_ext <<EOF
+#line 5375 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#if HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#endif
+#if NEED_PTEM_H
+/* This is a workaround for SCO: they neglected to define struct winsize in
+ * termios.h -- it's only in termio.h and ptem.h
+ */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+#if !defined(sun) || !defined(HAVE_TERMIOS_H)
+#include <sys/ioctl.h>
+#endif
+
+int main() {
+
+#ifdef TIOCGSIZE
+ struct ttysize win; /* FIXME: what system is this? */
+ int y = win.ts_lines;
+ int x = win.ts_cols;
+#else
+#ifdef TIOCGWINSZ
+ struct winsize win;
+ int y = win.ws_row;
+ int x = win.ws_col;
+#else
+ no TIOCGSIZE or TIOCGWINSZ
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+
+; return 0; }
+EOF
+if { (eval echo configure:5414: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cf_cv_sizechange=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_sizechange=no
+fi
+rm -f conftest*
+
+ CFLAGS="$cf_save_CFLAGS"
+ if test "$cf_cv_sizechange" = yes ; then
+ echo "size-change succeeded ($cf_opts)" >&5
+ test -n "$cf_opts" && cat >> confdefs.h <<EOF
+#define $cf_opts 1
+EOF
+
+ break
+ fi
+done
+
+fi
+
+echo "$ac_t""$cf_cv_sizechange" 1>&6
+test $cf_cv_sizechange != no && cat >> confdefs.h <<\EOF
+#define HAVE_SIZECHANGE 1
+EOF
+
+
+
+echo $ac_n "checking for memmove""... $ac_c" 1>&6
+echo "configure:5446: checking for memmove" >&5
+if eval "test \"`echo '$''{'ac_cv_func_memmove'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 5451 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char memmove(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char memmove();
+
+int main() {
+
+/* The GNU C library defines this 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)
+choke me
+#else
+memmove();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:5474: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_memmove=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_memmove=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'memmove`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+
+echo $ac_n "checking for bcopy""... $ac_c" 1>&6
+echo "configure:5493: checking for bcopy" >&5
+if eval "test \"`echo '$''{'ac_cv_func_bcopy'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 5498 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char bcopy(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char bcopy();
+
+int main() {
+
+/* The GNU C library defines this 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)
+choke me
+#else
+bcopy();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:5521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_bcopy=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_bcopy=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'bcopy`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+
+ echo $ac_n "checking if bcopy does overlapping moves""... $ac_c" 1>&6
+echo "configure:5537: checking if bcopy does overlapping moves" >&5
+if eval "test \"`echo '$''{'cf_cv_good_bcopy'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ if test "$cross_compiling" = yes; then
+ cf_cv_good_bcopy=unknown
+else
+ cat > conftest.$ac_ext <<EOF
+#line 5546 "configure"
+#include "confdefs.h"
+
+int main() {
+ static char data[] = "abcdefghijklmnopqrstuwwxyz";
+ char temp[40];
+ bcopy(data, temp, sizeof(data));
+ bcopy(temp+10, temp, 15);
+ bcopy(temp+5, temp+15, 10);
+ exit (strcmp(temp, "klmnopqrstuwwxypqrstuwwxyz"));
+}
+
+EOF
+if { (eval echo configure:5559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ cf_cv_good_bcopy=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ cf_cv_good_bcopy=no
+fi
+rm -fr conftest*
+fi
+
+
+fi
+
+echo "$ac_t""$cf_cv_good_bcopy" 1>&6
+
+else
+ echo "$ac_t""no" 1>&6
+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
+
+
+if test -z "$cf_user_CFLAGS" ; then
+ CFLAGS=`echo ${CFLAGS} | sed -e 's/-g //' -e 's/-g$//'`
+ CXXFLAGS=`echo ${CXXFLAGS} | sed -e 's/-g //' -e 's/-g$//'`
+fi
+
+
+echo $ac_n "checking for builtin $CC bool type""... $ac_c" 1>&6
+echo "configure:5603: checking for builtin $CC bool type" >&5
+if eval "test \"`echo '$''{'cf_cv_cc_bool_type'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 5609 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+
+int main() {
+bool x = false
+; return 0; }
+EOF
+if { (eval echo configure:5619: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cf_cv_cc_bool_type=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_cc_bool_type=0
+fi
+rm -f conftest*
+
+fi
+
+if test $cf_cv_cc_bool_type = 1
+then echo "$ac_t""yes" 1>&6
+else echo "$ac_t""no" 1>&6
+fi
+
+if test -n "$CXX" ; then
+ ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+ case "`${CXX-g++} --version`" in
+ 2.7*)
+
+cf_cxx_library=unknown
+if test $ac_cv_prog_gxx = yes; then
+ echo $ac_n "checking for libg++""... $ac_c" 1>&6
+echo "configure:5651: checking for libg++" >&5
+ cf_save="$LIBS"
+ LIBS="$LIBS -lg++ -lm"
+ cat > conftest.$ac_ext <<EOF
+#line 5655 "configure"
+#include "confdefs.h"
+
+#include <builtin.h>
+
+int main() {
+float foo=abs(1.0)
+; return 0; }
+EOF
+if { (eval echo configure:5664: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ cf_cxx_library=yes
+ CXXLIBS="$CXXLIBS -lg++ -lm"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cxx_library=no
+fi
+rm -f conftest*
+ LIBS="$cf_save"
+ echo "$ac_t""$cf_cxx_library" 1>&6
+fi
+
+ ;;
+ *)
+ cf_cxx_library=yes
+ ;;
+ esac
+ echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
+echo "configure:5685: checking how to run the C++ preprocessor" >&5
+if test -z "$CXXCPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+ CXXCPP="${CXX-g++} -E"
+ cat > conftest.$ac_ext <<EOF
+#line 5698 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:5703: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CXXCPP=/lib/cpp
+fi
+rm -f conftest*
+ ac_cv_prog_CXXCPP="$CXXCPP"
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+fi
+fi
+CXXCPP="$ac_cv_prog_CXXCPP"
+echo "$ac_t""$CXXCPP" 1>&6
+
+for ac_hdr in builtin.h typeinfo
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:5731: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 5736 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:5741: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for builtin $CXX bool type""... $ac_c" 1>&6
+echo "configure:5769: checking for builtin $CXX bool type" >&5
+if eval "test \"`echo '$''{'cf_cv_builtin_bool'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 5775 "configure"
+#include "confdefs.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+
+int main() {
+bool x = false
+; return 0; }
+EOF
+if { (eval echo configure:5785: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cf_cv_builtin_bool=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cf_cv_builtin_bool=0
+fi
+rm -f conftest*
+
+fi
+
+if test $cf_cv_builtin_bool = 1
+then echo "$ac_t""yes" 1>&6
+else echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking for size of $CXX bool""... $ac_c" 1>&6
+echo "configure:5805: checking for size of $CXX bool" >&5
+if eval "test \"`echo '$''{'cf_cv_type_of_bool'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ rm -f cf_test.out
+ if test "$cross_compiling" = yes; then
+ cf_cv_type_of_bool=unknown
+else
+ cat > conftest.$ac_ext <<EOF
+#line 5815 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#if HAVE_BUILTIN_H
+#include <builtin.h>
+#endif
+main()
+{
+ 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);
+ }
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:5843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ cf_cv_type_of_bool=`cat cf_test.out`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ cf_cv_type_of_bool=unknown
+fi
+rm -fr conftest*
+fi
+
+
+fi
+
+ rm -f cf_test.out
+echo "$ac_t""$cf_cv_type_of_bool" 1>&6
+if test "$cf_cv_type_of_bool" = unknown ; then
+ echo "configure: warning: Assuming unsigned for type of bool" 1>&2
+ cf_cv_type_of_bool=unsigned
+fi
+
+
+echo $ac_n "checking for special defines needed for etip.h""... $ac_c" 1>&6
+echo "configure:5867: checking for special defines needed for etip.h" >&5
+cf_save_CXXFLAGS="$CXXFLAGS"
+cf_result="none"
+for cf_math in "" MATH_H
+do
+for cf_excp in "" MATH_EXCEPTION
+do
+ CXXFLAGS="$cf_save_CXXFLAGS -I${srcdir}/c++ -I${srcdir}/menu"
+ test -n "$cf_math" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_math}"
+ test -n "$cf_excp" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_excp}"
+cat > conftest.$ac_ext <<EOF
+#line 5878 "configure"
+#include "confdefs.h"
+
+#include <etip.h.in>
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:5887: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+
+ 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
+
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+done
+echo "$ac_t""$cf_result" 1>&6
+CXXFLAGS="$cf_save_CXXFLAGS"
+
+else
+ cf_cxx_library=no
+ cf_cv_builtin_bool=0
+
+ # 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.
+
+ echo $ac_n "checking for fallback type of bool""... $ac_c" 1>&6
+echo "configure:5925: checking for fallback type of bool" >&5
+ case "$host_cpu" in #(vi
+ i?86) cf_cv_type_of_bool=char ;; #(vi
+ *) cf_cv_type_of_bool=int ;;
+ esac
+ echo "$ac_t""$cf_cv_type_of_bool" 1>&6
+fi
+
+
+
+
+if test "$cf_with_ada" != "no" ; then
+cf_ada_make=gnatmake
+# Extract the first word of "$cf_ada_make", so it can be a program name with args.
+set dummy $cf_ada_make; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:5941: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gnat_exists'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$gnat_exists"; then
+ ac_cv_prog_gnat_exists="$gnat_exists" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_gnat_exists="yes"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_gnat_exists" && ac_cv_prog_gnat_exists="no"
+fi
+fi
+gnat_exists="$ac_cv_prog_gnat_exists"
+if test -n "$gnat_exists"; then
+ echo "$ac_t""$gnat_exists" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_prog_gnat_exists" = no; then
+ cf_ada_make=
+else
+
+cf_cv_gnat_version=`$cf_ada_make -v 2>&1 | grep '[0-9].[0-9][0-9]*' |\
+ sed -e 's/[^0-9 \.]//g' | $AWK '{print $1;}'`
+case $cf_cv_gnat_version in
+ 3.[1-9]*|[4-9].*)
+ cf_cv_prog_gnat_correct=yes
+ ;;
+ *) echo Unsupported GNAT version $cf_cv_gnat_version. Required is 3.10 or better. Disabling Ada95 binding.
+ cf_cv_prog_gnat_correct=no
+ ;;
+esac
+case $cf_cv_gnat_version in
+ 3.1*|[4-9].*)
+ cf_compile_generics=generics
+ cf_generic_objects="\$(GENOBJS)"
+ ;;
+ *) cf_compile_generics=
+ cf_generic_objects=
+ ;;
+esac
+
+ # Extract the first word of "m4", so it can be a program name with args.
+set dummy m4; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:5995: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_m4_exists'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$m4_exists"; then
+ ac_cv_prog_m4_exists="$m4_exists" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_m4_exists="yes"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ 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 "$ac_t""$m4_exists" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test "$ac_cv_prog_m4_exists" = no; then
+ cf_cv_prog_gnat_correct=no
+ echo Ada95 binding required program m4 not found. Ada95 binding disabled.
+ fi
+ if test "$cf_cv_prog_gnat_correct" = yes; then
+ echo $ac_n "checking if GNAT works""... $ac_c" 1>&6
+echo "configure:6028: checking if GNAT works" >&5
+
+rm -f 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 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 -f conftest*
+
+ echo "$ac_t""$cf_cv_prog_gnat_correct" 1>&6
+ fi
+fi
+if test "$cf_cv_prog_gnat_correct" = yes; then
+ ADAFLAGS="-O3 -gnatpn $ADAFLAGS"
+
+
+# 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
+
+
+ cf_ada_package=terminal_interface
+
+
+
+
+
+
+
+
+
+# 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/lib/gnu-Ada/adainclude}"
+fi
+
+case ".$withval" in #(vi
+./*) #(vi
+ ;;
+.\${*prefix}*) #(vi
+ eval withval="$withval"
+ case ".$withval" in #(vi
+ .NONE/*)
+ withval=`echo $withval | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+ esac
+ ;; #(vi
+.NONE/*)
+ withval=`echo $withval | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+*)
+ { echo "configure: error: expected a pathname" 1>&2; exit 1; }
+ ;;
+esac
+
+eval ADA_INCLUDE="$withval"
+
+
+
+
+# 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/gnu-Ada/adalib}"
+fi
+
+case ".$withval" in #(vi
+./*) #(vi
+ ;;
+.\${*prefix}*) #(vi
+ eval withval="$withval"
+ case ".$withval" in #(vi
+ .NONE/*)
+ withval=`echo $withval | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+ esac
+ ;; #(vi
+.NONE/*)
+ withval=`echo $withval | sed -e s@NONE@$ac_default_prefix@`
+ ;;
+*)
+ { echo "configure: error: expected a pathname" 1>&2; exit 1; }
+ ;;
+esac
+
+eval ADA_OBJECTS="$withval"
+
+
+
+ if test $with_shared = no
+ then
+ echo "configure: warning: Ada95 applications will not link properly with static libraries" 1>&2
+ fi
+fi
+fi
+
+### It's not possible to appease gcc 2.6.3's conversion-warnings if we're
+### using a 'char' for bools. gcc 2.7.0's conversion-warnings are broken too
+### badly to consider using for development purposes, but 2.5.8 is okay.
+if test -n "$with_warnings"; then
+ if test -n "$GCC"; then
+ case "`$CC --version`" in
+ 2.6.3)
+ if test "$cf_cv_type_of_bool" != "char"; then
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -Wconversion"
+ fi
+ ;;
+ 2.5*)
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -Wconversion"
+ ;;
+ esac
+ fi
+fi
+
+### Construct the library-subsets, if any, from this set of keywords:
+### none, base, ext_funcs, termlib.
+echo $ac_n "checking for library subsets""... $ac_c" 1>&6
+echo "configure:6172: checking for library subsets" >&5
+if test "$with_termlib" = yes ; then
+ LIB_SUBSETS="termlib "
+else
+ LIB_SUBSETS="termlib+"
+fi
+LIB_SUBSETS="${LIB_SUBSETS}base"
+test "$with_ext_funcs" = yes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs"
+echo "$ac_t""$LIB_SUBSETS" 1>&6
+
+### Construct the list of include-directories to be generated
+
+CPPFLAGS="$CPPFLAGS -I. -I../include"
+if test "$srcdir" != "."; then
+ CPPFLAGS="$CPPFLAGS -I\$(srcdir)/../include"
+fi
+if test -z "$GCC"; then
+ CPPFLAGS="$CPPFLAGS -I\$(includedir)"
+elif test "$includedir" != "/usr/include"; then
+ if test "$includedir" = '${prefix}/include' ; then
+ if test $prefix != /usr ; then
+ CPPFLAGS="$CPPFLAGS -I\$(includedir)"
+ fi
+ else
+ CPPFLAGS="$CPPFLAGS -I\$(includedir)"
+ fi
+fi
+
+
+
+ACPPFLAGS="$ACPPFLAGS -I. -I../../include"
+if test "$srcdir" != "."; then
+ ACPPFLAGS="$ACPPFLAGS -I\$(srcdir)/../../include"
+fi
+if test -z "$GCC"; then
+ ACPPFLAGS="$ACPPFLAGS -I\$(includedir)"
+elif test "$includedir" != "/usr/include"; then
+ if test "$includedir" = '${prefix}/include' ; then
+ if test $prefix != /usr ; then
+ ACPPFLAGS="$ACPPFLAGS -I\$(includedir)"
+ fi
+ else
+ ACPPFLAGS="$ACPPFLAGS -I\$(includedir)"
+ fi
+fi
+
+
+
+### Set up low-level terminfo dependencies for makefiles. Note that we
+### could override this.
+if test "$with_termlib" = yes ; then
+ TEST_DEPS="${LIB_PREFIX}${TINFO_NAME}${DFT_DEP_SUFFIX}"
+ TEST_ARGS="-l${TINFO_NAME}${DFT_ARG_SUFFIX}"
+fi
+PROG_DEPS="$TEST_DEPS"
+PROG_ARGS="$TEST_ARGS"
+
+### Construct the list of subdirectories for which we'll customize makefiles
+### with the appropriate compile-rules.
+
+
+echo $ac_n "checking for src modules""... $ac_c" 1>&6
+echo "configure:6234: checking for src modules" >&5
+
+# dependencies and linker-arguments for test-programs
+TEST_DEPS="${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEPS"
+TEST_ARGS="-l${LIB_NAME}${DFT_ARG_SUFFIX} $TEST_ARGS"
+
+# dependencies and linker-arguments for utility-programs
+PROG_ARGS="$TEST_ARGS"
+
+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 ! -f $srcdir/${cf_dir}/${cf_dir}.h; 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 | tr '[a-z]' '[A-Z]'`
+
+ cat >> confdefs.h <<EOF
+#define HAVE_${cf_have_include}_H 1
+EOF
+
+ cat >> confdefs.h <<EOF
+#define HAVE_LIB${cf_have_include} 1
+EOF
+
+ TEST_DEPS="${LIB_PREFIX}${cf_dir}${DFT_DEP_SUFFIX} $TEST_DEPS"
+ TEST_ARGS="-l${cf_dir}${DFT_ARG_SUFFIX} $TEST_ARGS"
+ fi
+ fi
+done
+echo "$ac_t""$cf_cv_src_modules" 1>&6
+TEST_ARGS="-L${LIB_DIR} -L\$(libdir) $TEST_ARGS"
+
+
+
+PROG_ARGS="-L${LIB_DIR} -L\$(libdir) $PROG_ARGS"
+
+
+SRC_SUBDIRS="man include"
+for cf_dir in $cf_cv_src_modules
+do
+ SRC_SUBDIRS="$SRC_SUBDIRS $cf_dir"
+done
+SRC_SUBDIRS="$SRC_SUBDIRS misc test"
+test $cf_cxx_library != no && SRC_SUBDIRS="$SRC_SUBDIRS c++"
+
+ADA_SUBDIRS=
+if test "$cf_cv_prog_gnat_correct" = yes && test -d $srcdir/Ada95; then
+ SRC_SUBDIRS="$SRC_SUBDIRS Ada95"
+ ADA_SUBDIRS="gen src samples"
+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
+
+
+DIRS_TO_MAKE="lib"
+for cf_item in $cf_list_models
+do
+
+ case $cf_item in
+ normal) cf_subdir='objects' ;;
+ debug) cf_subdir='obj_g' ;;
+ profile) cf_subdir='obj_p' ;;
+ shared) cf_subdir='obj_s' ;;
+ esac
+
+ 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
+
+
+
+### Now that we're done running tests, add the compiler-warnings, if any
+CFLAGS="$CFLAGS $EXTRA_CFLAGS"
+
+################################################################################
+trap '' 1 2 15
+cat > confcache <<\EOF
+# 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. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# 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 \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13.19990117"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "\
+ include/MKterm.h.awk \
+ include/curses.h \
+ include/termcap.h \
+ include/unctrl.h \
+ $SUB_MAKEFILES \
+ Makefile include/ncurses_cfg.h:include/ncurses_cfg.hin" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@NCURSES_MAJOR@%$NCURSES_MAJOR%g
+s%@NCURSES_MINOR@%$NCURSES_MINOR%g
+s%@NCURSES_PATCH@%$NCURSES_PATCH%g
+s%@cf_cv_rel_version@%$cf_cv_rel_version%g
+s%@cf_cv_abi_version@%$cf_cv_abi_version%g
+s%@cf_cv_cc_bool_type@%$cf_cv_cc_bool_type%g
+s%@cf_cv_builtin_bool@%$cf_cv_builtin_bool%g
+s%@cf_cv_type_of_bool@%$cf_cv_type_of_bool%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@CC@%$CC%g
+s%@BUILD_CC@%$BUILD_CC%g
+s%@CPP@%$CPP%g
+s%@PROG_EXT@%$PROG_EXT%g
+s%@LDCONFIG@%$LDCONFIG%g
+s%@CXX@%$CXX%g
+s%@AWK@%$AWK%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@LN_S@%$LN_S%g
+s%@RANLIB@%$RANLIB%g
+s%@LINT@%$LINT%g
+s%@MAN@%$MAN%g
+s%@LINT_OPTS@%$LINT_OPTS%g
+s%@LD@%$LD%g
+s%@AR@%$AR%g
+s%@AR_OPTS@%$AR_OPTS%g
+s%@cf_cv_makeflags@%$cf_cv_makeflags%g
+s%@INSTALL_PREFIX@%$INSTALL_PREFIX%g
+s%@EXTRA_LIBS@%$EXTRA_LIBS%g
+s%@TINFO_LIST@%$TINFO_LIST%g
+s%@SHLIB_LIST@%$SHLIB_LIST%g
+s%@DFT_OBJ_SUBDIR@%$DFT_OBJ_SUBDIR%g
+s%@DFT_LWR_MODEL@%$DFT_LWR_MODEL%g
+s%@DFT_UPR_MODEL@%$DFT_UPR_MODEL%g
+s%@DFT_DEP_SUFFIX@%$DFT_DEP_SUFFIX%g
+s%@DFT_ARG_SUFFIX@%$DFT_ARG_SUFFIX%g
+s%@cf_list_models@%$cf_list_models%g
+s%@TINFO_NAME@%$TINFO_NAME%g
+s%@LIB_NAME@%$LIB_NAME%g
+s%@LIB_PREFIX@%$LIB_PREFIX%g
+s%@CC_G_OPT@%$CC_G_OPT%g
+s%@CXX_G_OPT@%$CXX_G_OPT%g
+s%@LD_MODEL@%$LD_MODEL%g
+s%@CC_SHARED_OPTS@%$CC_SHARED_OPTS%g
+s%@LD_SHARED_OPTS@%$LD_SHARED_OPTS%g
+s%@MK_SHARED_LIB@%$MK_SHARED_LIB%g
+s%@LINK_PROGS@%$LINK_PROGS%g
+s%@LINK_TESTS@%$LINK_TESTS%g
+s%@EXTRA_LDFLAGS@%$EXTRA_LDFLAGS%g
+s%@LOCAL_LDFLAGS@%$LOCAL_LDFLAGS%g
+s%@LOCAL_LDFLAGS2@%$LOCAL_LDFLAGS2%g
+s%@INSTALL_LIB@%$INSTALL_LIB%g
+s%@FALLBACK_LIST@%$FALLBACK_LIST%g
+s%@TERMINFO_DIRS@%$TERMINFO_DIRS%g
+s%@NCURSES_CONST@%$NCURSES_CONST%g
+s%@NCURSES_XNAMES@%$NCURSES_XNAMES%g
+s%@ECHO_LINK@%$ECHO_LINK%g
+s%@EXTRA_CFLAGS@%$EXTRA_CFLAGS%g
+s%@MATH_LIB@%$MATH_LIB%g
+s%@cf_cv_typeof_chtype@%$cf_cv_typeof_chtype%g
+s%@cf_cv_1UL@%$cf_cv_1UL%g
+s%@cf_cv_shift_limit@%$cf_cv_shift_limit%g
+s%@cf_cv_widec_shift@%$cf_cv_widec_shift%g
+s%@OSPEED_TYPE@%$OSPEED_TYPE%g
+s%@OSPEED_INCLUDES@%$OSPEED_INCLUDES%g
+s%@CXXCPP@%$CXXCPP%g
+s%@CXXLIBS@%$CXXLIBS%g
+s%@gnat_exists@%$gnat_exists%g
+s%@m4_exists@%$m4_exists%g
+s%@cf_ada_make@%$cf_ada_make%g
+s%@cf_ada_compiler@%$cf_ada_compiler%g
+s%@cf_ada_package@%$cf_ada_package%g
+s%@ADAFLAGS@%$ADAFLAGS%g
+s%@cf_compile_generics@%$cf_compile_generics%g
+s%@cf_generic_objects@%$cf_generic_objects%g
+s%@ADA_INCLUDE@%$ADA_INCLUDE%g
+s%@ADA_OBJECTS@%$ADA_OBJECTS%g
+s%@ACPPFLAGS@%$ACPPFLAGS%g
+s%@TEST_DEPS@%$TEST_DEPS%g
+s%@TEST_ARGS@%$TEST_ARGS%g
+s%@PROG_ARGS@%$PROG_ARGS%g
+s%@ADA_SUBDIRS@%$ADA_SUBDIRS%g
+s%@DIRS_TO_MAKE@%$DIRS_TO_MAKE%g
+
+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_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # 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" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"\
+ include/MKterm.h.awk \
+ include/curses.h \
+ include/termcap.h \
+ include/unctrl.h \
+ $SUB_MAKEFILES \
+ Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ 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 "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# 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='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="include/ncurses_cfg.h:include/ncurses_cfg.hin"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.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'.
+sort confdefs.h >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 :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # 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 >> $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 conftest.in at the
+# marker @DEFS@.
+echo ' cat >> conftest.edit <<CEOF
+/@DEFS@/r conftest.frag
+/@DEFS@/d
+CEOF
+sed -f conftest.edit conftest.in > conftest.out
+rm -f conftest.in
+mv conftest.out conftest.in
+rm -f conftest.edit conftest.frag
+' >> $CONFIG_STATUS
+
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+# Extra initialization commands, if any
+
+### Special initialization commands, used to pass information from the
+### configuration-run into config.status
+
+AWK="$AWK"
+CF_LIST_MODELS="$cf_list_models"
+DFT_LWR_MODEL="$DFT_LWR_MODEL"
+LDCONFIG="$LDCONFIG"
+LIB_NAME="$LIB_NAME"
+LIB_SUBSETS="$LIB_SUBSETS"
+SRC_SUBDIRS="$SRC_SUBDIRS"
+TINFO_NAME="$TINFO_NAME"
+WITH_ECHO="$with_echo"
+WITH_OVERWRITE="$with_overwrite"
+cf_cv_abi_version="$cf_cv_abi_version"
+cf_cv_do_symlinks="$cf_cv_do_symlinks"
+cf_cv_rel_version="$cf_cv_rel_version"
+cf_cv_rm_so_locs="$cf_cv_rm_so_locs"
+cf_cv_system_name="$cf_cv_system_name"
+cf_cxx_library="$cf_cxx_library"
+target="$target"
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+# Extra commands, if any
+
+
+
+ case $cf_cv_system_name in
+ os2) cf_prefix='' ;;
+ *) cf_prefix='lib' ;;
+ esac
+
+
+for cf_dir in $SRC_SUBDIRS
+do
+ if test -f $srcdir/$cf_dir/modules; then
+
+ cf_libs_to_make=
+ for cf_item in $CF_LIST_MODELS
+ do
+
+
+ case $cf_item in
+ normal) cf_suffix='.a' ;;
+ debug) cf_suffix='_g.a' ;;
+ profile) cf_suffix='_p.a' ;;
+ shared)
+ case $cf_cv_system_name in
+ openbsd*|netbsd*|freebsd*)
+ cf_suffix='.so.$(REL_VERSION)' ;;
+ hpux*) cf_suffix='.sl' ;;
+ *) cf_suffix='.so' ;;
+ esac
+ esac
+
+ cf_libs_to_make="$cf_libs_to_make ../lib/${cf_prefix}${cf_dir}${cf_suffix}"
+ done
+
+ if test $cf_dir = ncurses ; then
+ case "$LIB_SUBSETS" in
+ termlib+*) #(vi
+ ;;
+ *) #(vi
+ cf_item=`echo $cf_libs_to_make |sed -e s/$LIB_NAME/$TINFO_NAME/g`
+ cf_libs_to_make="$cf_item $cf_libs_to_make"
+ ;;
+ esac
+ fi
+
+ sed -e "s@\@LIBS_TO_MAKE\@@$cf_libs_to_make@" \
+ $cf_dir/Makefile >$cf_dir/Makefile.out
+ mv $cf_dir/Makefile.out $cf_dir/Makefile
+
+ $AWK -f $srcdir/mk-0th.awk \
+ name=$cf_dir \
+ $srcdir/$cf_dir/modules >>$cf_dir/Makefile
+
+ for cf_item in $CF_LIST_MODELS
+ do
+ echo 'Appending rules for '$cf_item' model ('$cf_dir')'
+
+CF_ITEM=`echo $cf_item | tr '[a-z]' '[A-Z]'`
+
+
+
+ case $cf_item in
+ normal) cf_suffix='.a' ;;
+ debug) cf_suffix='_g.a' ;;
+ profile) cf_suffix='_p.a' ;;
+ shared)
+ case $cf_cv_system_name in
+ openbsd*|netbsd*|freebsd*)
+ cf_suffix='.so.$(REL_VERSION)' ;;
+ hpux*) cf_suffix='.sl' ;;
+ *) cf_suffix='.so' ;;
+ esac
+ esac
+
+
+ case $cf_item in
+ normal) cf_subdir='objects' ;;
+ debug) cf_subdir='obj_g' ;;
+ profile) cf_subdir='obj_p' ;;
+ shared) cf_subdir='obj_s' ;;
+ esac
+
+
+ # 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
+
+ for cf_subset in $LIB_SUBSETS
+ do
+ $AWK -f $srcdir/mk-1st.awk \
+ name=$cf_dir \
+ MODEL=$CF_ITEM \
+ model=$cf_subdir \
+ prefix=$cf_prefix \
+ suffix=$cf_suffix \
+ subset=$cf_subset \
+ DoLinks=$cf_cv_do_symlinks \
+ rmSoLocs=$cf_cv_rm_so_locs \
+ ldconfig="$LDCONFIG" \
+ overwrite=$WITH_OVERWRITE \
+ depend="$cf_depend" \
+ target="$target" \
+ $srcdir/$cf_dir/modules >>$cf_dir/Makefile
+ test $cf_dir = ncurses && WITH_OVERWRITE=no
+ $AWK -f $srcdir/mk-2nd.awk \
+ name=$cf_dir \
+ MODEL=$CF_ITEM \
+ model=$cf_subdir \
+ subset=$cf_subset \
+ srcdir=$srcdir \
+ echo=$WITH_ECHO \
+ $srcdir/$cf_dir/modules >>$cf_dir/Makefile
+ done
+ done
+ fi
+
+ echo ' cd '$cf_dir' && $(MAKE) $(CF_MFLAGS) $@' >>Makefile
+done
+
+for cf_dir in $SRC_SUBDIRS
+do
+ if test -f $cf_dir/Makefile ; then
+ case "$cf_dir" in
+ Ada95) #(vi
+ echo 'install.libs \' >> Makefile
+ echo 'uninstall.libs ::' >> Makefile
+ echo ' cd '$cf_dir' && $(MAKE) $(CF_MFLAGS) $@' >> Makefile
+ ;;
+ esac
+ fi
+
+ if test -f $srcdir/$cf_dir/modules; then
+ echo >> Makefile
+ if test -f $srcdir/$cf_dir/headers; then
+cat >> Makefile <<CF_EOF
+install.includes \\
+uninstall.includes \\
+CF_EOF
+ fi
+if test "$cf_dir" != "c++" ; then
+echo 'lint \' >> Makefile
+fi
+cat >> Makefile <<CF_EOF
+lintlib \\
+install.libs \\
+uninstall.libs \\
+install.$cf_dir \\
+uninstall.$cf_dir ::
+ cd $cf_dir && \$(MAKE) \$(CF_MFLAGS) \$@
+CF_EOF
+ elif test -f $srcdir/$cf_dir/headers; then
+cat >> Makefile <<CF_EOF
+
+install.libs \\
+uninstall.libs \\
+install.includes \\
+uninstall.includes ::
+ cd $cf_dir && \$(MAKE) \$(CF_MFLAGS) \$@
+CF_EOF
+fi
+done
+
+cat >> Makefile <<CF_EOF
+
+install.data ::
+ cd misc && \$(MAKE) \$(CF_MFLAGS) \$@
+
+install.man ::
+ cd man && \$(MAKE) \$(CF_MFLAGS) \$@
+
+distclean ::
+ rm -f config.cache config.log config.status Makefile include/ncurses_cfg.h
+ rm -f headers.sh headers.sed
+ rm -rf \$(DIRS_TO_MAKE)
+CF_EOF
+
+
+rm -f headers.sed headers.sh
+
+echo creating headers.sh
+cat >headers.sh <<CF_EOF
+#! /bin/sh
+# 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
+echo installing \$SRC in \$DST
+case \$DST in
+/*/include/*)
+ TMP=\${TMPDIR-/tmp}/\`basename \$SRC\`
+ if test ! -f ../headers.sed ; then
+ END=\`basename \$DST\`
+ for i in \`cat \$REF/../*/headers |fgrep -v "#"\`
+ do
+ NAME=\`basename \$i\`
+ echo "s/<\$NAME>/<\$END\/\$NAME>/" >> ../headers.sed
+ done
+ fi
+ rm -f \$TMP
+ sed -f ../headers.sed \$SRC > \$TMP
+ eval \$PRG \$TMP \$DST
+ rm -f \$TMP
+ ;;
+*)
+ eval \$PRG \$SRC \$DST
+ ;;
+esac
+CF_EOF
+
+chmod 0755 headers.sh
+
+for cf_dir in $SRC_SUBDIRS
+do
+ if test -f $srcdir/$cf_dir/headers; then
+ cat >>$cf_dir/Makefile <<CF_EOF
+\$(INSTALL_PREFIX)\$(includedir) :
+ \$(srcdir)/../mkinstalldirs \$@
+
+install \\
+install.libs \\
+install.includes :: \$(INSTALL_PREFIX)\$(includedir) \\
+CF_EOF
+ j=""
+ for i in `cat $srcdir/$cf_dir/headers |fgrep -v "#"`
+ do
+ test -n "$j" && echo " $j \\" >>$cf_dir/Makefile
+ j=$i
+ done
+ echo " $j" >>$cf_dir/Makefile
+ for i in `cat $srcdir/$cf_dir/headers |fgrep -v "#"`
+ do
+ echo " @ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f `basename $i`) ; ../headers.sh \$(INSTALL_DATA) \$(INSTALL_PREFIX)\$(includedir) \$(srcdir) $i" >>$cf_dir/Makefile
+ test $i = curses.h && echo " @ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f ncurses.h && \$(LN_S) curses.h ncurses.h)" >>$cf_dir/Makefile
+ done
+
+ cat >>$cf_dir/Makefile <<CF_EOF
+
+uninstall \\
+uninstall.libs \\
+uninstall.includes ::
+CF_EOF
+ for i in `cat $srcdir/$cf_dir/headers |fgrep -v "#"`
+ do
+ i=`basename $i`
+ echo " -@ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f $i)" >>$cf_dir/Makefile
+ test $i = curses.h && echo " -@ (cd \$(INSTALL_PREFIX)\$(includedir) && rm -f ncurses.h)" >>$cf_dir/Makefile
+ done
+ fi
+done
+
+
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+${MAKE-make} preinstall
diff --git a/contrib/ncurses/configure.in b/contrib/ncurses/configure.in
new file mode 100644
index 000000000000..028bcf37fe09
--- /dev/null
+++ b/contrib/ncurses/configure.in
@@ -0,0 +1,968 @@
+dnl***************************************************************************
+dnl Copyright (c) 1998,1999 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 <dickey@clark.net> 1996,1997
+dnl
+dnl $Id: configure.in,v 1.169 1999/08/21 20:33:10 tom Exp $
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.12.971222)
+AC_REVISION($Revision: 1.169 $)
+AC_INIT(ncurses/base/lib_initscr.c)
+AC_CONFIG_HEADER(include/ncurses_cfg.h:include/ncurses_cfg.hin)
+
+CF_SUBST_NCURSES_VERSION
+CF_CHECK_CACHE
+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])
+
+# We need a configure script only when compiling as part of GNU C library.
+# Here we have to generate one of the files we need while compiling.
+#
+# The only problem is that users of the package might think they have to
+# run configure themself and find it irritating when nothing happens.
+#
+# So we try here to find out whether we are called from the glibc configure
+# or by a user.
+#
+dnl Check if we are a drop-in addition to glibc.
+AC_ARG_ENABLE(add-ons, dnl
+[ --enable-add-ons=DIR... used to check if we are a glibc add-on.],
+ [glibc_add_on=yes],
+ [glibc_add_on=])
+
+dnl We need to use [ and ] for other purposes for a while now.
+changequote(,)dnl
+if test x"$glibc_add_on" = "xyes" ; then
+ rm -f $srcdir/Banner
+ # We are in glibc.
+ rm -f $srcdir/Makefile
+ cp $srcdir/Makefile.glibc $srcdir/Makefile
+ echo "ncurses `grep \"^[ ]*ncurses-version[ ]*=.*$\" \
+ $srcdir/Makefile | sed -e \
+ 's/^[ ]*ncurses-version[ ]*=[ ]*\([^ ^ ]*\)[ ]*$/\1/'`" > $srcdir/Banner
+ exit 0
+fi
+changequote([,])dnl
+
+### Save the given $CFLAGS to allow user-override.
+cf_user_CFLAGS="$CFLAGS"
+
+### Default install-location
+CF_CFG_DEFAULTS
+
+### Checks for programs.
+AC_PROG_CC
+if test -n "$GCC" ; then
+AC_MSG_CHECKING(version of gcc)
+eval "$CC --version"
+fi
+if test $host != $build; then
+ AC_CHECK_PROGS(BUILD_CC, $CC gcc cc)
+fi
+AC_PROG_CPP
+AC_PROG_GCC_TRADITIONAL
+AC_ISC_POSIX
+CF_ANSI_CC_REQD
+CF_PROG_EXT
+
+case "$cf_cv_system_name" in
+freebsd*) #(vi
+ test -z "$LDCONFIG" && LDCONFIG="/sbin/ldconfig -R"
+ ;;
+*) LDPATH=$PATH:/sbin:/usr/sbin
+ AC_PATH_PROG(LDCONFIG,ldconfig,,$LDPATH)
+ ;;
+esac
+AC_SUBST(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 build with C++)
+AC_ARG_WITH(cxx,
+ [ --without-cxx suppress check for C++, don't build demo],
+ [cf_with_cxx=$withval],
+ [cf_with_cxx=yes])
+AC_MSG_RESULT($cf_with_cxx)
+if test "X$cf_with_cxx" != Xno ; then
+AC_PROG_CXX
+fi
+changequote(,)dnl
+if test -n "$GXX" ; then case "`${CXX-g++} --version`" in 1*|2.[0-6]*) GXX=""; CXX=""; ac_cv_prog_gxx=no; cf_cxx_library=no ; echo No: templates do not work;; esac; fi
+changequote([,])dnl
+
+AC_MSG_CHECKING(if you want to build with Ada95)
+AC_ARG_WITH(ada,
+ [ --without-ada suppress check for Ada95, don't build demo],
+ [cf_with_ada=$withval],
+ [cf_with_ada=yes])
+AC_MSG_RESULT($cf_with_ada)
+
+AC_MSG_CHECKING(if you want to build programs such as tic)
+AC_ARG_WITH(progs,
+ [ --without-progs suppress build with programs (e.g., tic)],
+ [cf_with_progs=$withval],
+ [cf_with_progs=yes])
+AC_MSG_RESULT($cf_with_progs)
+
+modules_to_build="ncurses"
+if test "X$cf_with_progs" != Xno ; then
+modules_to_build="$modules_to_build progs tack"
+fi
+modules_to_build="$modules_to_build panel menu form"
+
+AC_PROG_AWK
+AC_PROG_MAKE_SET
+CF_PROG_INSTALL
+AC_SYS_LONG_FILE_NAMES
+AC_PROG_LN_S
+AC_PROG_RANLIB
+AC_CHECK_PROGS(LINT, tdlint lint alint)
+AC_CHECK_PROGS(MAN, man man_db)
+AC_SUBST(LINT_OPTS)
+
+dnl These are standard among *NIX systems, but not when cross-compiling
+CF_SUBST(loader,LD,ld)
+CF_SUBST(archiver,AR,ar)
+CF_SUBST(archiver options,AR_OPTS,rv)
+
+CF_MAKEFLAGS
+
+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],
+ [case "$withval" in #(vi
+ yes|no) #(vi
+ ;;
+ *) INSTALL_PREFIX="$withval"
+ ;;
+ esac])
+AC_MSG_RESULT($INSTALL_PREFIX)
+AC_SUBST(INSTALL_PREFIX)
+
+###############################################################################
+CF_MAN_PAGES
+
+###############################################################################
+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 libraries)
+AC_ARG_WITH(shared,
+ [ --with-shared generate shared-libraries],
+ [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(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 "$with_normal" = "yes" && 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 "$with_debug" = "yes" && 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 "$with_profile" = "yes" && cf_list_models="$cf_list_models profile"
+
+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)
+
+### Checks for special libraries, must be done up-front.
+AC_MSG_CHECKING(if you want to link with dbmalloc for testing)
+AC_ARG_WITH(dbmalloc,
+ [ --with-dbmalloc test: use Conor Cahill's dbmalloc library],
+ [with_dbmalloc=$withval],
+ [with_dbmalloc=no])
+AC_MSG_RESULT($with_dbmalloc)
+if test $with_dbmalloc = yes ; then
+ AC_CHECK_LIB(dbmalloc,debug_malloc)
+fi
+
+AC_MSG_CHECKING(if you want to link with dmalloc for testing)
+AC_ARG_WITH(dmalloc,
+ [ --with-dmalloc test: use Gray Watson's dmalloc library],
+ [with_dmalloc=$withval],
+ [with_dmalloc=no])
+AC_MSG_RESULT($with_dmalloc)
+if test $with_dmalloc = yes ; then
+ AC_CHECK_LIB(dmalloc,dmalloc_debug)
+fi
+
+SHLIB_LIST=""
+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=no])
+AC_MSG_RESULT($with_gpm)
+if test $with_gpm = yes ; then
+ AC_CHECK_LIB(gpm,Gpm_Open,[
+ EXTRA_LIBS="-lgpm -lncurses $EXTRA_LIBS"
+ SHLIB_LIST="-lgpm $SHLIB_LIST"
+ AC_DEFINE(HAVE_LIBGPM)
+ AC_CHECK_HEADERS(gpm.h)
+ ],,-lcurses -ltermcap)
+fi
+
+TINFO_LIST="$SHLIB_LIST"
+test $with_termlib = yes && SHLIB_LIST="$SHLIB_LIST -ltinfo"
+
+AC_SUBST(EXTRA_LIBS)
+AC_SUBST(TINFO_LIST)
+AC_SUBST(SHLIB_LIST)
+
+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.
+DFT_LWR_MODEL=`echo $cf_list_models | $AWK '{print $1}'`
+CF_UPPER(DFT_UPR_MODEL,$DFT_LWR_MODEL)dnl
+CF_LIB_SUFFIX($DFT_LWR_MODEL,DFT_DEP_SUFFIX)dnl
+CF_LIB_TYPE($DFT_LWR_MODEL,DFT_ARG_SUFFIX)dnl
+CF_OBJ_SUBDIR($DFT_LWR_MODEL,DFT_OBJ_SUBDIR)dnl
+AC_SUBST(DFT_OBJ_SUBDIR)dnl the default object-directory ("obj")
+AC_SUBST(DFT_LWR_MODEL)dnl the default model ("normal")
+AC_SUBST(DFT_UPR_MODEL)dnl the default model ("NORMAL")
+AC_SUBST(DFT_DEP_SUFFIX)dnl the corresponding library-suffix (".a")
+AC_SUBST(DFT_ARG_SUFFIX)dnl the string to append to "-lncurses" ("")
+AC_SUBST(cf_list_models)dnl the complete list of models ("normal debug")
+
+TINFO_NAME=tinfo
+AC_SUBST(TINFO_NAME)
+
+LIB_NAME=ncurses
+AC_SUBST(LIB_NAME)
+
+LIB_DIR=../lib
+CF_LIB_PREFIX(cf_prefix)
+LIB_PREFIX=$LIB_DIR/$cf_prefix
+AC_SUBST(LIB_PREFIX)
+
+dnl Not all ports of gcc support the -g option
+dnl autoconf 2.12 uses different symbol for -g option than autoconf 2.10, etc.
+
+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)
+
+if test X"$CXX_G_OPT" = X"" ; then
+ CXX_G_OPT='-g'
+ test -n "$GXX" && test "${ac_cv_prog_cxx_g}" != yes && CXX_G_OPT=''
+fi
+AC_SUBST(CXX_G_OPT)
+
+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_CHECKING(if rpath option should be used)
+AC_ARG_ENABLE(rpath,
+[ --enable-rpath use rpath option when generating shared libraries],
+[cf_cv_ld_rpath=$enableval],
+[cf_cv_ld_rpath=no])
+AC_MSG_RESULT($cf_cv_ld_rpath)
+
+CF_SHARED_OPTS
+
+if test "$CC_SHARED_OPTS" = "unknown"; then
+ for model in $cf_list_models; do
+ if test "$model" = "shared"; then
+ AC_ERROR(Shared libraries are not supported in this version)
+ fi
+ done
+fi
+
+###############################################################################
+CF_HELP_MESSAGE(Fine-Tuning Your Configuration:)
+
+### 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 leave out the link to -lcurses],
+ [with_overwrite=$enableval
+ test "$with_overwrite" = no && \
+ test "x$includedir" = 'x${prefix}/include' && \
+ includedir='$(prefix)/include/ncurses'
+ ],
+ [with_overwrite=yes])
+AC_MSG_RESULT($with_overwrite)
+AC_MSG_CHECKING(where we will install curses.h)
+AC_MSG_RESULT($includedir)
+
+AC_MSG_CHECKING(if external terminfo-database is used)
+AC_ARG_ENABLE(database,
+ [ --disable-database use only built-in data],
+ [with_database=$enableval],
+ [with_database=yes])
+AC_MSG_RESULT($with_database)
+test $with_database != no && AC_DEFINE(USE_DATABASE)
+
+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)
+test "$with_ext_funcs" = yes && AC_DEFINE(NCURSES_EXT_FUNCS)
+
+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)
+FALLBACK_LIST=`echo $with_fallback|sed -e 's/,/ /g'`
+AC_SUBST(FALLBACK_LIST)
+
+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")
+
+if test $with_database = no ; then
+ if test -z $with_fallback ; then
+ AC_ERROR(You have disabled the database w/o specifying fallbacks)
+ fi
+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.
+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() { exit(malloc(6000000L) == 0); }],
+ [with_big_core=yes],
+ [with_big_core=no],
+ [with_big_core=no])])
+AC_MSG_RESULT($with_big_core)
+test "$with_big_core" = "yes" && AC_DEFINE(HAVE_BIG_CORE)
+
+### 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)
+
+if test "$with_termcap" != "yes" ; then
+ AC_DEFINE(PURE_TERMINFO)
+else
+
+### 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 "$with_getcap" = "yes" && AC_DEFINE(USE_GETCAP)
+
+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 "$with_getcap_cache" = "yes" && AC_DEFINE(USE_GETCAP_CACHE)
+
+fi
+
+### 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
+
+if test "$ac_cv_func_link" != yes ; then
+ AC_MSG_CHECKING(if tic should use symbolic links)
+ if test "$ac_cv_func_symlink" = yes ; then
+ with_symlinks=yes
+ else
+ with_symlinks=no
+ fi
+ AC_MSG_RESULT($with_symlinks)
+elif test "$ac_cv_func_symlink" != yes ; then
+ AC_MSG_CHECKING(if tic should use hard links)
+ if test "$ac_cv_func_link" = yes ; then
+ with_links=yes
+ else
+ with_links=no
+ fi
+ AC_MSG_RESULT($with_links)
+else
+ 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
+
+test "$with_links" = yes && AC_DEFINE(USE_LINKS)
+test "$with_symlinks" = yes && AC_DEFINE(USE_SYMLINKS)
+
+### 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 "$with_bsdpad" = yes && AC_DEFINE(BSD_TPUTS)
+
+### 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=""
+if test "$with_ext_const" = yes ; then
+ AC_DEFINE(NCURSES_CONST,const)
+ NCURSES_CONST=const
+fi
+AC_SUBST(NCURSES_CONST)
+
+### 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)
+
+###############################################################################
+CF_HELP_MESSAGE(Experimental Code:)
+AC_MSG_CHECKING(if you want all experimental code)
+AC_ARG_WITH(develop,
+ [ --with-develop enable all experimental options for testing],
+ [with_develop=$withval],
+ [with_develop=no])
+AC_MSG_RESULT($with_develop)
+
+### use option --enable-broken-linker to force on use of broken-linker support
+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=$BROKEN_LINKER])
+AC_MSG_RESULT($with_broken_linker)
+test "$with_broken_linker" = yes && AC_DEFINE(BROKEN_LINKER)
+
+### use option --enable-hard-tabs to turn on use of hard-tabs optimize
+AC_MSG_CHECKING(if you want experimental hard-tabs code)
+AC_ARG_ENABLE(hard-tabs,
+ [ --enable-hard-tabs compile with experimental hard-tabs code],
+ [with_hardtabs=$enableval],
+ [with_hardtabs=$with_develop])
+AC_MSG_RESULT($with_hardtabs)
+test "$with_hardtabs" = yes && AC_DEFINE(USE_HARD_TABS)
+
+### use option --enable-hashmap to turn on use of hashmap scrolling logic
+AC_MSG_CHECKING(if you want experimental hashmap code)
+AC_ARG_ENABLE(hashmap,
+ [ --enable-hashmap compile with experimental hashmap code],
+ [with_hashmap=$enableval],
+ [with_hashmap=yes])
+AC_MSG_RESULT($with_hashmap)
+test "$with_hashmap" = yes && AC_DEFINE(USE_HASHMAP)
+
+AC_MSG_CHECKING(if you want experimental no-padding code)
+AC_ARG_ENABLE(no-padding,
+ [ --enable-no-padding compile with experimental no-padding code],
+ [with_no_padding=$enableval],
+ [with_no_padding=yes])
+AC_MSG_RESULT($with_no_padding)
+test "$with_no_padding" = yes && AC_DEFINE(NCURSES_NO_PADDING)
+
+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)
+test "$with_safe_sprintf" = yes && AC_DEFINE(USE_SAFE_SPRINTF)
+
+### use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic
+AC_MSG_CHECKING(if you want to experiment without scrolling-hints code)
+AC_ARG_ENABLE(scroll-hints,
+ [ --disable-scroll-hints compile hashmap without scroll-hints code],
+ [with_scroll_hints=$enableval],
+ [with_scroll_hints=yes;
+ # when hashmap is used scroll hints are useless
+ test $with_hashmap = yes && with_scroll_hints=no])
+AC_MSG_RESULT($with_scroll_hints)
+test "$with_scroll_hints" = yes && AC_DEFINE(USE_SCROLL_HINTS)
+
+### use option --enable-tcap-names to allow user to define new capabilities
+AC_MSG_CHECKING(if you want experimental definable names like termcap)
+AC_ARG_ENABLE(tcap-names,
+ [ --enable-tcap-names compile with experimental definable-name code],
+ [with_tcap_names=$enableval],
+ [with_tcap_names=$with_develop])
+AC_MSG_RESULT($with_tcap_names)
+NCURSES_XNAMES=0
+test "$with_tcap_names" = yes && NCURSES_XNAMES=1
+AC_SUBST(NCURSES_XNAMES)
+
+### use option --enable-sigwinch to turn on use of SIGWINCH logic
+AC_MSG_CHECKING(if you want experimental SIGWINCH handler)
+AC_ARG_ENABLE(sigwinch,
+ [ --enable-sigwinch compile with experimental SIGWINCH handler],
+ [with_sigwinch=$enableval],
+ [with_sigwinch=yes])
+AC_MSG_RESULT($with_sigwinch)
+test "$with_sigwinch" = yes && AC_DEFINE(USE_SIGWINCH)
+
+### use option --enable-widec to turn on use of wide-character support
+AC_MSG_CHECKING(if you want experimental wide-character code)
+AC_ARG_ENABLE(widec,
+ [ --enable-widec compile with experimental wide-char code],
+ [with_widec=$enableval],
+ [with_widec=no])
+AC_MSG_RESULT($with_widec)
+test "$with_widec" = yes && AC_DEFINE(USE_WIDEC_SUPPORT)
+
+### use option --enable-xmc-glitch to turn on use of magic-cookie optimize
+AC_MSG_CHECKING(if you want experimental xmc code)
+AC_ARG_ENABLE(xmc-glitch,
+ [ --enable-xmc-glitch compile with experimental xmc code],
+ [with_xmc_glitch=$enableval],
+ [with_xmc_glitch=$with_develop])
+AC_MSG_RESULT($with_xmc_glitch)
+test "$with_xmc_glitch" = yes && AC_DEFINE(USE_XMC_SUPPORT)
+
+###############################################################################
+CF_HELP_MESSAGE(Testing/development Options:)
+
+### use option --disable-echo to suppress full display compiling commands
+AC_ARG_ENABLE(echo,
+ [ --enable-echo build: display "compiling" commands (default)],
+ [with_echo=$enableval],
+ [with_echo=yes])
+if test "$with_echo" = yes; then
+ ECHO_LINK=
+else
+ ECHO_LINK='@ echo linking $@ ... ;'
+fi
+AC_SUBST(ECHO_LINK)
+
+### use option --enable-warnings to turn on all gcc warnings
+AC_ARG_ENABLE(warnings,
+ [ --enable-warnings build: turn on GCC compiler warnings],
+ [with_warnings=$enableval])
+if test -n "$with_warnings"; then
+ ADAFLAGS="$ADAFLAGS -gnatg"
+ CF_GCC_WARNINGS
+fi
+CF_GCC_ATTRIBUTES
+
+### use option --enable-assertions to turn on generation of assertion code
+AC_ARG_ENABLE(assertions,
+ [ --enable-assertions test: turn on generation of assertion code],
+ [with_assertions=$enableval],
+ [with_assertions=no])
+if test -n "$GCC"
+then
+ if test $with_assertions = no
+ then
+ AC_DEFINE(NDEBUG)
+ CPPFLAGS="$CPPFLAGS -DNDEBUG"
+ else
+ ADAFLAGS="$ADAFLAGS -gnata"
+ fi
+fi
+
+### use option --disable-leaks to suppress "permanent" leaks, for testing
+AC_ARG_ENABLE(leaks,
+ [ --disable-leaks test: suppress permanent memory-leaks],
+ [test $enableval = no && AC_DEFINE(NO_LEAKS)])
+AC_DEFINE(HAVE_NC_ALLOC_H)
+
+### 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)])
+
+### 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)])
+
+### Checks for libraries.
+AC_CHECK_FUNC(gettimeofday,
+ AC_DEFINE(HAVE_GETTIMEOFDAY),[
+
+AC_CHECK_LIB(bsd, gettimeofday,
+ AC_DEFINE(HAVE_GETTIMEOFDAY)
+ LIBS="$LIBS -lbsd")])dnl CLIX: bzero, select, gettimeofday
+
+MATH_LIB=""
+AC_CHECK_FUNC(sin,,
+ AC_CHECK_LIB(m, sin,[MATH_LIB="-lm"]))
+AC_SUBST(MATH_LIB)
+
+### Checks for header files.
+AC_STDC_HEADERS
+AC_HEADER_DIRENT
+CF_REGEX
+
+dnl These are some other potentially nonportable headers.
+AC_CHECK_HEADERS( \
+fcntl.h \
+getopt.h \
+libc.h \
+limits.h \
+locale.h \
+sys/bsdtypes.h \
+sys/ioctl.h \
+sys/param.h \
+poll.h \
+sys/select.h \
+sys/stropts.h \
+sys/time.h \
+sys/times.h \
+termio.h \
+termios.h \
+ttyent.h \
+unistd.h \
+values.h \
+)
+
+# check for ISC (this may also define _POSIX_SOURCE)
+# Note: even non-Posix ISC needs <sys/bsdtypes.h> to declare fd_set
+if test "$ISC" = yes ; then
+ AC_CHECK_LIB(cposix,main)
+ AC_CHECK_LIB(inet,bzero,LIBS="$LIBS -linet")dnl also 'select()'
+ AC_CHECK_HEADERS( sys/termio.h )
+fi
+
+CF_SYS_TIME_SELECT
+
+### checks for compiler characteristics
+AC_LANG_C
+AC_C_CONST
+AC_C_INLINE
+test $ac_cv_c_inline != no && AC_DEFINE(CC_HAS_INLINE_FUNCS)
+
+CF_TYPEOF_CHTYPE
+CF_WIDEC_SHIFT
+
+### Checks for external-data
+CF_ERRNO
+CF_LINK_DATAONLY
+CF_SPEED_TYPE
+
+### Checks for library functions.
+AC_CHECK_FUNCS( getcwd \
+getttynam \
+memccpy \
+nanosleep \
+poll \
+remove \
+select \
+setbuf \
+setbuffer \
+setvbuf \
+sigaction \
+sigvec \
+strdup \
+strstr \
+tcgetattr \
+tcgetpgrp \
+times \
+usleep \
+vfscanf \
+vsnprintf \
+vsscanf \
+)
+
+if test "$with_getcap" = "yes" ; then
+ CF_CGETENT
+fi
+
+CF_ISASCII
+CF_STRUCT_SIGACTION
+CF_STRUCT_TERMIOS
+
+dnl FIXME (may need this) AC_SYS_RESTARTABLE_SYSCALLS
+if test "$cross_compiling" = yes ; then
+ AC_MSG_WARN(cross compiling: assume setvbuf params not reversed)
+else
+ AC_FUNC_SETVBUF_REVERSED
+fi
+AC_TYPE_SIGNAL
+CF_TYPE_SIGACTION
+CF_SIZECHANGE
+CF_FUNC_MEMMOVE
+
+dnl We'll do our own -g libraries, unless the user's overridden via $CFLAGS
+if test -z "$cf_user_CFLAGS" ; then
+ CF_STRIP_G_OPT(CFLAGS)
+ CF_STRIP_G_OPT(CXXFLAGS)
+fi
+
+dnl Check for C++ compiler characteristics (and ensure that it's there!)
+CF_BOOL_DECL(cf_cv_cc_bool_type)
+if test -n "$CXX" ; then
+ AC_LANG_CPLUSPLUS
+ case "`${CXX-g++} --version`" in
+ 2.7*)
+ CF_CXX_LIBRARY
+ ;;
+ *)
+ cf_cxx_library=yes
+ ;;
+ esac
+ AC_CHECK_HEADERS(builtin.h typeinfo)
+ CF_BOOL_DECL
+ CF_BOOL_SIZE
+ CF_ETIP_DEFINES
+else
+ cf_cxx_library=no
+ cf_cv_builtin_bool=0
+
+ # 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.
+
+ AC_MSG_CHECKING(for fallback type of bool)
+ case "$host_cpu" in #(vi
+ i?86) cf_cv_type_of_bool=char ;; #(vi
+ *) cf_cv_type_of_bool=int ;;
+ esac
+ AC_MSG_RESULT($cf_cv_type_of_bool)
+fi
+AC_SUBST(CXXLIBS)
+
+CF_HELP_MESSAGE(Ada95 Binding Options:)
+
+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_ada_make=gnatmake
+AC_CHECK_PROG(gnat_exists, $cf_ada_make, yes, no)
+if test "$ac_cv_prog_gnat_exists" = no; then
+ cf_ada_make=
+else
+ CF_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
+ echo 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
+fi
+if test "$cf_cv_prog_gnat_correct" = yes; then
+ ADAFLAGS="-O3 -gnatpn $ADAFLAGS"
+
+ AC_ARG_WITH(ada-compiler,
+ [ --with-ada-compiler=CMD Specify Ada95 compiler command (default gnatmake)],
+ [cf_ada_compiler=$withval],
+ [cf_ada_compiler=gnatmake])
+
+ cf_ada_package=terminal_interface
+
+ AC_SUBST(cf_ada_make)
+ AC_SUBST(cf_ada_compiler)
+ AC_SUBST(cf_ada_package)
+ AC_SUBST(ADAFLAGS)
+ AC_SUBST(cf_compile_generics)
+ AC_SUBST(cf_generic_objects)
+
+ CF_WITH_PATH(ada-include,
+ [ --with-ada-include=DIR Ada includes are in DIR],
+ ADA_INCLUDE,
+ PREFIX/lib/gnu-Ada/adainclude,
+ [$]prefix/lib/gnu-Ada/adainclude)
+ AC_SUBST(ADA_INCLUDE)
+
+ CF_WITH_PATH(ada-objects,
+ [ --with-ada-objects=DIR Ada objects are in DIR],
+ ADA_OBJECTS,
+ PREFIX/lib/gnu-Ada/adalib,
+ [$]prefix/lib/gnu-Ada/adalib)
+ AC_SUBST(ADA_OBJECTS)
+
+ if test $with_shared = no
+ then
+ AC_MSG_WARN(Ada95 applications will not link properly with static libraries)
+ fi
+fi
+fi
+
+### It's not possible to appease gcc 2.6.3's conversion-warnings if we're
+### using a 'char' for bools. gcc 2.7.0's conversion-warnings are broken too
+### badly to consider using for development purposes, but 2.5.8 is okay.
+if test -n "$with_warnings"; then
+ if test -n "$GCC"; then
+ case "`$CC --version`" in
+ 2.6.3)
+ if test "$cf_cv_type_of_bool" != "char"; then
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -Wconversion"
+ fi
+ ;;
+ 2.5*)
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -Wconversion"
+ ;;
+ esac
+ fi
+fi
+
+### Construct the library-subsets, if any, from this set of keywords:
+### none, base, ext_funcs, termlib.
+AC_MSG_CHECKING(for library subsets)
+if test "$with_termlib" = yes ; then
+ LIB_SUBSETS="termlib "
+else
+ LIB_SUBSETS="termlib+"
+fi
+LIB_SUBSETS="${LIB_SUBSETS}base"
+test "$with_ext_funcs" = yes && 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
+
+### Set up low-level terminfo dependencies for makefiles. Note that we
+### could override this.
+if test "$with_termlib" = yes ; then
+ TEST_DEPS="${LIB_PREFIX}${TINFO_NAME}${DFT_DEP_SUFFIX}"
+ TEST_ARGS="-l${TINFO_NAME}${DFT_ARG_SUFFIX}"
+fi
+PROG_DEPS="$TEST_DEPS"
+PROG_ARGS="$TEST_ARGS"
+
+### Construct the list of subdirectories for which we'll customize makefiles
+### with the appropriate compile-rules.
+
+CF_SRC_MODULES($modules_to_build)
+CF_DIRS_TO_MAKE
+
+### Now that we're done running tests, add the compiler-warnings, if any
+CFLAGS="$CFLAGS $EXTRA_CFLAGS"
+
+################################################################################
+AC_OUTPUT( \
+ include/MKterm.h.awk \
+ include/curses.h \
+ include/termcap.h \
+ include/unctrl.h \
+ $SUB_MAKEFILES \
+ Makefile,[
+CF_LIB_RULES
+],[
+### Special initialization commands, used to pass information from the
+### configuration-run into config.status
+
+AWK="$AWK"
+CF_LIST_MODELS="$cf_list_models"
+DFT_LWR_MODEL="$DFT_LWR_MODEL"
+LDCONFIG="$LDCONFIG"
+LIB_NAME="$LIB_NAME"
+LIB_SUBSETS="$LIB_SUBSETS"
+SRC_SUBDIRS="$SRC_SUBDIRS"
+TINFO_NAME="$TINFO_NAME"
+WITH_ECHO="$with_echo"
+WITH_OVERWRITE="$with_overwrite"
+cf_cv_abi_version="$cf_cv_abi_version"
+cf_cv_do_symlinks="$cf_cv_do_symlinks"
+cf_cv_rel_version="$cf_cv_rel_version"
+cf_cv_rm_so_locs="$cf_cv_rm_so_locs"
+cf_cv_system_name="$cf_cv_system_name"
+cf_cxx_library="$cf_cxx_library"
+target="$target"
+
+],sort)dnl
+${MAKE-make} preinstall
diff --git a/contrib/ncurses/convert_configure.pl b/contrib/ncurses/convert_configure.pl
new file mode 100644
index 000000000000..9d1026d16878
--- /dev/null
+++ b/contrib/ncurses/convert_configure.pl
@@ -0,0 +1,54 @@
+extproc perl -S -w
+
+# The converted script is written to stdout, so run this script as
+# convert_configure configure > configure.cmd
+#
+# When the converted script runs, it expects that /tmp dir is
+# available (so we create it).
+#
+# run the result like this:
+# .\configure
+;
+
+mkdir '/tmp', 0777 unless -d '/tmp';
+
+print <<EOF;
+extproc sh
+
+# Make sensible defaults:
+CC="gcc -Zexe"
+export CC
+#GCCOPT="$GCCOPT -Zexe"
+#export GCCOPT
+CONFIG_SHELL=sh
+
+EOF
+
+$checking_path = 0;
+
+while (<>) {
+ if (/for\s+(\w+)\s+in\s*\$PATH\s*;/) {
+ $checking_path = 1;
+ $varname = $1;
+ $subst= <<EOS
+$varname="`echo -E \\"\$$varname\\" | tr \\\\\\\\\\\\\\\\ / `"
+EOS
+ }
+ $checking_path = 0 if /^\s*done\s*$/;
+ # We want to create an extra line like this one:
+# ac_dir="`echo -E \"$ac_dir\" | tr \\\\\\\\ / `"
+ s{^((\s*)if\s+test)\s*-f\s*(\$$varname/\S+)\s*;}
+ {$2$subst$1 -f $3 -o -f $3.exe ;}
+ if $checking_path; # Checking for executables
+ s/^host=NONE$/host=os2/; # Make default host
+ s/"\$\{IFS}:"$/"\${IFS};"/; # Fix IFS line
+ s/\btest\s+-s\s+conftest\b/test -f conftest/g; # Fix exe test
+ # This one is needed for curses:
+ s/host=`\$ac_config_sub \$host_alias`/$&\nif test -z "$host"; then host=\$host_alias; fi/;
+ s,/bin/sh(?![/\w]),sh,g;
+ print;
+}
+
+__END__
+
+Changes: 98/11 : support check for executables in ncurses.
diff --git a/contrib/ncurses/dist.mk b/contrib/ncurses/dist.mk
new file mode 100644
index 000000000000..70168a531fee
--- /dev/null
+++ b/contrib/ncurses/dist.mk
@@ -0,0 +1,62 @@
+# $Id: dist.mk,v 1.162 1999/08/21 23:40:17 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 = 5
+NCURSES_MINOR = 0
+NCURSES_PATCH = 990821
+
+# We don't append the patch to the version, since this only applies to releases
+VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
+
+DUMP = lynx -dump
+DUMP2 = $(DUMP) -nolist
+
+ALL = ANNOUNCE announce.html misc/ncurses-intro.doc misc/hackguide.doc
+
+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)
+
+# Don't mess with announce.html.in unless you have lynx available!
+announce.html: announce.html.in
+ sed 's,@VERSION@,$(VERSION),' <announce.html.in >announce.html
+
+ANNOUNCE : announce.html
+ $(DUMP) announce.html >ANNOUNCE
+
+misc/ncurses-intro.doc: misc/ncurses-intro.html
+ $(DUMP2) misc/ncurses-intro.html > misc/ncurses-intro.doc
+misc/hackguide.doc: misc/hackguide.html
+ $(DUMP2) misc/hackguide.html > misc/hackguide.doc
+
+# Prepare distribution for version control
+vcprepare:
+ find . -type d -exec mkdir {}/RCS \;
+
+# Write-lock almost all files not under version control.
+ADA_EXCEPTIONS=$(shell eval 'a="\\\\\|";for x in Ada95/gen/terminal*.m4; do echo -n $${a}Ada95/ada_include/`basename $${x} .m4`; done')
+EXCEPTIONS = 'announce.html$\\|ANNOUNCE\\|misc/.*\\.doc\\|man/terminfo.5\\|lib_gen.c'$(ADA_EXCEPTIONS)
+writelock:
+ for x in `grep -v $(EXCEPTIONS) MANIFEST`; do if [ ! -f `dirname $$x`/RCS/`basename $$x`,v ]; then chmod a-w $${x}; fi; done
+
+# This only works on a clean source tree, of course.
+MANIFEST:
+ -rm -f $@
+ touch $@
+ find . -type f -print |sort | fgrep -v .lsm |fgrep -v .spec >$@
+
+TAGS:
+ etags */*.[ch]
+
+# Makefile ends here
diff --git a/contrib/ncurses/form/Makefile.in b/contrib/ncurses/form/Makefile.in
new file mode 100644
index 000000000000..798053058a0f
--- /dev/null
+++ b/contrib/ncurses/form/Makefile.in
@@ -0,0 +1,148 @@
+# $Id: Makefile.in,v 1.25 1998/04/04 00:49:55 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+MODEL = @DFT_LWR_MODEL@
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@
+
+INSTALL = @INSTALL@
+INSTALL_LIB = @INSTALL@ @INSTALL_LIB@
+INSTALL_DATA = @INSTALL_DATA@
+
+AR = @AR@
+AR_OPTS = @AR_OPTS@
+AWK = @AWK@
+LD = @LD@
+LN_S = @LN_S@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+
+CPPFLAGS = @CPPFLAGS@ \
+ -DHAVE_CONFIG_H
+
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -pg
+CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK = $(CC)
+LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+SHLIB_DIRS = -L../lib -L$(libdir)
+SHLIB_LIST = $(SHLIB_DIRS) -lncurses @SHLIB_LIST@
+
+MK_SHARED_LIB = @MK_SHARED_LIB@
+
+REL_VERSION = @cf_cv_rel_version@
+ABI_VERSION = @cf_cv_abi_version@
+
+RANLIB = @RANLIB@
+
+LIBRARIES = @LIBS_TO_MAKE@
+
+LINT = @LINT@
+LINT_OPTS = @LINT_OPTS@
+LINT_LIBS = -lform -lncurses @LIBS@
+
+AUTO_SRC = \
+ ../include/form.h
+
+################################################################################
+all \
+install :: $(AUTO_SRC) $(LIBRARIES)
+
+sources : $(AUTO_SRC)
+
+$(INSTALL_PREFIX)$(libdir) :
+ $(srcdir)/../mkinstalldirs $@
+
+# 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 $@
+
+FORM_PRIV_H = \
+ $(srcdir)/form.priv.h \
+ $(srcdir)/form.h \
+ ../include/mf_common.h \
+ ../include/curses.h \
+ ../include/eti.h
+
+tags:
+ ctags *.[ch]
+
+TAGS:
+ etags *.[ch]
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+
+clean :: mostlyclean
+ -rm -f $(AUTO_SRC)
+
+distclean :: clean
+ -rm -f Makefile
+
+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/contrib/ncurses/form/READ.ME b/contrib/ncurses/form/READ.ME
new file mode 100644
index 000000000000..dd91693f6b36
--- /dev/null
+++ b/contrib/ncurses/form/READ.ME
@@ -0,0 +1,15 @@
+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
+
+eMail: juergen.pfeifer@gmx.net
+
diff --git a/contrib/ncurses/form/fld_arg.c b/contrib/ncurses/form/fld_arg.c
new file mode 100644
index 000000000000..bc816e9efd0f
--- /dev/null
+++ b/contrib/ncurses/form/fld_arg.c
@@ -0,0 +1,91 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_arg.c,v 1.4 1999/05/16 17:16:04 juergen 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
++--------------------------------------------------------------------------*/
+int set_fieldtype_arg(FIELDTYPE * typ,
+ void * (* const make_arg)(va_list *),
+ void * (* const copy_arg)(const void *),
+ void (* const free_arg)(void *))
+{
+ if ( !typ || !make_arg )
+ RETURN(E_BAD_ARGUMENT);
+
+ typ->status |= _HAS_ARGS;
+ typ->makearg = make_arg;
+ typ->copyarg = copy_arg;
+ typ->freearg = free_arg;
+ RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : void *field_arg(const FIELD *field)
+|
+| Description : Retrieve pointer to the fields argument structure.
+|
+| Return Values : Pointer to structure or NULL if none is defined.
++--------------------------------------------------------------------------*/
+void *field_arg(const FIELD * field)
+{
+ return Normalize_Field(field)->arg;
+}
+
+/* fld_arg.c ends here */
diff --git a/contrib/ncurses/form/fld_attr.c b/contrib/ncurses/form/fld_attr.c
new file mode 100644
index 000000000000..3c7d8e353c0e
--- /dev/null
+++ b/contrib/ncurses/form/fld_attr.c
@@ -0,0 +1,111 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_attr.c,v 1.4 1999/05/16 17:16:30 juergen Exp $")
+
+/*----------------------------------------------------------------------------
+ Field-Attribute manipulation routines
+ --------------------------------------------------------------------------*/
+/* "Template" macro to generate a function to set a fields attribute */
+#define GEN_FIELD_ATTR_SET_FCT( name ) \
+int set_field_ ## name (FIELD * field, chtype attr)\
+{\
+ int res = E_BAD_ARGUMENT;\
+ if ( attr==A_NORMAL || ((attr & A_ATTRIBUTES)==attr) )\
+ {\
+ Normalize_Field( field );\
+ 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 fields attribute */
+#define GEN_FIELD_ATTR_GET_FCT( name ) \
+chtype field_ ## name (const FIELD * field)\
+{\
+ return ( 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 fields 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
+| fields 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 fields background attribute
+|
+| Return Values : The background attribute
++--------------------------------------------------------------------------*/
+GEN_FIELD_ATTR_GET_FCT( back )
+
+/* fld_attr.c ends here */
diff --git a/contrib/ncurses/form/fld_current.c b/contrib/ncurses/form/fld_current.c
new file mode 100644
index 000000000000..2bf8163a43f7
--- /dev/null
+++ b/contrib/ncurses/form/fld_current.c
@@ -0,0 +1,124 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_current.c,v 1.4 1999/05/16 17:16:46 juergen 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
++--------------------------------------------------------------------------*/
+int set_current_field(FORM * form, FIELD * field)
+{
+ int err = E_OK;
+
+ if ( !form || !field )
+ RETURN(E_BAD_ARGUMENT);
+
+ if ( (form != field->form) || Field_Is_Not_Selectable(field) )
+ RETURN(E_REQUEST_DENIED);
+
+ if (!(form->status & _POSTED))
+ {
+ form->current = field;
+ form->curpage = field->page;
+ }
+ else
+ {
+ if (form->status & _IN_DRIVER)
+ err = E_BAD_STATE;
+ else
+ {
+ if (form->current != field)
+ {
+ if (!_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,field->page,field);
+ Call_Hook(form,forminit);
+ }
+ else
+ {
+ err = _nc_Set_Current_Field(form,field);
+ }
+ Call_Hook(form,fieldinit);
+ _nc_Refresh_Current_Field(form);
+ }
+ }
+ }
+ }
+ RETURN(err);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : FIELD *current_field(const FORM * form)
+|
+| Description : Return the current field.
+|
+| Return Values : Pointer to the current field.
++--------------------------------------------------------------------------*/
+FIELD *current_field(const FORM * form)
+{
+ return 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
++--------------------------------------------------------------------------*/
+int field_index(const FIELD * field)
+{
+ return ( (field && field->form) ? field->index : -1 );
+}
+
+/* fld_current.c ends here */
diff --git a/contrib/ncurses/form/fld_def.c b/contrib/ncurses/form/fld_def.c
new file mode 100644
index 000000000000..dd3de804688b
--- /dev/null
+++ b/contrib/ncurses/form/fld_def.c
@@ -0,0 +1,346 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_def.c,v 1.12 1999/05/16 17:37:48 juergen 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 */
+ ALL_FIELD_OPTS, /* opts */
+ (FIELD *)0, /* snext */
+ (FIELD *)0, /* sprev */
+ (FIELD *)0, /* link */
+ (FORM *)0, /* form */
+ (FIELDTYPE *)0, /* type */
+ (char *)0, /* arg */
+ (char *)0, /* buf */
+ (char *)0 /* usrptr */
+};
+
+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-dependant argument list to construct
+| it.
+|
+| Return Values : Pointer to argument structure. Maybe NULL.
+| In case of an error in *err an errorcounter is increased.
++--------------------------------------------------------------------------*/
+TypeArgument*
+_nc_Make_Argument(const FIELDTYPE *typ, va_list *ap, int *err)
+{
+ TypeArgument *res = (TypeArgument *)0;
+ TypeArgument *p;
+
+ if (typ && (typ->status & _HAS_ARGS))
+ {
+ assert(err && ap);
+ if (typ->status & _LINKED_TYPE)
+ {
+ p = (TypeArgument *)malloc(sizeof(TypeArgument));
+ if (p)
+ {
+ 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);
+ 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 errorcounter is increased.
++--------------------------------------------------------------------------*/
+TypeArgument*
+_nc_Copy_Argument(const FIELDTYPE *typ,
+ const TypeArgument *argp, int *err)
+{
+ TypeArgument *res = (TypeArgument *)0;
+ TypeArgument *p;
+
+ if ( typ && (typ->status & _HAS_ARGS) )
+ {
+ assert(err && argp);
+ if (typ->status & _LINKED_TYPE)
+ {
+ p = (TypeArgument *)malloc(sizeof(TypeArgument));
+ if (p)
+ {
+ 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)
+ {
+ 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 : -
++--------------------------------------------------------------------------*/
+void
+_nc_Free_Argument(const FIELDTYPE * typ, TypeArgument * argp)
+{
+ if (!typ || !(typ->status & _HAS_ARGS))
+ return;
+
+ if (typ->status & _LINKED_TYPE)
+ {
+ assert(argp);
+ _nc_Free_Argument(typ->left ,argp->left );
+ _nc_Free_Argument(typ->right,argp->right);
+ free(argp);
+ }
+ else
+ {
+ if (typ->freearg)
+ 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 occured
++--------------------------------------------------------------------------*/
+bool
+_nc_Copy_Type(FIELD *dst, FIELD const *src)
+{
+ int err = 0;
+
+ assert(dst && src);
+
+ dst->type = src->type;
+ dst->arg = (void *)_nc_Copy_Argument(src->type,(TypeArgument *)(src->arg),&err);
+
+ if (err)
+ {
+ _nc_Free_Argument(dst->type,(TypeArgument *)(dst->arg));
+ dst->type = (FIELDTYPE *)0;
+ dst->arg = (void *)0;
+ return FALSE;
+ }
+ else
+ {
+ if (dst->type)
+ dst->type->ref++;
+ return TRUE;
+ }
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : void _nc_Free_Type( FIELD *field )
+|
+| Description : Release Argument structure for this field
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+void
+_nc_Free_Type(FIELD *field)
+{
+ assert(field);
+ if (field->type)
+ 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.
++--------------------------------------------------------------------------*/
+FIELD *new_field(int rows, int cols, int frow, int fcol, int nrow, int nbuf)
+{
+ FIELD *New_Field = (FIELD *)0;
+ int err = E_BAD_ARGUMENT;
+
+ 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=(FIELD *)malloc(sizeof(FIELD))) )
+ {
+ *New_Field = default_field;
+ New_Field->rows = rows;
+ New_Field->cols = cols;
+ New_Field->drows = rows + nrow;
+ New_Field->dcols = cols;
+ New_Field->frow = frow;
+ New_Field->fcol = fcol;
+ New_Field->nrow = nrow;
+ New_Field->nbuf = nbuf;
+ New_Field->link = New_Field;
+
+ if (_nc_Copy_Type(New_Field,&default_field))
+ {
+ size_t len;
+
+ len = Total_Buffer_Size(New_Field);
+ if ((New_Field->buf = (char *)malloc(len)))
+ {
+ /* Prefill buffers with blanks and insert terminating zeroes
+ between buffers */
+ int i;
+
+ memset(New_Field->buf,' ',len);
+ for(i=0;i<=New_Field->nbuf;i++)
+ {
+ New_Field->buf[(New_Field->drows*New_Field->cols+1)*(i+1)-1]
+ = '\0';
+ }
+ return New_Field;
+ }
+ }
+ }
+
+ if (New_Field)
+ free_field(New_Field);
+
+ SET_ERROR( err );
+ return (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
++--------------------------------------------------------------------------*/
+int free_field(FIELD * field)
+{
+ if (!field)
+ RETURN(E_BAD_ARGUMENT);
+
+ if (field->form)
+ RETURN(E_CONNECTED);
+
+ if (field == field->link)
+ {
+ if (field->buf)
+ free(field->buf);
+ }
+ else
+ {
+ FIELD *f;
+
+ for(f=field;f->link != field;f = f->link)
+ {}
+ f->link = field->link;
+ }
+ _nc_Free_Type(field);
+ free(field);
+ RETURN(E_OK);
+}
+
+/* fld_def.c ends here */
diff --git a/contrib/ncurses/form/fld_dup.c b/contrib/ncurses/form/fld_dup.c
new file mode 100644
index 000000000000..d265f958f218
--- /dev/null
+++ b/contrib/ncurses/form/fld_dup.c
@@ -0,0 +1,97 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_dup.c,v 1.4 1999/05/16 17:17:08 juergen 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
++--------------------------------------------------------------------------*/
+FIELD *dup_field(FIELD * field, int frow, int fcol)
+{
+ FIELD *New_Field = (FIELD *)0;
+ int err = E_BAD_ARGUMENT;
+
+ if (field && (frow>=0) && (fcol>=0) &&
+ ((err=E_SYSTEM_ERROR) != 0) && /* trick : this resets the default error */
+ (New_Field=(FIELD *)malloc(sizeof(FIELD))) )
+ {
+ *New_Field = *_nc_Default_Field;
+ New_Field->frow = frow;
+ New_Field->fcol = 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=(char *)malloc(len)) )
+ {
+ memcpy(New_Field->buf,field->buf,len);
+ return New_Field;
+ }
+ }
+ }
+
+ if (New_Field)
+ free_field(New_Field);
+
+ SET_ERROR(err);
+ return (FIELD *)0;
+}
+
+/* fld_dup.c ends here */
diff --git a/contrib/ncurses/form/fld_ftchoice.c b/contrib/ncurses/form/fld_ftchoice.c
new file mode 100644
index 000000000000..8e7d2a9683f1
--- /dev/null
+++ b/contrib/ncurses/form/fld_ftchoice.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_ftchoice.c,v 1.4 1999/05/16 17:17:21 juergen 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
++--------------------------------------------------------------------------*/
+int set_fieldtype_choice(FIELDTYPE * typ,
+ bool (* const next_choice) (FIELD *,const void *),
+ bool (* const prev_choice) (FIELD *,const void *))
+{
+ if ( !typ || !next_choice || !prev_choice )
+ RETURN(E_BAD_ARGUMENT);
+
+ typ->status |= _HAS_CHOICE;
+ typ->next = next_choice;
+ typ->prev = prev_choice;
+ RETURN(E_OK);
+}
+
+/* fld_ftchoice.c ends here */
diff --git a/contrib/ncurses/form/fld_ftlink.c b/contrib/ncurses/form/fld_ftlink.c
new file mode 100644
index 000000000000..1c30cab244a4
--- /dev/null
+++ b/contrib/ncurses/form/fld_ftlink.c
@@ -0,0 +1,83 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_ftlink.c,v 1.4 1999/05/16 17:17:33 juergen 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 occured.
++--------------------------------------------------------------------------*/
+FIELDTYPE *link_fieldtype(FIELDTYPE * type1, FIELDTYPE * type2)
+{
+ FIELDTYPE *nftyp = (FIELDTYPE *)0;
+
+ if ( type1 && type2 )
+ {
+ nftyp = (FIELDTYPE *)malloc(sizeof(FIELDTYPE));
+ if (nftyp)
+ {
+ *nftyp = *_nc_Default_FieldType;
+ nftyp->status |= _LINKED_TYPE;
+ if ((type1->status & _HAS_ARGS) || (type2->status & _HAS_ARGS) )
+ nftyp->status |= _HAS_ARGS;
+ if ((type1->status & _HAS_CHOICE) || (type2->status & _HAS_CHOICE) )
+ nftyp->status |= _HAS_CHOICE;
+ nftyp->left = type1;
+ nftyp->right = type2;
+ type1->ref++;
+ type2->ref++;
+ }
+ else
+ {
+ SET_ERROR( E_SYSTEM_ERROR );
+ }
+ }
+ else
+ {
+ SET_ERROR( E_BAD_ARGUMENT );
+ }
+ return nftyp;
+}
+
+/* fld_ftlink.c ends here */
diff --git a/contrib/ncurses/form/fld_info.c b/contrib/ncurses/form/fld_info.c
new file mode 100644
index 000000000000..98100a4f40a2
--- /dev/null
+++ b/contrib/ncurses/form/fld_info.c
@@ -0,0 +1,91 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_info.c,v 1.4 1999/05/16 17:17:52 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : int field_info(const FIELD *field,
+| int *rows, int *cols,
+| int *frow, int *fcol,
+| int *nrow, int *nbuf)
+|
+| Description : Retrieve infos about the fields creation parameters.
+|
+| Return Values : E_OK - success
+| E_BAD_ARGUMENT - invalid field pointer
++--------------------------------------------------------------------------*/
+int field_info(const FIELD *field,
+ int *rows, int *cols,
+ int *frow, int *fcol,
+ int *nrow, int *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 informations about a dynamic fields current
+| dynamic parameters.
+|
+| Return Values : E_OK - success
+| E_BAD_ARGUMENT - invalid argument
++--------------------------------------------------------------------------*/
+int dynamic_field_info(const FIELD *field,
+ int *drows, int *dcols, int *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/contrib/ncurses/form/fld_just.c b/contrib/ncurses/form/fld_just.c
new file mode 100644
index 000000000000..2a6dd38ec390
--- /dev/null
+++ b/contrib/ncurses/form/fld_just.c
@@ -0,0 +1,81 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_just.c,v 1.5 1999/05/16 17:18:06 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : int set_field_just(FIELD *field, int just)
+|
+| Description : Set the fields type of justification.
+|
+| Return Values : E_OK - success
+| E_BAD_ARGUMENT - one of the arguments was incorrect
+| E_SYSTEM_ERROR - system error
++--------------------------------------------------------------------------*/
+int set_field_just(FIELD * field, int just)
+{
+ int res = E_BAD_ARGUMENT;
+
+ if ((just==NO_JUSTIFICATION) ||
+ (just==JUSTIFY_LEFT) ||
+ (just==JUSTIFY_CENTER) ||
+ (just==JUSTIFY_RIGHT) )
+ {
+ Normalize_Field( field );
+ if (field->just != just)
+ {
+ field->just = just;
+ res = _nc_Synchronize_Attributes( field );
+ }
+ else
+ res = E_OK;
+ }
+ RETURN(res);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : int field_just( const FIELD *field )
+|
+| Description : Retrieve the fields type of justification
+|
+| Return Values : The justification type.
++--------------------------------------------------------------------------*/
+int field_just(const FIELD * field)
+{
+ return Normalize_Field( field )->just;
+}
+
+/* fld_just.c ends here */
diff --git a/contrib/ncurses/form/fld_link.c b/contrib/ncurses/form/fld_link.c
new file mode 100644
index 000000000000..4352d6abf083
--- /dev/null
+++ b/contrib/ncurses/form/fld_link.c
@@ -0,0 +1,90 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_link.c,v 1.4 1999/05/16 17:18:18 juergen 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
++--------------------------------------------------------------------------*/
+FIELD *link_field(FIELD * field, int frow, int fcol)
+{
+ FIELD *New_Field = (FIELD *)0;
+ int err = E_BAD_ARGUMENT;
+
+ if (field && (frow>=0) && (fcol>=0) &&
+ ((err=E_SYSTEM_ERROR) != 0) && /* trick: this resets the default error */
+ (New_Field = (FIELD *)malloc(sizeof(FIELD))) )
+ {
+ *New_Field = *_nc_Default_Field;
+ New_Field->frow = frow;
+ New_Field->fcol = 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))
+ return New_Field;
+ }
+
+ if (New_Field)
+ free_field(New_Field);
+
+ SET_ERROR( err );
+ return (FIELD *)0;
+}
+
+/* fld_link.c ends here */
diff --git a/contrib/ncurses/form/fld_max.c b/contrib/ncurses/form/fld_max.c
new file mode 100644
index 000000000000..f17bcec5a478
--- /dev/null
+++ b/contrib/ncurses/form/fld_max.c
@@ -0,0 +1,74 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_max.c,v 1.4 1999/05/16 17:18:34 juergen 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
++--------------------------------------------------------------------------*/
+int set_max_field(FIELD *field, int 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)))
+ RETURN(E_BAD_ARGUMENT);
+ }
+ field->maxgrow = maxgrow;
+ field->status &= ~_MAY_GROW;
+ if (!(field->opts & O_STATIC))
+ {
+ if ((maxgrow==0) ||
+ ( single_line_field && (field->dcols < maxgrow)) ||
+ (!single_line_field && (field->drows < maxgrow)))
+ field->status |= _MAY_GROW;
+ }
+ }
+ RETURN(E_OK);
+}
+
+/* fld_max.c ends here */
diff --git a/contrib/ncurses/form/fld_move.c b/contrib/ncurses/form/fld_move.c
new file mode 100644
index 000000000000..7965d5afbea8
--- /dev/null
+++ b/contrib/ncurses/form/fld_move.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_move.c,v 1.4 1999/05/16 17:38:51 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : int move_field(FIELD *field,int frow, int fcol)
+|
+| Description : Moves the disconnected field to the new location in
+| the forms subwindow.
+|
+| Return Values : E_OK - success
+| E_BAD_ARGUMENT - invalid argument passed
+| E_CONNECTED - field is connected
++--------------------------------------------------------------------------*/
+int move_field(FIELD *field, int frow, int fcol)
+{
+ if ( !field || (frow<0) || (fcol<0) )
+ RETURN(E_BAD_ARGUMENT);
+
+ if (field->form)
+ RETURN(E_CONNECTED);
+
+ field->frow = frow;
+ field->fcol = fcol;
+ RETURN(E_OK);
+}
+
+/* fld_move.c ends here */
+
diff --git a/contrib/ncurses/form/fld_newftyp.c b/contrib/ncurses/form/fld_newftyp.c
new file mode 100644
index 000000000000..68b1692a2ab8
--- /dev/null
+++ b/contrib/ncurses/form/fld_newftyp.c
@@ -0,0 +1,125 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_newftyp.c,v 1.5 1999/05/16 17:18:54 juergen Exp $")
+
+static FIELDTYPE const 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 */
+ NULL, /* field validation function */
+ NULL, /* Character check function */
+ NULL, /* enumerate next function */
+ NULL /* enumerate previous function */
+};
+
+const 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 occured
++--------------------------------------------------------------------------*/
+FIELDTYPE *new_fieldtype(
+ bool (* const field_check)(FIELD *,const void *),
+ bool (* const char_check) (int,const void *) )
+{
+ FIELDTYPE *nftyp = (FIELDTYPE *)0;
+
+ if ( (field_check) || (char_check) )
+ {
+ nftyp = (FIELDTYPE *)malloc(sizeof(FIELDTYPE));
+ if (nftyp)
+ {
+ *nftyp = default_fieldtype;
+ nftyp->fcheck = field_check;
+ nftyp->ccheck = char_check;
+ }
+ else
+ {
+ SET_ERROR( E_SYSTEM_ERROR );
+ }
+ }
+ else
+ {
+ SET_ERROR( E_BAD_ARGUMENT );
+ }
+ return 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
++--------------------------------------------------------------------------*/
+int free_fieldtype(FIELDTYPE *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/contrib/ncurses/form/fld_opts.c b/contrib/ncurses/form/fld_opts.c
new file mode 100644
index 000000000000..e5cd996d06b5
--- /dev/null
+++ b/contrib/ncurses/form/fld_opts.c
@@ -0,0 +1,124 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_opts.c,v 1.6 1999/05/16 17:19:06 juergen 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
++--------------------------------------------------------------------------*/
+int set_field_opts(FIELD * field, Field_Options opts)
+{
+ int res = E_BAD_ARGUMENT;
+ 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 fields options.
+|
+| Return Values : The options.
++--------------------------------------------------------------------------*/
+Field_Options field_opts(const FIELD * field)
+{
+ return 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
++--------------------------------------------------------------------------*/
+int field_opts_on(FIELD * field, Field_Options opts)
+{
+ int res = E_BAD_ARGUMENT;
+
+ 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
++--------------------------------------------------------------------------*/
+int field_opts_off(FIELD * field, Field_Options opts)
+{
+ int res = E_BAD_ARGUMENT;
+
+ 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/contrib/ncurses/form/fld_pad.c b/contrib/ncurses/form/fld_pad.c
new file mode 100644
index 000000000000..527e151198b7
--- /dev/null
+++ b/contrib/ncurses/form/fld_pad.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_pad.c,v 1.4 1999/05/16 17:38:58 juergen 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
++--------------------------------------------------------------------------*/
+int set_field_pad(FIELD * field, int ch)
+{
+ int res = E_BAD_ARGUMENT;
+
+ Normalize_Field( field );
+ if (isprint((unsigned char)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 fields pad character.
+|
+| Return Values : The pad character.
++--------------------------------------------------------------------------*/
+int field_pad(const FIELD * field)
+{
+ return Normalize_Field( field )->pad;
+}
+
+/* fld_pad.c ends here */
diff --git a/contrib/ncurses/form/fld_page.c b/contrib/ncurses/form/fld_page.c
new file mode 100644
index 000000000000..452a507cca78
--- /dev/null
+++ b/contrib/ncurses/form/fld_page.c
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_page.c,v 1.4 1999/05/16 17:19:37 juergen 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
++--------------------------------------------------------------------------*/
+int set_new_page(FIELD * field, bool new_page_flag)
+{
+ Normalize_Field(field);
+ if (field->form)
+ RETURN(E_CONNECTED);
+
+ if (new_page_flag)
+ field->status |= _NEWPAGE;
+ else
+ field->status &= ~_NEWPAGE;
+
+ RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : bool new_page(const FIELD *field)
+|
+| Description : Retrieve the info 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
++--------------------------------------------------------------------------*/
+bool new_page(const FIELD * field)
+{
+ return (Normalize_Field(field)->status & _NEWPAGE) ? TRUE : FALSE;
+}
+
+/* fld_page.c ends here */
diff --git a/contrib/ncurses/form/fld_stat.c b/contrib/ncurses/form/fld_stat.c
new file mode 100644
index 000000000000..98144bf2f1c4
--- /dev/null
+++ b/contrib/ncurses/form/fld_stat.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_stat.c,v 1.6 1999/05/16 17:19:48 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : int set_field_status(FIELD *field, bool status)
+|
+| Description : Set or clear the 'changed' indication flag for that
+| fields primary buffer.
+|
+| Return Values : E_OK - success
++--------------------------------------------------------------------------*/
+int set_field_status(FIELD * field, bool status)
+{
+ Normalize_Field( field );
+
+ if (status)
+ field->status |= _CHANGED;
+ else
+ field->status &= ~_CHANGED;
+
+ return(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : bool field_status(const FIELD *field)
+|
+| Description : Retrieve the value of the 'changed' indication flag
+| for that fields primary buffer.
+|
+| Return Values : TRUE - buffer has been changed
+| FALSE - buffer has not been changed
++--------------------------------------------------------------------------*/
+bool field_status(const FIELD * field)
+{
+ return ((Normalize_Field(field)->status & _CHANGED) ? TRUE : FALSE);
+}
+
+/* fld_stat.c ends here */
diff --git a/contrib/ncurses/form/fld_type.c b/contrib/ncurses/form/fld_type.c
new file mode 100644
index 000000000000..238b54747809
--- /dev/null
+++ b/contrib/ncurses/form/fld_type.c
@@ -0,0 +1,92 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_type.c,v 1.9 1999/05/16 17:19:59 juergen 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
++--------------------------------------------------------------------------*/
+int set_field_type(FIELD *field,FIELDTYPE *type, ...)
+{
+ va_list ap;
+ int res = E_SYSTEM_ERROR;
+ int err = 0;
+
+ 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.
++--------------------------------------------------------------------------*/
+FIELDTYPE *field_type(const FIELD * field)
+{
+ return Normalize_Field(field)->type;
+}
+
+/* fld_type.c ends here */
diff --git a/contrib/ncurses/form/fld_user.c b/contrib/ncurses/form/fld_user.c
new file mode 100644
index 000000000000..cf5b4c291048
--- /dev/null
+++ b/contrib/ncurses/form/fld_user.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fld_user.c,v 1.8 1999/05/16 17:20:09 juergen 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 informations
+|
+| Return Values : E_OK - on success
++--------------------------------------------------------------------------*/
+int set_field_userptr(FIELD * 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 informations.
+|
+| Return Values : Value of pointer. If no such pointer has been set,
+| NULL is returned
++--------------------------------------------------------------------------*/
+void *field_userptr(const FIELD *field)
+{
+ return Normalize_Field( field )->usrptr;
+}
+
+/* fld_user.c ends here */
diff --git a/contrib/ncurses/form/form.h b/contrib/ncurses/form/form.h
new file mode 100644
index 000000000000..40ae0a35f02f
--- /dev/null
+++ b/contrib/ncurses/form/form.h
@@ -0,0 +1,388 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#ifndef FORM_H
+#define FORM_H
+
+#include <curses.h>
+#include <eti.h>
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+typedef int Form_Options;
+typedef int Field_Options;
+
+ /**********
+ * _PAGE *
+ **********/
+
+typedef struct {
+ 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 */
+} _PAGE;
+
+ /**********
+ * FIELD *
+ **********/
+
+typedef struct fieldnode {
+ 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; /* offscreen 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 */
+ char * buf; /* field buffers */
+ void * usrptr; /* user pointer */
+} FIELD;
+
+ /**************
+ * FIELDTYPE *
+ **************/
+
+typedef struct typenode {
+ 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 */
+
+ 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 */
+
+} FIELDTYPE;
+
+ /*********
+ * FORM *
+ *********/
+
+typedef struct formnode {
+ 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 *);
+
+} FORM;
+
+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 (0x0001)
+#define O_ACTIVE (0x0002)
+#define O_PUBLIC (0x0004)
+#define O_EDIT (0x0008)
+#define O_WRAP (0x0010)
+#define O_BLANK (0x0020)
+#define O_AUTOSKIP (0x0040)
+#define O_NULLOK (0x0080)
+#define O_PASSOK (0x0100)
+#define O_STATIC (0x0200)
+
+/* form options */
+#define O_NL_OVERLOAD (0x0001)
+#define O_BS_OVERLOAD (0x0002)
+
+/* 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 line 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 FIELDTYPE *TYPE_ALPHA,
+ *TYPE_ALNUM,
+ *TYPE_ENUM,
+ *TYPE_INTEGER,
+ *TYPE_NUMERIC,
+ *TYPE_REGEXP;
+
+ /************************************
+ * built-in additional field types *
+ * They are not defined in SVr4 *
+ ************************************/
+extern FIELDTYPE *TYPE_IPV4; /* Internet IP Version 4 address */
+
+ /***********************
+ * Default objects *
+ ***********************/
+extern FORM *_nc_Default_Form;
+extern FIELD *_nc_Default_Field;
+
+
+ /***********************
+ * FIELDTYPE routines *
+ ***********************/
+extern FIELDTYPE
+ *new_fieldtype(
+ bool (* const field_check)(FIELD *,const void *),
+ bool (* const char_check)(int,const void *)),
+ *link_fieldtype(FIELDTYPE *,FIELDTYPE *);
+
+extern int free_fieldtype(FIELDTYPE *),
+ set_fieldtype_arg(FIELDTYPE *,
+ void * (* const make_arg)(va_list *),
+ void * (* const copy_arg)(const void *),
+ void (* const free_arg)(void *)),
+ set_fieldtype_choice (FIELDTYPE *,
+ bool (* const next_choice)(FIELD *,const void *),
+ bool (* const prev_choice)(FIELD *,const void *));
+
+ /*******************
+ * FIELD routines *
+ *******************/
+extern FIELD *new_field(int,int,int,int,int,int),
+ *dup_field(FIELD *,int,int),
+ *link_field(FIELD *,int,int);
+
+extern int free_field(FIELD *),
+ field_info(const FIELD *,int *,int *,int *,int *,int *,int *),
+ dynamic_field_info(const FIELD *,int *,int *,int *),
+ set_max_field( FIELD *,int),
+ move_field(FIELD *,int,int),
+ set_field_type(FIELD *,FIELDTYPE *,...),
+ set_new_page(FIELD *,bool),
+ set_field_just(FIELD *,int),
+ field_just(const FIELD *),
+ set_field_fore(FIELD *,chtype),
+ set_field_back(FIELD *,chtype),
+ set_field_pad(FIELD *,int),
+ field_pad(const FIELD *),
+ set_field_buffer(FIELD *,int,const char *),
+ set_field_status(FIELD *,bool),
+ set_field_userptr(FIELD *, void *),
+ set_field_opts(FIELD *,Field_Options),
+ field_opts_on(FIELD *,Field_Options),
+ field_opts_off(FIELD *,Field_Options);
+
+extern chtype field_fore(const FIELD *),
+ field_back(const FIELD *);
+
+extern bool new_page(const FIELD *),
+ field_status(const FIELD *);
+
+extern void *field_arg(const FIELD *);
+
+extern void *field_userptr(const FIELD *);
+
+extern FIELDTYPE
+ *field_type(const FIELD *);
+
+extern char* field_buffer(const FIELD *,int);
+
+extern Field_Options
+ field_opts(const FIELD *);
+
+ /******************
+ * FORM routines *
+ ******************/
+extern FORM *new_form(FIELD **);
+
+extern FIELD **form_fields(const FORM *),
+ *current_field(const FORM *);
+
+extern WINDOW *form_win(const FORM *),
+ *form_sub(const FORM *);
+
+extern Form_Hook
+ form_init(const FORM *),
+ form_term(const FORM *),
+ field_init(const FORM *),
+ field_term(const FORM *);
+
+extern int free_form(FORM *),
+ set_form_fields(FORM *,FIELD **),
+ field_count(const FORM *),
+ set_form_win(FORM *,WINDOW *),
+ set_form_sub(FORM *,WINDOW *),
+ set_current_field(FORM *,FIELD *),
+ field_index(const FIELD *),
+ set_form_page(FORM *,int),
+ form_page(const FORM *),
+ scale_form(const FORM *,int *,int *),
+ set_form_init(FORM *,Form_Hook),
+ set_form_term(FORM *,Form_Hook),
+ set_field_init(FORM *,Form_Hook),
+ set_field_term(FORM *,Form_Hook),
+ post_form(FORM *),
+ unpost_form(FORM *),
+ pos_form_cursor(FORM *),
+ form_driver(FORM *,int),
+ set_form_userptr(FORM *,void *),
+ set_form_opts(FORM *,Form_Options),
+ form_opts_on(FORM *,Form_Options),
+ form_opts_off(FORM *,Form_Options),
+ form_request_by_name(const char *);
+
+extern const char
+ *form_request_name(int);
+
+extern void *form_userptr(const FORM *);
+
+extern Form_Options
+ form_opts(const FORM *);
+
+extern bool data_ahead(const FORM *),
+ data_behind(const FORM *);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* FORM_H */
diff --git a/contrib/ncurses/form/form.priv.h b/contrib/ncurses/form/form.priv.h
new file mode 100644
index 000000000000..886121c94cd8
--- /dev/null
+++ b/contrib/ncurses/form/form.priv.h
@@ -0,0 +1,128 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "mf_common.h"
+#include "form.h"
+
+/* form status values */
+#define _OVLMODE (0x04) /* Form is in overlay mode */
+#define _WINDOW_MODIFIED (0x10) /* Current field window has been modified */
+#define _FCHECK_REQUIRED (0x20) /* Current field needs validation */
+
+/* field status values */
+#define _CHANGED (0x01) /* Field has been changed */
+#define _NEWTOP (0x02) /* Vertical scrolling occured */
+#define _NEWPAGE (0x04) /* field begins new page of form */
+#define _MAY_GROW (0x08) /* dynamic field may still grow */
+
+/* fieldtype status values */
+#define _LINKED_TYPE (0x01) /* Type is a linked type */
+#define _HAS_ARGS (0x02) /* Type has arguments */
+#define _HAS_CHOICE (0x04) /* Type has choice methods */
+#define _RESIDENT (0x08) /* Type is builtin */
+
+/* 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)?(form):_nc_Default_Form)
+
+/* If field is NULL replace field argument by default-field */
+#define Normalize_Field(field) ((field)=(field)?(field):_nc_Default_Field)
+
+/* Retrieve forms window */
+#define Get_Form_Window(form) \
+ ((form)->sub?(form)->sub:((form)->win?(form)->win:stdscr))
+
+/* 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) \
+ ( (Buffer_Length(field) + 1) * (1+(field)->nbuf) )
+
+/* Logic to determine whether or not a field is single lined */
+#define Single_Line_Field(field) \
+ (((field)->rows + (field)->nrow) == 1)
+
+/* Logic to determine whether or not a field is selectable */
+#define Field_Is_Selectable(f) (((f)->opts & O_SELECTABLE)==O_SELECTABLE)
+#define Field_Is_Not_Selectable(f) (((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 ALL_FIELD_OPTS ( \
+ O_VISIBLE |\
+ O_ACTIVE |\
+ O_PUBLIC |\
+ O_EDIT |\
+ O_WRAP |\
+ O_BLANK |\
+ O_AUTOSKIP|\
+ O_NULLOK |\
+ O_PASSOK |\
+ O_STATIC )
+
+
+#define C_BLANK ' '
+#define is_blank(c) ((c)==C_BLANK)
+
+extern const FIELDTYPE* _nc_Default_FieldType;
+
+extern TypeArgument* _nc_Make_Argument(const FIELDTYPE*,va_list*,int*);
+extern TypeArgument *_nc_Copy_Argument(const FIELDTYPE*,const TypeArgument*, int*);
+extern void _nc_Free_Argument(const FIELDTYPE*,TypeArgument*);
+extern bool _nc_Copy_Type(FIELD*, FIELD const *);
+extern void _nc_Free_Type(FIELD *);
+
+extern int _nc_Synchronize_Attributes(FIELD*);
+extern int _nc_Synchronize_Options(FIELD*,Field_Options);
+extern int _nc_Set_Form_Page(FORM*,int,FIELD*);
+extern int _nc_Refresh_Current_Field(FORM*);
+extern FIELD* _nc_First_Active_Field(FORM*);
+extern bool _nc_Internal_Validation(FORM*);
+extern int _nc_Set_Current_Field(FORM*,FIELD*);
+extern int _nc_Position_Form_Cursor(FORM*);
diff --git a/contrib/ncurses/form/frm_cursor.c b/contrib/ncurses/form/frm_cursor.c
new file mode 100644
index 000000000000..96ad2d60693e
--- /dev/null
+++ b/contrib/ncurses/form/frm_cursor.c
@@ -0,0 +1,66 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_cursor.c,v 1.4 1999/05/16 17:20:19 juergen 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
++--------------------------------------------------------------------------*/
+int pos_form_cursor(FORM * form)
+{
+ int res;
+
+ 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/contrib/ncurses/form/frm_data.c b/contrib/ncurses/form/frm_data.c
new file mode 100644
index 000000000000..e90f5a17ec4d
--- /dev/null
+++ b/contrib/ncurses/form/frm_data.c
@@ -0,0 +1,181 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_data.c,v 1.6 1999/05/16 17:20:29 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : bool data_behind(const FORM *form)
+|
+| Description : Check for off-screen data behind. This is nearly trivial
+| becose the begin of a field is fixed.
+|
+| Return Values : TRUE - there are off-screen data behind
+| FALSE - there are no off-screen data behind
++--------------------------------------------------------------------------*/
+bool data_behind(const FORM *form)
+{
+ bool result = FALSE;
+
+ 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;
+ }
+ }
+ return(result);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static char * After_Last_Non_Pad_Position(
+| char *buffer,
+| int len,
+| int pad)
+|
+| Description : Find the last position in the buffer that doesn't
+| contain a padding character.
+|
+| Return Values : The pointer to this position
++--------------------------------------------------------------------------*/
+INLINE
+static char * After_Last_Non_Pad_Position(char *buffer, int len, int pad)
+{
+ char *end = buffer + len;
+
+ assert(buffer && len>=0);
+ while ( (buffer < end) && (*(end-1)==pad) )
+ end--;
+
+ return end;
+}
+
+#define SMALL_BUFFER_SIZE (80)
+
+/*---------------------------------------------------------------------------
+| 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
++--------------------------------------------------------------------------*/
+bool data_ahead(const FORM *form)
+{
+ bool result = FALSE;
+
+ if (form && (form->status & _POSTED) && form->current)
+ {
+ static char buffer[SMALL_BUFFER_SIZE + 1];
+ FIELD *field;
+ bool large_buffer;
+ bool cursor_moved = FALSE;
+ char *bp;
+ char *found_content;
+ int pos;
+
+ field = form->current;
+ assert(form->w);
+
+ large_buffer = (field->cols > SMALL_BUFFER_SIZE);
+ if (large_buffer)
+ bp = (char *)malloc((size_t)(field->cols) + 1);
+ else
+ bp = buffer;
+
+ assert(bp);
+
+ if (Single_Line_Field(field))
+ {
+ int check_len;
+
+ pos = form->begincol + field->cols;
+ while (pos < field->dcols)
+ {
+ check_len = field->dcols - pos;
+ if ( check_len >= field->cols )
+ check_len = field->cols;
+ cursor_moved = TRUE;
+ wmove(form->w,0,pos);
+ winnstr(form->w,bp,check_len);
+ found_content =
+ After_Last_Non_Pad_Position(bp,check_len,field->pad);
+ if (found_content==bp)
+ 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++;
+ winnstr(form->w,bp,field->cols);
+ found_content =
+ After_Last_Non_Pad_Position(bp,field->cols,field->pad);
+ if (found_content!=bp)
+ {
+ result = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (large_buffer)
+ free(bp);
+
+ if (cursor_moved)
+ wmove(form->w,form->currow,form->curcol);
+ }
+ return(result);
+}
+
+/* frm_data.c ends here */
diff --git a/contrib/ncurses/form/frm_def.c b/contrib/ncurses/form/frm_def.c
new file mode 100644
index 000000000000..34be5fe7ca9c
--- /dev/null
+++ b/contrib/ncurses/form/frm_def.c
@@ -0,0 +1,376 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_def.c,v 1.9 1999/05/16 17:20:43 juergen 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 *_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;
+ int maximum_row_in_field, maximum_col_in_field;
+ _PAGE *pg;
+
+ 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)
+ RETURN(E_BAD_ARGUMENT);
+
+ /* allocate page structures */
+ if ( (pg = (_PAGE *)malloc(page_nr * sizeof(_PAGE))) != (_PAGE *)0 )
+ {
+ 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++)
+ {
+ if (j==0)
+ pg->pmin = j;
+ else
+ {
+ if (fields[j]->status & _NEWPAGE)
+ {
+ pg->pmax = j-1;
+ pg++;
+ pg->pmin = 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 = maximum_row_in_field;
+ if (form->cols < maximum_col_in_field)
+ form->cols = maximum_col_in_field;
+ }
+
+ pg->pmax = field_cnt-1;
+ form->maxfield = field_cnt;
+ form->maxpage = 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 = j;
+ fields[j]->page = page_nr;
+ fld = Insert_Field_By_Position(fields[j],fld);
+ }
+ form->page[page_nr].smin = fld->index;
+ form->page[page_nr].smax = fld->sprev->index;
+ }
+ 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
+| any other - error occured
++--------------------------------------------------------------------------*/
+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( FIELD **fields )
+|
+| Description : Create new form with given array of fields.
+|
+| Return Values : Pointer to form. NULL if error occured.
++--------------------------------------------------------------------------*/
+FORM *new_form(FIELD ** fields)
+{
+ int err = E_SYSTEM_ERROR;
+
+ FORM *form = (FORM *)malloc(sizeof(FORM));
+
+ if (form)
+ {
+ *form = *_nc_Default_Form;
+ if ((err=Associate_Fields(form,fields))!=E_OK)
+ {
+ free_form(form);
+ form = (FORM *)0;
+ }
+ }
+
+ if (!form)
+ SET_ERROR(err);
+
+ return(form);
+}
+
+/*---------------------------------------------------------------------------
+| 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
++--------------------------------------------------------------------------*/
+int free_form(FORM * 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
+| E_POSTED - form is posted
++--------------------------------------------------------------------------*/
+int set_form_fields(FORM * form, FIELD ** fields)
+{
+ FIELD **old;
+ int res;
+
+ 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
++--------------------------------------------------------------------------*/
+FIELD **form_fields(const FORM * form)
+{
+ return (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
++--------------------------------------------------------------------------*/
+int field_count(const FORM * form)
+{
+ return (Normalize_Form( form )->maxfield);
+}
+
+/* frm_def.c ends here */
diff --git a/contrib/ncurses/form/frm_driver.c b/contrib/ncurses/form/frm_driver.c
new file mode 100644
index 000000000000..e609e191de2a
--- /dev/null
+++ b/contrib/ncurses/form/frm_driver.c
@@ -0,0 +1,3843 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_driver.c,v 1.35 1999/05/16 17:20:52 juergen 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_ )
+ Esseantially 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_ )
+ Esseantially 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 behaviour 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 behaviour
+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 behaviour */
+#define FRIENDLY_PREV_NEXT_WORD (1)
+/* Fix the wrong behaviour 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)
+
+/*----------------------------------------------------------------------------
+ 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 fields 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 fields 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 fields 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 forms 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 forms 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 forms 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 forms current field
+ buffer# N */
+#define Address_Of_Current_Position_In_Buffer(form) \
+ Address_Of_Current_Position_In_Nth_Buffer(form,0)
+
+/* Logic to decide wether 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)->opts & 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)->dcols == (field)->cols) && \
+ ((field)->opts & O_STATIC)) )
+
+/* 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 fields window */
+#define Set_Field_Window_Attributes(field,win) \
+( wbkgdset((win),(chtype)((field)->pad | (field)->back)), \
+ wattrset((win),(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->opts & 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))
+
+/*---------------------------------------------------------------------------
+| 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
++--------------------------------------------------------------------------*/
+INLINE static char *Get_Start_Of_Data(char * buf, int blen)
+{
+ char *p = buf;
+ char *end = &buf[blen];
+
+ assert(buf && blen>=0);
+ while( (p < end) && is_blank(*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.
++--------------------------------------------------------------------------*/
+INLINE static char *After_End_Of_Data(char * buf,int blen)
+{
+ char *p = &buf[blen];
+
+ assert(buf && blen>=0);
+ while( (p>buf) && is_blank(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.
++--------------------------------------------------------------------------*/
+INLINE static char *Get_First_Whitespace_Character(char * buf, int blen)
+{
+ char *p = buf;
+ char *end = &p[blen];
+
+ assert(buf && blen>=0);
+ while( (p < end) && !is_blank(*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.
++--------------------------------------------------------------------------*/
+INLINE static char *After_Last_Whitespace_Character(char * buf, int blen)
+{
+ char *p = &buf[blen];
+
+ assert(buf && blen>=0);
+ while( (p>buf) && !is_blank(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 : -
++--------------------------------------------------------------------------*/
+INLINE static void Adjust_Cursor_Position(FORM * form, const char * 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 its a multiline
+| 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 len;
+ int row;
+ char *pBuffer;
+
+ assert(win && field);
+
+ width = getmaxx(win);
+ height = getmaxy(win);
+
+ for(row=0, pBuffer=field->buf;
+ row < height;
+ row++, pBuffer += width )
+ {
+ if ((len = (int)( After_End_Of_Data( pBuffer, width ) - pBuffer )) > 0)
+ {
+ wmove( win, row, 0 );
+ waddnstr( win, pBuffer, len );
+ }
+ }
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void Window_To_Buffer(
+| WINDOW * win,
+| 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(WINDOW * win, FIELD * field)
+{
+ int pad;
+ int len = 0;
+ char *p;
+ int row, height;
+
+ assert(win && field && field->buf );
+
+ pad = field->pad;
+ p = field->buf;
+ height = getmaxy(win);
+
+ for(row=0; (row < height) && (row < field->drows); row++ )
+ {
+ wmove( win, row, 0 );
+ len += winnstr( win, p+len, field->dcols );
+ }
+ p[len] = '\0';
+
+ /* replace visual padding character by blanks in buffer */
+ if (pad != C_BLANK)
+ {
+ int i;
+ for(i=0; i<len; i++, p++)
+ {
+ if (*p==pad)
+ *p = C_BLANK;
+ }
+ }
+}
+
+/*---------------------------------------------------------------------------
+| 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 : -
++--------------------------------------------------------------------------*/
+INLINE static void Synchronize_Buffer(FORM * form)
+{
+ if (form->status & _WINDOW_MODIFIED)
+ {
+ form->status &= ~_WINDOW_MODIFIED;
+ form->status |= _FCHECK_REQUIRED;
+ Window_To_Buffer(form->w,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;
+ char *oldbuf = field->buf;
+ char *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)
+ field->status &= ~_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)
+ field->status &= ~_MAY_GROW;
+ }
+ /* drows, dcols changed, so we get really the new buffer length */
+ new_buflen = Buffer_Length(field);
+ newbuf=(char *)malloc((size_t)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)))
+ field->status |= _MAY_GROW;
+ return FALSE;
+ }
+ else
+ { /* Copy all the buffers. This is the reason why we can't
+ just use realloc().
+ */
+ int i;
+ char *old_bp;
+ char *new_bp;
+
+ field->buf = newbuf;
+ for(i=0;i<=field->nbuf;i++)
+ {
+ new_bp = Address_Of_Nth_Buffer(field,i);
+ old_bp = oldbuf + i*(1+old_buflen);
+ memcpy(new_bp,old_bp,(size_t)old_buflen);
+ if (new_buflen > old_buflen)
+ memset(new_bp + old_buflen,C_BLANK,
+ (size_t)(new_buflen - old_buflen));
+ *(new_bp + new_buflen) = '\0';
+ }
+
+ if (need_visual_update)
+ {
+ WINDOW *new_window = newpad(field->drows,field->dcols);
+ if (!new_window)
+ { /* 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)))
+ field->status |= _MAY_GROW;
+ free( newbuf );
+ return FALSE;
+ }
+ assert(form!=(FORM *)0);
+ 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);
+ }
+
+ 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;
+ }
+ }
+ result = TRUE;
+ }
+ }
+ return(result);
+}
+
+/*---------------------------------------------------------------------------
+| 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
++--------------------------------------------------------------------------*/
+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 fields window to the
+| window of the form.
+|
+| Return Values : E_OK - on success
+| E_BAD_ARGUMENT - invalid form pointer
+| E_SYSTEM_ERROR - general error
++--------------------------------------------------------------------------*/
+int
+_nc_Refresh_Current_Field(FORM * form)
+{
+ WINDOW *formwin;
+ FIELD *field;
+
+ if (!form)
+ RETURN(E_BAD_ARGUMENT);
+
+ if (!form->w || !form->current)
+ RETURN(E_SYSTEM_ERROR);
+
+ field = form->current;
+ formwin = Get_Form_Window(form);
+
+ if (field->opts & 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 + 1;
+ }
+ copywin(form->w,
+ formwin,
+ 0,
+ form->begincol,
+ field->frow,
+ field->fcol,
+ field->frow,
+ field->cols + field->fcol - 1,
+ 0);
+ }
+ else
+ { /* A multiline, i.e. vertical scrolling field */
+ int row_after_bottom,first_modified_row,first_unmodified_row;
+
+ if (field->drows > field->rows)
+ {
+ row_after_bottom = form->toprow + field->rows;
+ if (form->currow < form->toprow)
+ {
+ form->toprow = form->currow;
+ field->status |= _NEWTOP;
+ }
+ if (form->currow >= row_after_bottom)
+ {
+ form->toprow = form->currow - field->rows + 1;
+ field->status |= _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;
+ field->status &= ~_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)
+ 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);
+ }
+ wsyncup(formwin);
+ }
+ else
+ { /* if the field-window is simply a derived window, i.e. contains
+ no invisible parts, the whole thing is trivial
+ */
+ wsyncup(form->w);
+ }
+ }
+ untouchwin(form->w);
+ return _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)
+{
+ char *bp;
+ int len;
+ int col = 0;
+
+ bp = 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 && (field->drows == 1) && (field->dcols == field->cols));
+
+ 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);
+ waddnstr(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)
+{
+ char *bp;
+ int len;
+
+ bp = 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);
+ waddnstr(win,bp,len);
+ }
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_Char(
+| 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(FIELDTYPE * typ, int ch, TypeArgument *argp)
+{
+ if (typ)
+ {
+ if (typ->status & _LINKED_TYPE)
+ {
+ assert(argp);
+ return(
+ Check_Char(typ->left ,ch,argp->left ) ||
+ Check_Char(typ->right,ch,argp->right) );
+ }
+ else
+ {
+ if (typ->ccheck)
+ return typ->ccheck(ch,(void *)argp);
+ }
+ }
+ return (isprint((unsigned char)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->opts & O_VISIBLE)
+ Set_Field_Window_Attributes(field,win);
+ else
+ wattrset(win,getattrs(fwin));
+ werase(win);
+ }
+
+ if (!bEraseFlag)
+ {
+ if (field->opts & O_PUBLIC)
+ {
+ if (Justification_Allowed(field))
+ Perform_Justification(field,win);
+ else
+ Buffer_To_Window(field,win);
+ }
+ field->status &= ~_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->opts & O_PUBLIC) && Justification_Allowed(field) )
+ Undo_Justification( field, form->w );
+ else
+ Buffer_To_Window( field, form->w );
+
+ field->status |= _NEWTOP;
+ res = _nc_Refresh_Current_Field( form );
+ }
+ else
+ res = Display_Field( field );
+ }
+ field->status |= _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 returnvalue.
+|
+| 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;
+ int syncres;
+
+ if (!field)
+ return(E_BAD_ARGUMENT);
+
+ if (!field->link)
+ return(E_SYSTEM_ERROR);
+
+ for(linked_field = field->link;
+ linked_field!= field;
+ linked_field = linked_field->link )
+ {
+ 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 fields 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
++--------------------------------------------------------------------------*/
+int _nc_Synchronize_Attributes(FIELD * field)
+{
+ FORM *form;
+ int res = E_OK;
+ WINDOW *formwin;
+
+ if (!field)
+ return(E_BAD_ARGUMENT);
+
+ 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);
+ if (field->opts & O_PUBLIC)
+ {
+ if (Justification_Allowed(field))
+ Undo_Justification(field,form->w);
+ else
+ Buffer_To_Window(field,form->w);
+ }
+ else
+ {
+ formwin = Get_Form_Window(form);
+ copywin(form->w,formwin,
+ 0,0,
+ field->frow,field->fcol,
+ field->rows-1,field->cols-1,0);
+ wsyncup(formwin);
+ Buffer_To_Window(field,form->w);
+ field->status |= _NEWTOP; /* fake refresh to paint all */
+ _nc_Refresh_Current_Field(form);
+ }
+ }
+ else
+ {
+ res = Display_Field(field);
+ }
+ }
+ return(res);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : int _nc_Synchronize_Options(FIELD * field,
+| Field_Options newopts)
+|
+| Description : If a fields options have changed, this routine is
+| called to propagate these changes to the screen and
+| to really change the behaviour of the field.
+|
+| Return Values : E_OK - success
+| E_BAD_ARGUMENT - invalid field pointer
+| E_SYSTEM_ERROR - some severe basic error
++--------------------------------------------------------------------------*/
+int
+_nc_Synchronize_Options(FIELD *field, Field_Options newopts)
+{
+ Field_Options oldopts;
+ Field_Options changed_opts;
+ FORM *form;
+ int res = E_OK;
+
+ if (!field)
+ return(E_BAD_ARGUMENT);
+
+ oldopts = field->opts;
+ changed_opts = oldopts ^ newopts;
+ field->opts = newopts;
+ form = field->form;
+
+ if (form)
+ {
+ if (form->current == field)
+ {
+ field->opts = oldopts;
+ return(E_CURRENT);
+ }
+
+ if (form->status & _POSTED)
+ {
+ if ((form->curpage == field->page))
+ {
+ if (changed_opts & O_VISIBLE)
+ {
+ if (newopts & O_VISIBLE)
+ res = Display_Field(field);
+ else
+ res = Erase_Field(field);
+ }
+ else
+ {
+ if ((changed_opts & O_PUBLIC) &&
+ (newopts & O_VISIBLE))
+ res = Display_Field(field);
+ }
+ }
+ }
+ }
+
+ if (changed_opts & O_STATIC)
+ {
+ bool single_line_field = Single_Line_Field(field);
+ int res2 = E_OK;
+
+ if (newopts & O_STATIC)
+ { /* the field becomes now static */
+ field->status &= ~_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)))
+ {
+ field->status |= _MAY_GROW;
+ /* a field with justification now changes its behaviour,
+ 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;
+ }
+
+ return(res);
+}
+
+/*---------------------------------------------------------------------------
+| 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
++--------------------------------------------------------------------------*/
+int
+_nc_Set_Current_Field(FORM *form, FIELD *newfield)
+{
+ FIELD *field;
+ WINDOW *new_window;
+
+ if (!form || !newfield || !form->current || (newfield->form!=form))
+ return(E_BAD_ARGUMENT);
+
+ if ( (form->status & _IN_DRIVER) )
+ return(E_BAD_STATE);
+
+ if (!(form->field))
+ return(E_NOT_CONNECTED);
+
+ field = form->current;
+
+ if ((field!=newfield) ||
+ !(form->status & _POSTED))
+ {
+ if ((form->w) &&
+ (field->opts & O_VISIBLE) &&
+ (field->form->curpage == field->page))
+ {
+ _nc_Refresh_Current_Field(form);
+ if (field->opts & O_PUBLIC)
+ {
+ if (field->drows > field->rows)
+ {
+ if (form->toprow==0)
+ field->status &= ~_NEWTOP;
+ else
+ field->status |= _NEWTOP;
+ }
+ else
+ {
+ if (Justification_Allowed(field))
+ {
+ Window_To_Buffer(form->w,field);
+ werase(form->w);
+ Perform_Justification(field,form->w);
+ wsyncup(form->w);
+ }
+ }
+ }
+ delwin(form->w);
+ }
+
+ 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)
+ return(E_SYSTEM_ERROR);
+
+ form->current = field;
+ form->w = new_window;
+ form->status &= ~_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;
+ return(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 multiline
+| 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;
+
+ if ((++(form->curcol))==field->dcols)
+ {
+ if ((++(form->currow))==field->drows)
+ {
+#if GROW_IF_NAVIGATE
+ if (!Single_Line_Field(field) && Field_Grown(field,1)) {
+ form->curcol = 0;
+ return(E_OK);
+ }
+#endif
+ form->currow--;
+#if GROW_IF_NAVIGATE
+ if (Single_Line_Field(field) && Field_Grown(field,1))
+ return(E_OK);
+#endif
+ form->curcol--;
+ return(E_REQUEST_DENIED);
+ }
+ form->curcol = 0;
+ }
+ return(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static int IFN_Previous_Character(FORM * form)
+|
+| Description : Move to the previous character in the field. In a
+| multiline 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)
+{
+ if ((--(form->curcol))<0)
+ {
+ if ((--(form->currow))<0)
+ {
+ form->currow++;
+ form->curcol++;
+ return(E_REQUEST_DENIED);
+ }
+ form->curcol = form->current->dcols - 1;
+ }
+ return(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;
+
+ if ((++(form->currow))==field->drows)
+ {
+#if GROW_IF_NAVIGATE
+ if (!Single_Line_Field(field) && Field_Grown(field,1))
+ return(E_OK);
+#endif
+ form->currow--;
+ return(E_REQUEST_DENIED);
+ }
+ form->curcol = 0;
+ return(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)
+{
+ if ( (--(form->currow)) < 0 )
+ {
+ form->currow++;
+ return(E_REQUEST_DENIED);
+ }
+ form->curcol = 0;
+ return(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;
+ char *bp = Address_Of_Current_Position_In_Buffer(form);
+ char *s;
+ char *t;
+
+ /* 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 startpoint 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)
+ return(E_REQUEST_DENIED);
+ else
+#endif
+ {
+ Adjust_Cursor_Position(form,t);
+ return(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;
+ char *bp = Address_Of_Current_Position_In_Buffer(form);
+ char *s;
+ char *t;
+ bool again = FALSE;
+
+ /* 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)
+ return(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)
+ return(E_REQUEST_DENIED);
+#endif
+ }
+ Adjust_Cursor_Position(form,t);
+ return(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;
+
+ Synchronize_Buffer(form);
+ Adjust_Cursor_Position(form,
+ Get_Start_Of_Data(field->buf,Buffer_Length(field)));
+ return(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 cursos is positioned on the last
+| character.
+|
+| Return Values : E_OK - success
++--------------------------------------------------------------------------*/
+static int IFN_End_Of_Field(FORM * form)
+{
+ FIELD *field = form->current;
+ char *pos;
+
+ 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);
+ return(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;
+
+ Synchronize_Buffer(form);
+ Adjust_Cursor_Position(form,
+ Get_Start_Of_Data(Address_Of_Current_Row_In_Buffer(form),
+ field->dcols));
+ return(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;
+ char *pos;
+ char *bp;
+
+ 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);
+ return(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)
+{
+ if ( (--(form->curcol)) < 0 )
+ {
+ form->curcol++;
+ return(E_REQUEST_DENIED);
+ }
+ return(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)
+{
+ if ( (++(form->curcol)) == form->current->dcols )
+ {
+#if GROW_IF_NAVIGATE
+ FIELD *field = form->current;
+ if (Single_Line_Field(field) && Field_Grown(field,1))
+ return(E_OK);
+#endif
+ --(form->curcol);
+ return(E_REQUEST_DENIED);
+ }
+ return(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)
+{
+ if ( (--(form->currow)) < 0 )
+ {
+ form->currow++;
+ return(E_REQUEST_DENIED);
+ }
+ return(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;
+
+ if ( (++(form->currow)) == field->drows )
+ {
+#if GROW_IF_NAVIGATE
+ if (!Single_Line_Field(field) && Field_Grown(field,1))
+ return(E_OK);
+#endif
+ --(form->currow);
+ return(E_REQUEST_DENIED);
+ }
+ return(E_OK);
+}
+/*----------------------------------------------------------------------------
+ END of Intra-Field Navigation routines
+ --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+ Vertical scrolling helper routines
+ --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static int VSC_Generic(FORM *form, int lines)
+|
+| Description : Scroll multi-line field forward (lines>0) or
+| backward (lines<0) this many lines.
+|
+| Return Values : E_OK - success
+| E_REQUEST_DENIED - can't scroll
++--------------------------------------------------------------------------*/
+static int VSC_Generic(FORM *form, int lines)
+{
+ FIELD *field = form->current;
+ int res = E_REQUEST_DENIED;
+ int rows_to_go = (lines > 0 ? lines : -lines);
+
+ if (lines > 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 occured.
+|
+| 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)
+ form->current->status |= _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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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 columns)
+|
+| Description : Scroll single-line field forward (columns>0) or
+| backward (columns<0) this many columns.
+|
+| Return Values : E_OK - success
+| E_REQUEST_DENIED - can't scroll
++--------------------------------------------------------------------------*/
+static int HSC_Generic(FORM *form, int columns)
+{
+ FIELD *field = form->current;
+ int res = E_REQUEST_DENIED;
+ int cols_to_go = (columns > 0 ? columns : -columns);
+
+ if (columns > 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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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)
+{
+ return 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
++--------------------------------------------------------------------------*/
+INLINE static bool Is_There_Room_For_A_Line(FORM * form)
+{
+ FIELD *field = form->current;
+ char *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)
++--------------------------------------------------------------------------*/
+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, char *txt, int len)
+{
+ FIELD *field = form->current;
+ char *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;
+ char *split;
+ int result = E_REQUEST_DENIED;
+ const char *Space = " ";
+
+ if (freelen >= requiredlen)
+ {
+ wmove(form->w,row,0);
+ winsnstr(form->w,txt,len);
+ wmove(form->w,row,len);
+ winsnstr(form->w,Space,1);
+ return 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))
+ {
+ 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);
+ winsnstr(form->w,txt,len);
+ wmove(form->w,row,len);
+ winsnstr(form->w,Space,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 successfull
+| 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->opts & 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*/
+ {
+ char *bp;
+ char *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->w,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)
+ {
+ wmove(form->w,form->currow,form->curcol);
+ wdelch(form->w);
+ Window_To_Buffer(form->w,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 occured.
+| 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
+ behaviour 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) &&
+ (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 ((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 (form->current->opts & O_EDIT)
+ {
+ res = fct(form);
+ if (res==E_OK)
+ form->status |= _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;
+ char *bp, *t;
+ bool Last_Row = ((field->drows - 1)==form->currow);
+
+ if (form->status & _OVLMODE)
+ {
+ if (Last_Row &&
+ (!(Growable(field) && !Single_Line_Field(field))))
+ {
+ if (!(form->opts & O_NL_OVERLOAD))
+ return(E_REQUEST_DENIED);
+ 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 */
+ form->status |= _WINDOW_MODIFIED;
+ return 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 */
+ return(E_SYSTEM_ERROR);
+ }
+ wclrtoeol(form->w);
+ form->currow++;
+ form->curcol = 0;
+ form->status |= _WINDOW_MODIFIED;
+ return(E_OK);
+ }
+ }
+ else
+ { /* Insert Mode */
+ if (Last_Row &&
+ !(Growable(field) && !Single_Line_Field(field)))
+ {
+ if (!(form->opts & O_NL_OVERLOAD))
+ return(E_REQUEST_DENIED);
+ return 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)))
+ return(E_REQUEST_DENIED);
+ if (!May_Do_It && !Field_Grown(field,1))
+ return(E_SYSTEM_ERROR);
+
+ bp= Address_Of_Current_Position_In_Buffer(form);
+ t = After_End_Of_Data(bp,field->dcols - form->curcol);
+ wclrtoeol(form->w);
+ form->currow++;
+ form->curcol=0;
+ wmove(form->w,form->currow,form->curcol);
+ winsertln(form->w);
+ waddnstr(form->w,bp,(int)(t-bp));
+ form->status |= _WINDOW_MODIFIED;
+ return 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;
+
+ if (Check_Char(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);
+ }
+ }
+ }
+ return 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;
+
+ if (Check_Char(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;
+ }
+ }
+ }
+ return 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)
+{
+ wdelch(form->w);
+ return 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;
+
+ if (First_Position_In_Current_Field(form))
+ return E_REQUEST_DENIED;
+
+ if ( (--(form->curcol))<0 )
+ {
+ char *this_line, *prev_line, *prev_end, *this_end;
+
+ form->curcol++;
+ if (form->status & _OVLMODE)
+ return 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)))
+ return E_REQUEST_DENIED;
+ wdeleteln(form->w);
+ Adjust_Cursor_Position(form,prev_end);
+ wmove(form->w,form->currow,form->curcol);
+ waddnstr(form->w,this_line,(int)(this_end-this_line));
+ }
+ else
+ {
+ wmove(form->w,form->currow,form->curcol);
+ wdelch(form->w);
+ }
+ return 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)
+{
+ form->curcol = 0;
+ wdeleteln(form->w);
+ return 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;
+ char *bp = Address_Of_Current_Row_In_Buffer(form);
+ char *ep = bp + field->dcols;
+ char *cp = bp + form->curcol;
+ char *s;
+
+ Synchronize_Buffer(form);
+ if (is_blank(*cp))
+ return 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) && !is_blank(*s))
+ {
+ /* copy remaining line to window */
+ waddnstr(form->w,s,(int)(s - After_End_Of_Data(s,(int)(ep - s))));
+ }
+ return 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)
+{
+ wclrtoeol(form->w);
+ return E_OK;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static int FE_Clear_To_End_Of_Form(FORM * form)
+|
+| Description : Clear to end of form.
+|
+| Return Values : E_OK - success
++--------------------------------------------------------------------------*/
+static int FE_Clear_To_End_Of_Form(FORM * form)
+{
+ wclrtobot(form->w);
+ return 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)
+{
+ form->currow = form->curcol = 0;
+ werase(form->w);
+ return 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)
+{
+ form->status |= _OVLMODE;
+ return 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)
+{
+ form->status &= ~_OVLMODE;
+ return E_OK;
+}
+
+/*----------------------------------------------------------------------------
+ END of Edit Mode routines
+ --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+ Helper routines for Choice Requests
+ --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Next_Choice(
+| 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(FIELDTYPE * typ, FIELD *field, TypeArgument *argp)
+{
+ if (!typ || !(typ->status & _HAS_CHOICE))
+ return FALSE;
+
+ if (typ->status & _LINKED_TYPE)
+ {
+ assert(argp);
+ return(
+ Next_Choice(typ->left ,field,argp->left) ||
+ Next_Choice(typ->right,field,argp->right) );
+ }
+ else
+ {
+ assert(typ->next);
+ return typ->next(field,(void *)argp);
+ }
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Previous_Choice(
+| 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(FIELDTYPE *typ, FIELD *field, TypeArgument *argp)
+{
+ if (!typ || !(typ->status & _HAS_CHOICE))
+ return FALSE;
+
+ if (typ->status & _LINKED_TYPE)
+ {
+ assert(argp);
+ return(
+ Previous_Choice(typ->left ,field,argp->left) ||
+ Previous_Choice(typ->right,field,argp->right));
+ }
+ else
+ {
+ assert(typ->prev);
+ return typ->prev(field,(void *)argp);
+ }
+}
+/*----------------------------------------------------------------------------
+ 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;
+ Synchronize_Buffer(form);
+ return ((Next_Choice(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;
+ Synchronize_Buffer(form);
+ return ((Previous_Choice(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(
+| 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(FIELDTYPE *typ, FIELD *field, TypeArgument *argp)
+{
+ if (typ)
+ {
+ if (field->opts & O_NULLOK)
+ {
+ char *bp = field->buf;
+ assert(bp);
+ while(is_blank(*bp))
+ { bp++; }
+ if (*bp == '\0')
+ return TRUE;
+ }
+
+ if (typ->status & _LINKED_TYPE)
+ {
+ assert(argp);
+ return(
+ Check_Field(typ->left ,field,argp->left ) ||
+ Check_Field(typ->right,field,argp->right) );
+ }
+ else
+ {
+ if (typ->fcheck)
+ return typ->fcheck(field,(void *)argp);
+ }
+ }
+ 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
++--------------------------------------------------------------------------*/
+bool
+_nc_Internal_Validation(FORM *form)
+{
+ FIELD *field;
+
+ field = form->current;
+
+ Synchronize_Buffer(form);
+ if ((form->status & _FCHECK_REQUIRED) ||
+ (!(field->opts & O_PASSOK)))
+ {
+ if (!Check_Field(field->type,field,(TypeArgument *)(field->arg)))
+ return FALSE;
+ form->status &= ~_FCHECK_REQUIRED;
+ field->status |= _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)
+{
+ if (_nc_Internal_Validation(form))
+ return E_OK;
+ else
+ return 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
+| fields array. Only visible and active fields are
+| counted.
+|
+| Return Values : Pointer to the next field.
++--------------------------------------------------------------------------*/
+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.
++--------------------------------------------------------------------------*/
+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)->opts & O_VISIBLE))
+ break;
+ } while(proposed!=(*field));
+
+ proposed = *field;
+
+ if ((proposed == *last_on_page) && !(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 fields array. Only visible and active fields are
+| counted.
+|
+| Return Values : Pointer to the previous field.
++--------------------------------------------------------------------------*/
+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.
++--------------------------------------------------------------------------*/
+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.
++--------------------------------------------------------------------------*/
+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_Neighbour_Field(FIELD * field)
+|
+| Description : Get the left neighbour of the field on the same line
+| and the same page. Cycles through the line.
+|
+| Return Values : Pointer to left neighbour field.
++--------------------------------------------------------------------------*/
+INLINE static FIELD *Left_Neighbour_Field(FIELD * field)
+{
+ FIELD *field_on_page = field;
+
+ /* For a field that has really a left neighbour, the while clause
+ immediately fails and the loop is left, positioned at the right
+ neighbour. Otherwise we cycle backwards through the sorted fieldlist
+ 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_Neighbour_Field(FIELD * field)
+|
+| Description : Get the right neighbour of the field on the same line
+| and the same page.
+|
+| Return Values : Pointer to right neighbour field.
++--------------------------------------------------------------------------*/
+INLINE static FIELD *Right_Neighbour_Field(FIELD * field)
+{
+ FIELD *field_on_page = field;
+
+ /* See the comments on Left_Neighbour_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_Neighbour_Field(FIELD * field)
+|
+| Description : Because of the row-major nature of sorting the fields,
+| its more difficult to define whats the upper neighbour
+| field really means. We define that it must be on a
+| 'previous' line (cyclic order!) and is the rightmost
+| field laying 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 neighbour field.
++--------------------------------------------------------------------------*/
+static FIELD *Upper_Neighbour_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_Neighbour_Field(FIELD * field)
+|
+| Description : Because of the row-major nature of sorting the fields,
+| its more difficult to define whats the down neighbour
+| 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 neighbour field.
++--------------------------------------------------------------------------*/
+static FIELD *Down_Neighbour_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 behaviour 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)
+{
+ return _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)
+{
+ return _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)
+{
+ return _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)
+{
+ return
+ _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)
+{
+ return _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)
+{
+ return _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)
+{
+ return _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)
+{
+ return _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)
+{
+ return _nc_Set_Current_Field(form,
+ Left_Neighbour_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)
+{
+ return _nc_Set_Current_Field(form,
+ Right_Neighbour_Field(form->current));
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static int FN_Up_Field(FORM * form)
+|
+| Description : Get the upper neighbour of the current field. This
+| cycles through the page. See the comments of the
+| Upper_Neighbour_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)
+{
+ return _nc_Set_Current_Field(form,
+ Upper_Neighbour_Field(form->current));
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static int FN_Down_Field(FORM * form)
+|
+| Description : Get the down neighbour of the current field. This
+| cycles through the page. See the comments of the
+| Down_Neighbour_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)
+{
+ return _nc_Set_Current_Field(form,
+ Down_Neighbour_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 nr. 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
++--------------------------------------------------------------------------*/
+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 = page;
+ last_field = field_on_page = form->field[form->page[page].smin];
+ do
+ {
+ if (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
++--------------------------------------------------------------------------*/
+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
++--------------------------------------------------------------------------*/
+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 behaviour 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 forms 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)
+{
+ return _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)
+{
+ return _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)
+{
+ return _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)
+{
+ return _nc_Set_Form_Page(form,form->maxpage-1,(FIELD *)0);
+}
+/*----------------------------------------------------------------------------
+ END of Field Navigation routines
+ --------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+ Helper routines for the core form driver.
+ --------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+| 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 -
+| E_REQUEST_DENIED -
+| E_SYSTEM_ERROR -
++--------------------------------------------------------------------------*/
+static int Data_Entry(FORM * form, int c)
+{
+ FIELD *field = form->current;
+ int result = E_REQUEST_DENIED;
+
+ if ( (field->opts & O_EDIT)
+#if FIX_FORM_INACTIVE_BUG
+ && (field->opts & O_ACTIVE)
+#endif
+ )
+ {
+ if ( (field->opts & 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));
+ form->status |= _WINDOW_MODIFIED;
+ if (End_Of_Field && !Growable(field) && (field->opts & 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
+ {
+ IFN_Next_Character(form);
+ 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 */
+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_Form},
+ { 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}
+};
+
+/*---------------------------------------------------------------------------
+| 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_UNKNOWN_COMMAND - command not known
++--------------------------------------------------------------------------*/
+int form_driver(FORM * form, int c)
+{
+ const Binding_Info* BI = (Binding_Info *)0;
+ int res = E_UNKNOWN_COMMAND;
+
+ if (!form)
+ RETURN(E_BAD_ARGUMENT);
+
+ if (!(form->field))
+ 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))
+ 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 = ((BI->keycode & ID_Mask) >> ID_Shft) & 0xffff;
+
+ 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);
+ }
+ }
+ else
+ {
+ if (!(c & (~(int)MAX_REGULAR_CHARACTER)) &&
+ isprint((unsigned char)c) &&
+ Check_Char(form->current->type,c,
+ (TypeArgument *)(form->current->arg)))
+ res = Data_Entry(form,c);
+ }
+ _nc_Refresh_Current_Field(form);
+ RETURN(res);
+}
+
+/*----------------------------------------------------------------------------
+ Field-Buffer manipulation routines.
+ The effects of setting a buffer is 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 an own 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 needs not to be zero ter-
+| minated. 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
++--------------------------------------------------------------------------*/
+int set_field_buffer(FIELD * field, int buffer, const char * value)
+{
+ char *s, *p;
+ int res = E_OK;
+ unsigned int len;
+
+ if ( !field || !value || ((buffer < 0)||(buffer > field->nbuf)) )
+ RETURN(E_BAD_ARGUMENT);
+
+ len = Buffer_Length(field);
+
+ if (buffer==0)
+ {
+ const char *v;
+ unsigned int i = 0;
+
+ for(v=value; *v && (i<len); v++,i++)
+ {
+ if (!isprint((unsigned char)*v))
+ RETURN(E_BAD_ARGUMENT);
+ }
+ }
+
+ 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.
+ */
+ unsigned int vlen = strlen(value);
+ if (vlen > len)
+ {
+ if (!Field_Grown(field,
+ (int)(1 + (vlen-len)/((field->rows+field->nrow)*field->cols))))
+ RETURN(E_SYSTEM_ERROR);
+
+ /* in this case we also have to check, wether or not the remaining
+ characters in value are also printable for buffer 0. */
+ if (buffer==0)
+ {
+ unsigned int i;
+
+ for(i=len; i<vlen; i++)
+ if (!isprint(value[i]))
+ RETURN(E_BAD_ARGUMENT);
+ }
+ len = vlen;
+ }
+ }
+
+ p = Address_Of_Nth_Buffer(field,buffer);
+
+#if HAVE_MEMCCPY
+ s = memccpy(p,value,0,len);
+#else
+ for(s=(char *)value; *s && (s < (value+len)); s++)
+ p[s-value] = *s;
+ if (s < (value+len))
+ {
+ p[s-value] = *s++;
+ s = p + (s-value);
+ }
+ else
+ s=(char *)0;
+#endif
+
+ if (s)
+ { /* this means, value was null terminated and not greater than the
+ buffer. We have to pad with blanks. Please note that due to memccpy
+ logic s points after the terminating null. */
+ s--; /* now we point to the terminator. */
+ assert(len >= (unsigned int)(s-p));
+ if (len > (unsigned int)(s-p))
+ memset(s,C_BLANK,len-(unsigned int)(s-p));
+ }
+
+ 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.
++--------------------------------------------------------------------------*/
+char *field_buffer(const FIELD * field, int buffer)
+{
+ if (field && (buffer >= 0) && (buffer <= field->nbuf))
+ return Address_Of_Nth_Buffer(field,buffer);
+ else
+ return (char *)0;
+}
+
+/* frm_driver.c ends here */
diff --git a/contrib/ncurses/form/frm_hook.c b/contrib/ncurses/form/frm_hook.c
new file mode 100644
index 000000000000..5a5ec29376b2
--- /dev/null
+++ b/contrib/ncurses/form/frm_hook.c
@@ -0,0 +1,140 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_hook.c,v 1.8 1999/05/16 17:21:04 juergen Exp $")
+
+/* "Template" macro to generate function to set application specific hook */
+#define GEN_HOOK_SET_FUNCTION( typ, name ) \
+int set_ ## typ ## _ ## name (FORM *form, Form_Hook 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_Hook typ ## _ ## name ( const FORM *form )\
+{\
+ return ( 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/contrib/ncurses/form/frm_opts.c b/contrib/ncurses/form/frm_opts.c
new file mode 100644
index 000000000000..009c189741ba
--- /dev/null
+++ b/contrib/ncurses/form/frm_opts.c
@@ -0,0 +1,116 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_opts.c,v 1.8 1999/05/16 17:38:05 juergen 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
++--------------------------------------------------------------------------*/
+int set_form_opts(FORM * form, Form_Options opts)
+{
+ opts &= ALL_FORM_OPTS;
+ if (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_Options form_opts(const FORM * form)
+{
+ return (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
++--------------------------------------------------------------------------*/
+int form_opts_on(FORM * form, Form_Options opts)
+{
+ opts &= ALL_FORM_OPTS;
+ if (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
++--------------------------------------------------------------------------*/
+int form_opts_off(FORM * form, Form_Options opts)
+{
+ opts &= ALL_FORM_OPTS;
+ if (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/contrib/ncurses/form/frm_page.c b/contrib/ncurses/form/frm_page.c
new file mode 100644
index 000000000000..5136542e8459
--- /dev/null
+++ b/contrib/ncurses/form/frm_page.c
@@ -0,0 +1,100 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_page.c,v 1.5 1999/05/16 17:21:26 juergen 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
++--------------------------------------------------------------------------*/
+int set_form_page(FORM * form, int page)
+{
+ int err = E_OK;
+
+ if ( !form || (page<0) || (page>=form->maxpage) )
+ RETURN(E_BAD_ARGUMENT);
+
+ if (!(form->status & _POSTED))
+ {
+ form->curpage = 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
++--------------------------------------------------------------------------*/
+int form_page(const FORM * form)
+{
+ return Normalize_Form(form)->curpage;
+}
+
+/* frm_page.c ends here */
diff --git a/contrib/ncurses/form/frm_post.c b/contrib/ncurses/form/frm_post.c
new file mode 100644
index 000000000000..3fdb57a09b8f
--- /dev/null
+++ b/contrib/ncurses/form/frm_post.c
@@ -0,0 +1,117 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_post.c,v 1.4 1999/05/16 17:21:39 juergen 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
++--------------------------------------------------------------------------*/
+int post_form(FORM * form)
+{
+ WINDOW *formwin;
+ int err;
+ int page;
+
+ 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 invald 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);
+
+ form->status |= _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
++--------------------------------------------------------------------------*/
+int unpost_form(FORM * 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;
+ form->status &= ~_POSTED;
+ RETURN(E_OK);
+}
+
+/* frm_post.c ends here */
diff --git a/contrib/ncurses/form/frm_req_name.c b/contrib/ncurses/form/frm_req_name.c
new file mode 100644
index 000000000000..63006517ee85
--- /dev/null
+++ b/contrib/ncurses/form/frm_req_name.c
@@ -0,0 +1,163 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.7 1999/05/16 17:21:53 juergen Exp $")
+
+static const char *request_names[ MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1 ] = {
+ "NEXT_PAGE" ,
+ "PREV_PAGE" ,
+ "FIRST_PAGE" ,
+ "LAST_PAGE" ,
+
+ "NEXT_FIELD" ,
+ "PREV_FIELD" ,
+ "FIRST_FIELD" ,
+ "LAST_FIELD" ,
+ "SNEXT_FIELD" ,
+ "SPREV_FIELD" ,
+ "SFIRST_FIELD" ,
+ "SLAST_FIELD" ,
+ "LEFT_FIELD" ,
+ "RIGHT_FIELD" ,
+ "UP_FIELD" ,
+ "DOWN_FIELD" ,
+
+ "NEXT_CHAR" ,
+ "PREV_CHAR" ,
+ "NEXT_LINE" ,
+ "PREV_LINE" ,
+ "NEXT_WORD" ,
+ "PREV_WORD" ,
+ "BEG_FIELD" ,
+ "END_FIELD" ,
+ "BEG_LINE" ,
+ "END_LINE" ,
+ "LEFT_CHAR" ,
+ "RIGHT_CHAR" ,
+ "UP_CHAR" ,
+ "DOWN_CHAR" ,
+
+ "NEW_LINE" ,
+ "INS_CHAR" ,
+ "INS_LINE" ,
+ "DEL_CHAR" ,
+ "DEL_PREV" ,
+ "DEL_LINE" ,
+ "DEL_WORD" ,
+ "CLR_EOL" ,
+ "CLR_EOF" ,
+ "CLR_FIELD" ,
+ "OVL_MODE" ,
+ "INS_MODE" ,
+ "SCR_FLINE" ,
+ "SCR_BLINE" ,
+ "SCR_FPAGE" ,
+ "SCR_BPAGE" ,
+ "SCR_FHPAGE" ,
+ "SCR_BHPAGE" ,
+ "SCR_FCHAR" ,
+ "SCR_BCHAR" ,
+ "SCR_HFLINE" ,
+ "SCR_HBLINE" ,
+ "SCR_HFHALF" ,
+ "SCR_HBHALF" ,
+
+ "VALIDATION" ,
+ "NEXT_CHOICE" ,
+ "PREV_CHOICE"
+};
+#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
++--------------------------------------------------------------------------*/
+const char *form_request_name( int request )
+{
+ if ( (request < MIN_FORM_COMMAND) || (request > MAX_FORM_COMMAND) )
+ {
+ SET_ERROR (E_BAD_ARGUMENT);
+ return (const char *)0;
+ }
+ else
+ return 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
++--------------------------------------------------------------------------*/
+int form_request_by_name( const char *str )
+{
+ /* because the table is so small, it doesn't really hurt
+ to run sequentially through it.
+ */
+ unsigned int i = 0;
+ char buf[16];
+
+ if (str)
+ {
+ strncpy(buf,str,sizeof(buf));
+ while( (i<sizeof(buf)) && (buf[i] != '\0') )
+ {
+ buf[i] = toupper(buf[i]);
+ i++;
+ }
+
+ for (i=0; i < A_SIZE; i++)
+ {
+ if (strncmp(request_names[i],buf,sizeof(buf))==0)
+ return MIN_FORM_COMMAND + i;
+ }
+ }
+ RETURN(E_NO_MATCH);
+}
+
+/* frm_req_name.c ends here */
diff --git a/contrib/ncurses/form/frm_scale.c b/contrib/ncurses/form/frm_scale.c
new file mode 100644
index 000000000000..bb1971770987
--- /dev/null
+++ b/contrib/ncurses/form/frm_scale.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_scale.c,v 1.4 1999/05/16 17:22:02 juergen 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
++--------------------------------------------------------------------------*/
+int scale_form(const FORM * form, int * rows, int * 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/contrib/ncurses/form/frm_sub.c b/contrib/ncurses/form/frm_sub.c
new file mode 100644
index 000000000000..849f9cb0c3b2
--- /dev/null
+++ b/contrib/ncurses/form/frm_sub.c
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_sub.c,v 1.4 1999/05/16 17:22:11 juergen 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
++--------------------------------------------------------------------------*/
+int set_form_sub(FORM * form, WINDOW * win)
+{
+ if (form && (form->status & _POSTED))
+ RETURN(E_POSTED);
+
+ Normalize_Form( form )->sub = win;
+ RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : WINDOW *form_sub(const FORM *)
+|
+| Description : Retrieve the window of the form.
+|
+| Return Values : The pointer to the Subwindow.
++--------------------------------------------------------------------------*/
+WINDOW *form_sub(const FORM * form)
+{
+ const FORM* f = Normalize_Form( form );
+ return Get_Form_Window(f);
+}
+
+/* frm_sub.c ends here */
diff --git a/contrib/ncurses/form/frm_user.c b/contrib/ncurses/form/frm_user.c
new file mode 100644
index 000000000000..853904f05413
--- /dev/null
+++ b/contrib/ncurses/form/frm_user.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_user.c,v 1.8 1999/05/16 17:22:21 juergen 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 informations
+|
+| Return Values : E_OK - on success
++--------------------------------------------------------------------------*/
+int set_form_userptr(FORM * 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 informations.
+|
+| Return Values : Value of pointer. If no such pointer has been set,
+| NULL is returned
++--------------------------------------------------------------------------*/
+void *form_userptr(const FORM * form)
+{
+ return Normalize_Form(form)->usrptr;
+}
+
+/* frm_user.c ends here */
diff --git a/contrib/ncurses/form/frm_win.c b/contrib/ncurses/form/frm_win.c
new file mode 100644
index 000000000000..b705d03314ba
--- /dev/null
+++ b/contrib/ncurses/form/frm_win.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: frm_win.c,v 1.8 1999/05/16 17:22:32 juergen 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
++--------------------------------------------------------------------------*/
+int set_form_win(FORM * form, WINDOW * win)
+{
+ if (form && (form->status & _POSTED))
+ RETURN(E_POSTED);
+
+ Normalize_Form( form )->win = win;
+ RETURN(E_OK);
+}
+
+/*---------------------------------------------------------------------------
+| 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.
++--------------------------------------------------------------------------*/
+WINDOW *form_win(const FORM * form)
+{
+ const FORM* f = Normalize_Form( form );
+ return (f->win ? f->win : stdscr);
+}
+
+/* frm_win.c ends here */
+
diff --git a/contrib/ncurses/form/fty_alnum.c b/contrib/ncurses/form/fty_alnum.c
new file mode 100644
index 000000000000..cb3909d7b1c7
--- /dev/null
+++ b/contrib/ncurses/form/fty_alnum.c
@@ -0,0 +1,137 @@
+
+/*
+ * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
+ * You may freely copy it for use as a template for your own field types.
+ * If you develop a field type that might be of general use, please send
+ * it back to the ncurses maintainers for inclusion in the next version.
+ */
+/***************************************************************************
+* *
+* Author : Juergen Pfeifer, juergen.pfeifer@gmx.net *
+* *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_alnum.c,v 1.9 1999/05/16 17:22:49 juergen Exp $")
+
+typedef struct {
+ int width;
+} alnumARG;
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Make_AlphaNumeric_Type(va_list *ap)
+|
+| Description : Allocate structure for alphanumeric type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *Make_AlphaNumeric_Type(va_list * ap)
+{
+ alnumARG *argp = (alnumARG *)malloc(sizeof(alnumARG));
+
+ if (argp)
+ argp->width = va_arg(*ap,int);
+
+ return ((void *)argp);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Copy_AlphaNumericType(const void *argp)
+|
+| Description : Copy structure for alphanumeric type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *Copy_AlphaNumeric_Type(const void *argp)
+{
+ const alnumARG *ap = (const alnumARG *)argp;
+ alnumARG *result = (alnumARG *)malloc(sizeof(alnumARG));
+
+ if (result)
+ *result = *ap;
+
+ return ((void *)result);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void Free_AlphaNumeric_Type(void *argp)
+|
+| Description : Free structure for alphanumeric type argument.
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+static void Free_AlphaNumeric_Type(void * argp)
+{
+ if (argp)
+ free(argp);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_AlphaNumeric_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_AlphaNumeric_Field(FIELD * field, const void * argp)
+{
+ int width = ((const alnumARG *)argp)->width;
+ unsigned char *bp = (unsigned char *)field_buffer(field,0);
+ int l = -1;
+ unsigned char *s;
+
+ while(*bp && *bp==' ')
+ bp++;
+ if (*bp)
+ {
+ s = bp;
+ while(*bp && isalnum(*bp))
+ bp++;
+ l = (int)(bp-s);
+ while(*bp && *bp==' ')
+ bp++;
+ }
+ return ((*bp || (l < width)) ? FALSE : TRUE);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_AlphaNumeric_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_AlphaNumeric_Character(int c, const void * argp GCC_UNUSED)
+{
+ return (isalnum(c) ? TRUE : FALSE);
+}
+
+static FIELDTYPE typeALNUM = {
+ _HAS_ARGS | _RESIDENT,
+ 1, /* this is mutable, so we can't be const */
+ (FIELDTYPE *)0,
+ (FIELDTYPE *)0,
+ Make_AlphaNumeric_Type,
+ Copy_AlphaNumeric_Type,
+ Free_AlphaNumeric_Type,
+ Check_AlphaNumeric_Field,
+ Check_AlphaNumeric_Character,
+ NULL,
+ NULL
+};
+
+FIELDTYPE* TYPE_ALNUM = &typeALNUM;
+
+/* fty_alnum.c ends here */
diff --git a/contrib/ncurses/form/fty_alpha.c b/contrib/ncurses/form/fty_alpha.c
new file mode 100644
index 000000000000..3dd8f2cb142e
--- /dev/null
+++ b/contrib/ncurses/form/fty_alpha.c
@@ -0,0 +1,138 @@
+
+/*
+ * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
+ * You may freely copy it for use as a template for your own field types.
+ * If you develop a field type that might be of general use, please send
+ * it back to the ncurses maintainers for inclusion in the next version.
+ */
+/***************************************************************************
+* *
+* Author : Juergen Pfeifer, juergen.pfeifer@gmx.net *
+* *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_alpha.c,v 1.9 1999/05/16 17:22:58 juergen Exp $")
+
+typedef struct {
+ int width;
+} alphaARG;
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Make_Alpha_Type(va_list *ap)
+|
+| Description : Allocate structure for alpha type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *Make_Alpha_Type(va_list * ap)
+{
+ alphaARG *argp = (alphaARG *)malloc(sizeof(alphaARG));
+ if (argp)
+ {
+ argp->width = va_arg(*ap,int);
+ }
+ return ((void *)argp);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Copy_Alpha_Type(const void * argp)
+|
+| Description : Copy structure for alpha type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *Copy_Alpha_Type(const void * argp)
+{
+ const alphaARG *ap = (const alphaARG *)argp;
+ alphaARG *result = (alphaARG *)malloc(sizeof(alphaARG));
+
+ if (result)
+ {
+ *result = *ap;
+ }
+ return ((void *)result);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void Free_Alpha_Type( void * argp )
+|
+| Description : Free structure for alpha type argument.
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+static void Free_Alpha_Type(void * argp)
+{
+ if (argp)
+ free(argp);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_Alpha_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_Alpha_Field(FIELD * field, const void * argp)
+{
+ int width = ((const alphaARG *)argp)->width;
+ unsigned char *bp = (unsigned char *)field_buffer(field,0);
+ int l = -1;
+ unsigned char *s;
+
+ while(*bp && *bp==' ')
+ bp++;
+ if (*bp)
+ {
+ s = bp;
+ while(*bp && isalpha(*bp))
+ bp++;
+ l = (int)(bp-s);
+ while(*bp && *bp==' ')
+ bp++;
+ }
+ return ((*bp || (l < width)) ? FALSE : TRUE);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_Alpha_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_Alpha_Character(int c, const void * argp GCC_UNUSED)
+{
+ return (isalpha(c) ? TRUE : FALSE);
+}
+
+static FIELDTYPE typeALPHA = {
+ _HAS_ARGS | _RESIDENT,
+ 1, /* this is mutable, so we can't be const */
+ (FIELDTYPE *)0,
+ (FIELDTYPE *)0,
+ Make_Alpha_Type,
+ Copy_Alpha_Type,
+ Free_Alpha_Type,
+ Check_Alpha_Field,
+ Check_Alpha_Character,
+ NULL,
+ NULL
+};
+
+FIELDTYPE* TYPE_ALPHA = &typeALPHA;
+
+/* fty_alpha.c ends here */
diff --git a/contrib/ncurses/form/fty_enum.c b/contrib/ncurses/form/fty_enum.c
new file mode 100644
index 000000000000..9716159b384f
--- /dev/null
+++ b/contrib/ncurses/form/fty_enum.c
@@ -0,0 +1,289 @@
+
+/*
+ * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
+ * You may freely copy it for use as a template for your own field types.
+ * If you develop a field type that might be of general use, please send
+ * it back to the ncurses maintainers for inclusion in the next version.
+ */
+/***************************************************************************
+* *
+* Author : Juergen Pfeifer, juergen.pfeifer@gmx.net *
+* *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_enum.c,v 1.10 1999/05/16 17:23:14 juergen Exp $")
+
+typedef struct {
+ char **kwds;
+ int count;
+ bool checkcase;
+ bool checkunique;
+} enumARG;
+
+/*---------------------------------------------------------------------------
+| 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)
+{
+ enumARG *argp = (enumARG *)malloc(sizeof(enumARG));
+ char **kp;
+ int cnt=0;
+
+ if (argp)
+ {
+ int ccase, cunique;
+ argp->kwds = va_arg(*ap,char **);
+ ccase = va_arg(*ap,int);
+ cunique = va_arg(*ap,int);
+ argp->checkcase = ccase ? TRUE : FALSE;
+ argp->checkunique = cunique ? TRUE : FALSE;
+
+ kp = argp->kwds;
+ while( (*kp++) ) cnt++;
+ argp->count = cnt;
+ }
+ return (void *)argp;
+}
+
+/*---------------------------------------------------------------------------
+| 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)
+{
+ const enumARG *ap = (const enumARG *)argp;
+ enumARG *result = (enumARG *)0;
+
+ if (argp)
+ {
+ result = (enumARG *)malloc(sizeof(enumARG));
+ if (result)
+ *result = *ap;
+ }
+ 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)
+ 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 wether 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;
+ int res;
+
+ while( (s=(*kwds++)) )
+ {
+ if ((res=Compare((unsigned char *)s,bp,ccase))!=NOMATCH)
+ {
+ p=t=s; /* t is at least a partial match */
+ if ((unique && res!=EXACT))
+ {
+ while( (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);
+
+ while(cnt--)
+ {
+ if (Compare((unsigned char *)(*kwds++),bp,ccase)==EXACT)
+ break;
+ }
+ if (cnt<=0)
+ kwds = args->kwds;
+ if ((cnt>=0) || (Compare((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);
+
+ while(cnt--)
+ {
+ if (Compare((unsigned char *)(*kwds--),bp,ccase)==EXACT)
+ break;
+ }
+
+ if (cnt<=0)
+ kwds = &args->kwds[args->count-1];
+
+ if ((cnt>=0) || (Compare((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,
+ Check_Enum_Field,
+ NULL,
+ Next_Enum,
+ Previous_Enum
+};
+
+FIELDTYPE* TYPE_ENUM = &typeENUM;
+
+/* fty_enum.c ends here */
diff --git a/contrib/ncurses/form/fty_int.c b/contrib/ncurses/form/fty_int.c
new file mode 100644
index 000000000000..cb690bdaf03d
--- /dev/null
+++ b/contrib/ncurses/form/fty_int.c
@@ -0,0 +1,160 @@
+
+/*
+ * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
+ * You may freely copy it for use as a template for your own field types.
+ * If you develop a field type that might be of general use, please send
+ * it back to the ncurses maintainers for inclusion in the next version.
+ */
+/***************************************************************************
+* *
+* Author : Juergen Pfeifer, juergen.pfeifer@gmx.net *
+* *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_int.c,v 1.10 1999/05/16 17:23:22 juergen Exp $")
+
+typedef struct {
+ int precision;
+ long low;
+ long high;
+} integerARG;
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Make_Integer_Type( va_list * ap )
+|
+| Description : Allocate structure for integer type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *Make_Integer_Type(va_list * ap)
+{
+ integerARG *argp = (integerARG *)malloc(sizeof(integerARG));
+
+ if (argp)
+ {
+ argp->precision = va_arg(*ap,int);
+ argp->low = va_arg(*ap,long);
+ argp->high = va_arg(*ap,long);
+ }
+ return (void *)argp;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Copy_Integer_Type(const void * argp)
+|
+| Description : Copy structure for integer type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *Copy_Integer_Type(const void * argp)
+{
+ const integerARG *ap = (const integerARG *)argp;
+ integerARG *result = (integerARG *)0;
+
+ if (argp)
+ {
+ result = (integerARG *)malloc(sizeof(integerARG));
+ if (result)
+ *result = *ap;
+ }
+ return (void *)result;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void Free_Integer_Type(void * argp)
+|
+| Description : Free structure for integer type argument.
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+static void Free_Integer_Type(void * argp)
+{
+ if (argp)
+ free(argp);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_Integer_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_Integer_Field(FIELD * field, const void * argp)
+{
+ const integerARG *argi = (const integerARG *)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;
+ long val;
+ char buf[100];
+
+ while( *bp && *bp==' ') bp++;
+ if (*bp)
+ {
+ if (*bp=='-') bp++;
+ while (*bp)
+ {
+ if (!isdigit(*bp)) break;
+ bp++;
+ }
+ while(*bp && *bp==' ') bp++;
+ if (*bp=='\0')
+ {
+ val = atol(s);
+ if (low<high)
+ {
+ if (val<low || val>high) return FALSE;
+ }
+ sprintf(buf,"%.*ld",(prec>0?prec:0),val);
+ set_field_buffer(field,0,buf);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_Integer_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_Integer_Character(int c, const void * argp GCC_UNUSED)
+{
+ return ((isdigit(c) || (c=='-')) ? TRUE : FALSE);
+}
+
+static FIELDTYPE typeINTEGER = {
+ _HAS_ARGS | _RESIDENT,
+ 1, /* this is mutable, so we can't be const */
+ (FIELDTYPE *)0,
+ (FIELDTYPE *)0,
+ Make_Integer_Type,
+ Copy_Integer_Type,
+ Free_Integer_Type,
+ Check_Integer_Field,
+ Check_Integer_Character,
+ NULL,
+ NULL
+};
+
+FIELDTYPE* TYPE_INTEGER = &typeINTEGER;
+
+/* fty_int.c ends here */
diff --git a/contrib/ncurses/form/fty_ipv4.c b/contrib/ncurses/form/fty_ipv4.c
new file mode 100644
index 000000000000..064c02c8fa78
--- /dev/null
+++ b/contrib/ncurses/form/fty_ipv4.c
@@ -0,0 +1,81 @@
+
+/*
+ * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
+ * You may freely copy it for use as a template for your own field types.
+ * If you develop a field type that might be of general use, please send
+ * it back to the ncurses maintainers for inclusion in the next version.
+ */
+/***************************************************************************
+* *
+* Author : Per Foreby, perf@efd.lth.se *
+* *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_ipv4.c,v 1.2 1997/04/26 22:06:00 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, d2, d3, d4;
+
+ if(isdigit(*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 (*bp && isspace(*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(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,
+ Check_IPV4_Field,
+ Check_IPV4_Character,
+ NULL,
+ NULL
+};
+
+FIELDTYPE* TYPE_IPV4 = &typeIPV4;
+
+/* fty_ipv4.c ends here */
diff --git a/contrib/ncurses/form/fty_num.c b/contrib/ncurses/form/fty_num.c
new file mode 100644
index 000000000000..ca0fbe01e00f
--- /dev/null
+++ b/contrib/ncurses/form/fty_num.c
@@ -0,0 +1,195 @@
+
+/*
+ * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
+ * You may freely copy it for use as a template for your own field types.
+ * If you develop a field type that might be of general use, please send
+ * it back to the ncurses maintainers for inclusion in the next version.
+ */
+/***************************************************************************
+* *
+* Author : Juergen Pfeifer, juergen.pfeifer@gmx.net *
+* *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_num.c,v 1.13 1999/05/16 17:23:30 juergen Exp $")
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+typedef struct {
+ int precision;
+ double low;
+ double high;
+ struct lconv* L;
+} numericARG;
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Make_Numeric_Type(va_list * ap)
+|
+| Description : Allocate structure for numeric type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error
++--------------------------------------------------------------------------*/
+static void *Make_Numeric_Type(va_list * ap)
+{
+ numericARG *argn = (numericARG *)malloc(sizeof(numericARG));
+
+ if (argn)
+ {
+ argn->precision = va_arg(*ap,int);
+ argn->low = va_arg(*ap,double);
+ argn->high = va_arg(*ap,double);
+#if HAVE_LOCALE_H
+ argn->L = localeconv();
+#else
+ argn->L = NULL;
+#endif
+ }
+ return (void *)argn;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void *Copy_Numeric_Type(const void * argp)
+|
+| Description : Copy structure for numeric type argument.
+|
+| Return Values : Pointer to argument structure or NULL on error.
++--------------------------------------------------------------------------*/
+static void *Copy_Numeric_Type(const void * argp)
+{
+ const numericARG *ap = (const numericARG *)argp;
+ numericARG *result = (numericARG *)0;
+
+ if (argp)
+ {
+ result = (numericARG *)malloc(sizeof(numericARG));
+ if (result)
+ *result = *ap;
+ }
+ return (void *)result;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static void Free_Numeric_Type(void * argp)
+|
+| Description : Free structure for numeric type argument.
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+static void Free_Numeric_Type(void * argp)
+{
+ if (argp)
+ free(argp);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_Numeric_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_Numeric_Field(FIELD * field, const void * argp)
+{
+ const numericARG *argn = (const numericARG *)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;
+ double val = 0.0;
+ struct lconv* L = argn->L;
+ char buf[64];
+
+ while(*bp && *bp==' ') bp++;
+ if (*bp)
+ {
+ if (*bp=='-' || *bp=='+')
+ bp++;
+ while(*bp)
+ {
+ if (!isdigit(*bp)) break;
+ bp++;
+ }
+ if (*bp==(
+#if HAVE_LOCALE_H
+ (L && L->decimal_point) ? *(L->decimal_point) :
+#endif
+ '.'))
+ {
+ bp++;
+ while(*bp)
+ {
+ if (!isdigit(*bp)) break;
+ bp++;
+ }
+ }
+ while(*bp && *bp==' ') bp++;
+ if (*bp=='\0')
+ {
+ val = atof(s);
+ if (low<high)
+ {
+ if (val<low || val>high) return FALSE;
+ }
+ sprintf(buf,"%.*f",(prec>0?prec:0),val);
+ set_field_buffer(field,0,buf);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnform
+| Function : static bool Check_Numeric_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_Numeric_Character(int c, const void * argp)
+{
+ const numericARG *argn = (const numericARG *)argp;
+ struct lconv* L = argn->L;
+
+ return (isdigit(c) ||
+ c == '+' ||
+ c == '-' ||
+ c == (
+#if HAVE_LOCALE_H
+ (L && L->decimal_point) ? *(L->decimal_point) :
+#endif
+ '.')
+ ) ? TRUE : FALSE;
+}
+
+static FIELDTYPE typeNUMERIC = {
+ _HAS_ARGS | _RESIDENT,
+ 1, /* this is mutable, so we can't be const */
+ (FIELDTYPE *)0,
+ (FIELDTYPE *)0,
+ Make_Numeric_Type,
+ Copy_Numeric_Type,
+ Free_Numeric_Type,
+ Check_Numeric_Field,
+ Check_Numeric_Character,
+ NULL,
+ NULL
+};
+
+FIELDTYPE* TYPE_NUMERIC = &typeNUMERIC;
+
+/* fty_num.c ends here */
diff --git a/contrib/ncurses/form/fty_regex.c b/contrib/ncurses/form/fty_regex.c
new file mode 100644
index 000000000000..7a928125d4ad
--- /dev/null
+++ b/contrib/ncurses/form/fty_regex.c
@@ -0,0 +1,257 @@
+
+/*
+ * THIS CODE IS SPECIFICALLY EXEMPTED FROM THE NCURSES PACKAGE COPYRIGHT.
+ * You may freely copy it for use as a template for your own field types.
+ * If you develop a field type that might be of general use, please send
+ * it back to the ncurses maintainers for inclusion in the next version.
+ */
+/***************************************************************************
+* *
+* Author : Juergen Pfeifer, juergen.pfeifer@gmx.net *
+* *
+***************************************************************************/
+
+#include "form.priv.h"
+
+MODULE_ID("$Id: fty_regex.c,v 1.14 1999/05/16 17:23:38 juergen Exp $")
+
+#if HAVE_REGEX_H_FUNCS /* We prefer POSIX regex */
+#include <regex.h>
+
+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
+
+/*---------------------------------------------------------------------------
+| 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)
+{
+#if HAVE_REGEX_H_FUNCS
+ char *rx = va_arg(*ap,char *);
+ RegExp_Arg *preg;
+
+ preg = (RegExp_Arg*)malloc(sizeof(RegExp_Arg));
+ if (preg)
+ {
+ if (((preg->pRegExp = (regex_t*)malloc(sizeof(regex_t))) != (regex_t*)0)
+ && !regcomp(preg->pRegExp,rx,
+ (REG_EXTENDED | REG_NOSUB | REG_NEWLINE) ))
+ {
+ preg->refCount = (unsigned long *)malloc(sizeof(unsigned long));
+ *(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 = va_arg(*ap,char *);
+ RegExp_Arg *pArg;
+
+ pArg = (RegExp_Arg *)malloc(sizeof(RegExp_Arg));
+
+ if (pArg)
+ {
+ int blen = RX_INCREMENT;
+ pArg->compiled_expression = NULL;
+ pArg->refCount = (unsigned long *)malloc(sizeof(unsigned long));
+ *(pArg->refCount) = 1;
+
+ do {
+ char *buf = (char *)malloc(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 *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)
+{
+#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)
+{
+#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);
+ }
+#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, const void * argp)
+{
+ 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,
+ Check_RegularExpression_Field,
+ NULL,
+ NULL,
+ NULL
+};
+
+FIELDTYPE* TYPE_REGEXP = &typeREGEXP;
+
+/* fty_regex.c ends here */
diff --git a/contrib/ncurses/form/headers b/contrib/ncurses/form/headers
new file mode 100644
index 000000000000..f2267c8722c1
--- /dev/null
+++ b/contrib/ncurses/form/headers
@@ -0,0 +1,31 @@
+##############################################################################
+# Copyright (c) 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> 1996
+#
+$(srcdir)/form.h
diff --git a/contrib/ncurses/form/llib-lform b/contrib/ncurses/form/llib-lform
new file mode 100644
index 000000000000..ac2ba436d666
--- /dev/null
+++ b/contrib/ncurses/form/llib-lform
@@ -0,0 +1,694 @@
+/****************************************************************************
+ * Copyright (c) 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> 1996,1997 *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./fld_arg.c */
+
+#include "form.priv.h"
+
+#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 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
+bool _nc_Copy_Type(
+ FIELD *dst,
+ FIELD const *src)
+ { return(*(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,
+ bool (*const next_choice)(
+ FIELD *p1,
+ const void *p2),
+ 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
+const FIELDTYPE *_nc_Default_FieldType = {0};
+
+#undef new_fieldtype
+FIELDTYPE *new_fieldtype(
+ bool (*const field_check)(
+ FIELD *p1,
+ const void *p2),
+ 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,
+ bool new_page_flag)
+ { return(*(int *)0); }
+
+#undef new_page
+bool new_page(
+ const FIELD *field)
+ { return(*(bool *)0); }
+
+/* ./fld_stat.c */
+
+#undef set_field_status
+int set_field_status(
+ FIELD *field,
+ bool status)
+ { return(*(int *)0); }
+
+#undef field_status
+bool field_status(
+ const FIELD *field)
+ { return(*(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
+bool data_behind(
+ const FORM *form)
+ { return(*(bool *)0); }
+
+#undef data_ahead
+bool data_ahead(
+ const FORM *form)
+ { return(*(bool *)0); }
+
+/* ./frm_def.c */
+
+#undef _nc_Default_Form
+FORM *_nc_Default_Form;
+
+#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_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_Set_Current_Field
+int _nc_Set_Current_Field(
+ FORM *form,
+ FIELD *newfield)
+ { return(*(int *)0); }
+
+#undef _nc_Internal_Validation
+bool _nc_Internal_Validation(
+ FORM *form)
+ { return(*(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;
+
+/* ./fty_alpha.c */
+
+typedef struct {
+ int width;
+} alphaARG;
+
+#undef TYPE_ALPHA
+FIELDTYPE *TYPE_ALPHA;
+
+/* ./fty_enum.c */
+
+typedef struct {
+ char **kwds;
+ int count;
+ bool checkcase;
+ bool checkunique;
+} enumARG;
+
+#undef TYPE_ENUM
+FIELDTYPE *TYPE_ENUM;
+
+/* ./fty_int.c */
+
+typedef struct {
+ int precision;
+ long low;
+ long high;
+} integerARG;
+
+#undef TYPE_INTEGER
+FIELDTYPE *TYPE_INTEGER;
+
+/* ./fty_ipv4.c */
+#undef TYPE_IPV4
+FIELDTYPE *TYPE_IPV4;
+
+/* ./fty_num.c */
+
+#include <locale.h>
+
+typedef struct {
+ int precision;
+ double low;
+ double high;
+ struct lconv* L;
+} numericARG;
+
+#undef TYPE_NUMERIC
+FIELDTYPE *TYPE_NUMERIC;
+
+/* ./fty_regex.c */
+
+#include <regex.h>
+
+typedef struct
+{
+ regex_t *pRegExp;
+ unsigned long *refCount;
+} RegExp_Arg;
+
+#undef TYPE_REGEXP
+FIELDTYPE *TYPE_REGEXP;
diff --git a/contrib/ncurses/form/modules b/contrib/ncurses/form/modules
new file mode 100644
index 000000000000..4125e93e5a33
--- /dev/null
+++ b/contrib/ncurses/form/modules
@@ -0,0 +1,73 @@
+# $Id: modules,v 1.13 1999/02/19 00:27:47 juergen Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+
+@ base
+# Library objects
+fld_arg lib $(srcdir) $(FORM_PRIV_H)
+fld_attr lib $(srcdir) $(FORM_PRIV_H)
+fld_current lib $(srcdir) $(FORM_PRIV_H)
+fld_def lib $(srcdir) $(FORM_PRIV_H)
+fld_dup lib $(srcdir) $(FORM_PRIV_H)
+fld_ftchoice lib $(srcdir) $(FORM_PRIV_H)
+fld_ftlink lib $(srcdir) $(FORM_PRIV_H)
+fld_info lib $(srcdir) $(FORM_PRIV_H)
+fld_just lib $(srcdir) $(FORM_PRIV_H)
+fld_link lib $(srcdir) $(FORM_PRIV_H)
+fld_max lib $(srcdir) $(FORM_PRIV_H)
+fld_move lib $(srcdir) $(FORM_PRIV_H)
+fld_newftyp lib $(srcdir) $(FORM_PRIV_H)
+fld_opts lib $(srcdir) $(FORM_PRIV_H)
+fld_pad lib $(srcdir) $(FORM_PRIV_H)
+fld_page lib $(srcdir) $(FORM_PRIV_H)
+fld_stat lib $(srcdir) $(FORM_PRIV_H)
+fld_type lib $(srcdir) $(FORM_PRIV_H)
+fld_user lib $(srcdir) $(FORM_PRIV_H)
+frm_cursor lib $(srcdir) $(FORM_PRIV_H)
+frm_data lib $(srcdir) $(FORM_PRIV_H)
+frm_def lib $(srcdir) $(FORM_PRIV_H)
+frm_driver lib $(srcdir) $(FORM_PRIV_H)
+frm_hook lib $(srcdir) $(FORM_PRIV_H)
+frm_opts lib $(srcdir) $(FORM_PRIV_H)
+frm_page lib $(srcdir) $(FORM_PRIV_H)
+frm_post lib $(srcdir) $(FORM_PRIV_H)
+frm_req_name lib $(srcdir) $(FORM_PRIV_H)
+frm_scale lib $(srcdir) $(FORM_PRIV_H)
+frm_sub lib $(srcdir) $(FORM_PRIV_H)
+frm_user lib $(srcdir) $(FORM_PRIV_H)
+frm_win lib $(srcdir) $(FORM_PRIV_H)
+fty_alnum lib $(srcdir) $(FORM_PRIV_H)
+fty_alpha lib $(srcdir) $(FORM_PRIV_H)
+fty_enum lib $(srcdir) $(FORM_PRIV_H)
+fty_int lib $(srcdir) $(FORM_PRIV_H)
+fty_ipv4 lib $(srcdir) $(FORM_PRIV_H)
+fty_num lib $(srcdir) $(FORM_PRIV_H)
+fty_regex lib $(srcdir) $(FORM_PRIV_H)
diff --git a/contrib/ncurses/include/Caps b/contrib/ncurses/include/Caps
new file mode 100644
index 000000000000..7c10212827cb
--- /dev/null
+++ b/contrib/ncurses/include/Caps
@@ -0,0 +1,1314 @@
+##############################################################################
+# Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995
+# and: Eric S. Raymond <esr@snark.thyrsus.com>
+#
+# $Id: Caps,v 1.24 1999/01/17 02:01:44 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: Lead with `Y' if capability should be emitted in termcap
+# translations, `-' otherwise
+# Column 6: capability description
+#
+# The codes following [Y-] in column 5 describe the versions of termcap which
+# use the given capability. This information is not used by the curses library
+# proper; rather, it's 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
+# a * or **.
+#
+# 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's up the ncurses
+# library what to do with the terminfo data after it's 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's 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 tparm with
+#%parms as given (#\fIi\fP).
+#%.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 (shift, sets parity 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 can't 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 won't work, xon/xoff required
+prtr_silent mc5i bool 5i ----- printer won't 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 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 can't 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
+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 YB-G- backspace key
+key_catab ktbc str ka -B-G-* clear-all-tabs key
+key_clear kclr str kC -B-G-* clear-screen or erase key
+key_ctab kctab str kt -B-G-* clear-tab key
+key_dc kdch1 str kD YB-G- delete-character key
+key_dl kdl1 str kL -B-G-* delete-line key
+key_down kcud1 str kd YBCGE down-arrow key
+key_eic krmir str kM -B-G-* sent by rmir or smir in insert mode
+key_eol kel str kE -B-G-* clear-to-end-of-line key
+key_eos ked str kS -B-G-* clear-to-end-of-screen key
+key_f0 kf0 str k0 YBCGE F0 function key
+key_f1 kf1 str k1 YBCGE F1 function key
+key_f10 kf10 str k; ----E F10 function key
+key_f2 kf2 str k2 YBCGE F2 function key
+key_f3 kf3 str k3 YBCGE F3 function key
+key_f4 kf4 str k4 YBCGE F4 function key
+key_f5 kf5 str k5 YBCGE F5 function key
+key_f6 kf6 str k6 YBCGE F6 function key
+key_f7 kf7 str k7 YBCGE F7 function key
+key_f8 kf8 str k8 YBCGE F8 function key
+key_f9 kf9 str k9 YBCGE F9 function key
+key_home khome str kh YBCGE home key
+key_ic kich1 str kI YB-GE insert-character key
+key_il kil1 str kA -B-G-* insert-line key
+key_left kcub1 str kl YBCGE left-arrow key
+key_ll kll str kH YB-G- lower-left key (home down)
+key_npage knp str kN YB-GE next-page key
+key_ppage kpp str kP YB-GE previous-page key
+key_right kcuf1 str kr YBCGE right-arrow key
+key_sf kind str kF -B-G-* scroll-forward key
+key_sr kri str kR -B-G-* scroll-backward key
+key_stab khts str kT -B-G-* set-tab key
+key_up kcuu1 str ku 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
+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 YB-GE upper left of keypad
+key_a3 ka3 str K3 YB-GE upper right of keypad
+key_b2 kb2 str K2 YB-GE center of keypad
+key_c1 kc1 str K4 YB-GE lower left of keypad
+key_c3 kc3 str K5 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 ----- 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 ----- begin key
+key_cancel kcan str @2 ----- cancel key
+key_close kclo str @3 ----- close key
+key_command kcmd str @4 ----- command key
+key_copy kcpy str @5 ----- copy key
+key_create kcrt str @6 ----- create key
+key_end kend str @7 ----- end key
+key_enter kent str @8 ----- enter/send key
+key_exit kext str @9 ----- exit key
+key_find kfnd str @0 ----- find key
+key_help khlp str %1 ----- help key
+key_mark kmrk str %2 ----- mark key
+key_message kmsg str %3 ----- message key
+key_move kmov str %4 ----- move key
+key_next knxt str %5 ----- next key
+key_open kopn str %6 ----- open key
+key_options kopt str %7 ----- options key
+key_previous kprv str %8 ----- previous key
+key_print kprt str %9 ----- print key
+key_redo krdo str %0 ----- redo key
+key_reference kref str &1 ----- reference key
+key_refresh krfr str &2 ----- refresh key
+key_replace krpl str &3 ----- replace key
+key_restart krst str &4 ----- restart key
+key_resume kres str &5 ----- resume key
+key_save ksav str &6 ----- save key
+key_suspend kspd str &7 ----- suspend key
+key_undo kund str &8 ----- undo key
+key_sbeg kBEG str &9 ----- shifted begin key
+key_scancel kCAN str &0 ----- shifted cancel key
+key_scommand kCMD str *1 ----- shifted command key
+key_scopy kCPY str *2 ----- shifted copy key
+key_screate kCRT str *3 ----- shifted create key
+key_sdc kDC str *4 ----- shifted delete-character key
+key_sdl kDL str *5 ----- shifted delete-line key
+key_select kslt str *6 ----- select key
+key_send kEND str *7 ----- shifted end key
+key_seol kEOL str *8 ----- shifted clear-to-end-of-line key
+key_sexit kEXT str *9 ----- shifted exit key
+key_sfind kFND str *0 ----- shifted find key
+key_shelp kHLP str #1 ----- shifted help key
+key_shome kHOM str #2 ----- shifted home key
+key_sic kIC str #3 ----- shifted insert-character key
+key_sleft kLFT str #4 ----- shifted left-arrow key
+key_smessage kMSG str %a ----- shifted message key
+key_smove kMOV str %b ----- shifted move key
+key_snext kNXT str %c ----- shifted next key
+key_soptions kOPT str %d ----- shifted options key
+key_sprevious kPRV str %e ----- shifted previous key
+key_sprint kPRT str %f ----- shifted print key
+key_sredo kRDO str %g ----- shifted redo key
+key_sreplace kRPL str %h ----- shifted replace key
+key_sright kRIT str %i ----- shifted right-arrow key
+key_srsume kRES str %j ----- shifted resume key
+key_ssave kSAV str !1 ----- shifted save key
+key_ssuspend kSPD str !2 ----- shifted suspend key
+key_sundo kUND str !3 ----- shifted undo key
+req_for_input rfi str RF ----- send next input char (for ptys)
+key_f11 kf11 str F1 ----E F11 function key
+key_f12 kf12 str F2 ----E F12 function key
+key_f13 kf13 str F3 ----E F13 function key
+key_f14 kf14 str F4 ----E F14 function key
+key_f15 kf15 str F5 ----E F15 function key
+key_f16 kf16 str F6 ----E F16 function key
+key_f17 kf17 str F7 ----E F17 function key
+key_f18 kf18 str F8 ----E F18 function key
+key_f19 kf19 str F9 ----E F19 function key
+key_f20 kf20 str FA ----E F20 function key
+key_f21 kf21 str FB ----E F21 function key
+key_f22 kf22 str FC ----E F22 function key
+key_f23 kf23 str FD ----E F23 function key
+key_f24 kf24 str FE ----E F24 function key
+key_f25 kf25 str FF ----E F25 function key
+key_f26 kf26 str FG ----E F26 function key
+key_f27 kf27 str FH ----E F27 function key
+key_f28 kf28 str FI ----E F28 function key
+key_f29 kf29 str FJ ----E F29 function key
+key_f30 kf30 str FK ----E F30 function key
+key_f31 kf31 str FL ----E F31 function key
+key_f32 kf32 str FM ----E F32 function key
+key_f33 kf33 str FN ----E F33 function key
+key_f34 kf34 str FO ----E F34 function key
+key_f35 kf35 str FP ----E F35 function key
+key_f36 kf36 str FQ ----E F36 function key
+key_f37 kf37 str FR ----E F37 function key
+key_f38 kf38 str FS ----E F38 function key
+key_f39 kf39 str FT ----E F39 function key
+key_f40 kf40 str FU ----E F40 function key
+key_f41 kf41 str FV ----E F41 function key
+key_f42 kf42 str FW ----E F42 function key
+key_f43 kf43 str FX ----E F43 function key
+key_f44 kf44 str FY ----E F44 function key
+key_f45 kf45 str FZ ----E F45 function key
+key_f46 kf46 str Fa ----E F46 function key
+key_f47 kf47 str Fb ----E F47 function key
+key_f48 kf48 str Fc ----E F48 function key
+key_f49 kf49 str Fd ----E F49 function key
+key_f50 kf50 str Fe ----E F50 function key
+key_f51 kf51 str Ff ----E F51 function key
+key_f52 kf52 str Fg ----E F52 function key
+key_f53 kf53 str Fh ----E F53 function key
+key_f54 kf54 str Fi ----E F54 function key
+key_f55 kf55 str Fj ----E F55 function key
+key_f56 kf56 str Fk ----E F56 function key
+key_f57 kf57 str Fl ----E F57 function key
+key_f58 kf58 str Fm ----E F58 function key
+key_f59 kf59 str Fn ----E F59 function key
+key_f60 kf60 str Fo ----E F60 function key
+key_f61 kf61 str Fp ----E F61 function key
+key_f62 kf62 str Fq ----E F62 function key
+key_f63 kf63 str Fr ----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
+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 at (#1,#2)
+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
+change_line_pitch lpi str ZB ----- Change number of lines per inch
+change_res_horz chr str ZC ----- Change horizontal resolution
+change_res_vert cvr str ZD ----- Change vertical resolution
+define_char defc str ZE ----- Define a character
+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 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
+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 #2 lines from bottom
+set_left_margin_parm smglp str Zm ----- Set left (right) margin at column #1 (#2)
+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 (#2)
+start_bit_image sbim str Zq ----- Start printing bit image graphics
+start_char_set_def scsd str Zr ----- Start character set definition
+stop_bit_image rbim str Zs ----- Stop printing bit image graphics
+stop_char_set_def rcsd str Zt ----- End definition of character set
+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 ----- List of character set names
+key_mouse kmous str Km ----- 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
+set_a_foreground setaf str AF ----- Set foreground color using ANSI escape
+set_a_background setab str AB ----- Set background color 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 code set 0 (EUC set 0, ASCII)
+set1_des_seq s1ds str s1 ----- Shift to code set 1
+set2_des_seq s2ds str s2 ----- Shift to code set 2
+set3_des_seq s3ds str s3 ----- Shift to code set 3
+set_lr_margin smglr str ML ----- Set both left and right margins to #1, #2
+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 rectangualar 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
+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. They are some post-4.1
+#%versions of System V curses, e.g., Solaris 2.5 and IRIX 6.x.
+#%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 sL ----- YI Set page length to #1 hundredth of an inch
+#%.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 seems to have been designed to map between the rogue(2)
+# motion keys (including jkhl) and characters emitted by arrow keys on some
+# primitive pre-ANSI terminals. It's so obsolete it's fossilized...
+#
+# 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 arrow keys rogue(1) motion keys
+# 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's 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
+#
+# This section is almost all comments. What it's mainly for is to describe
+# 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 memory lock above
+memory_unlock memu str mu ----K memory unlock
+#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
+#key_f11 kf11 str k< ----- function key 11
+#key_f12 kf12 str k> ----- function key 12
+# The key_f13 through key_f64 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 certainly wrong.
+#key_f13 kf13 str k+ ----- function key 13
+#key_f14 kf14 str k+ ----- function key 14
+#key_f15 kf15 str k+ ----- function key 15
+#key_f16 kf16 str k+ ----- function key 16
+#key_f17 kf17 str k+ ----- function key 17
+#key_f18 kf18 str k+ ----- function key 18
+#key_f19 kf19 str k+ ----- function key 19
+#key_f20 kf20 str k+ ----- function key 20
+#key_f21 kf21 str k+ ----- function key 21
+#key_f22 kf22 str k+ ----- function key 22
+#key_f23 kf23 str k+ ----- function key 23
+#key_f24 kf24 str k+ ----- function key 24
+#key_f25 kf25 str k+ ----- function key 25
+#key_f26 kf26 str k+ ----- function key 26
+#key_f27 kf26 str k+ ----- function key 26
+#key_f28 kf28 str k+ ----- function key 28
+#key_f29 kf29 str k+ ----- function key 29
+#key_f30 kf30 str k+ ----- function key 30
+#key_f31 kf31 str k+ ----- function key 31
+#key_f32 kf31 str k+ ----- function key 32
+#key_f33 kf33 str k+ ----- function key 33
+#key_f34 kf34 str k+ ----- function key 34
+#key_f35 kf35 str k+ ----- function key 35
+#key_f36 kf36 str k+ ----- function key 36
+#key_f37 kf37 str k+ ----- function key 37
+#key_f38 kf38 str k+ ----- function key 38
+#key_f39 kf39 str k+ ----- function key 39
+#key_f40 kf40 str k+ ----- function key 40
+#key_f41 kf41 str k+ ----- function key 41
+#key_f42 kf42 str k+ ----- function key 42
+#key_f43 kf43 str k+ ----- function key 43
+#key_f44 kf44 str k+ ----- function key 44
+#key_f45 kf45 str k+ ----- function key 45
+#key_f46 kf46 str k+ ----- function key 46
+#key_f47 kf47 str k+ ----- function key 47
+#key_f48 kf48 str k+ ----- function key 48
+#key_f49 kf49 str k+ ----- function key 49
+#key_f50 kf50 str k+ ----- function key 50
+#key_f51 kf51 str k+ ----- function key 51
+#key_f52 kf52 str k+ ----- function key 52
+#key_f53 kf53 str k+ ----- function key 53
+#key_f54 kf54 str k+ ----- function key 54
+#key_f55 kf55 str k+ ----- function key 55
+#key_f56 kf56 str k+ ----- function key 56
+#key_f57 kf57 str k+ ----- function key 57
+#key_f58 kf58 str k+ ----- function key 58
+#key_f59 kf59 str k+ ----- function key 59
+#key_f60 kf60 str k+ ----- function key 60
+#key_f61 kf61 str k+ ----- function key 61
+#key_f62 kf62 str k+ ----- function key 62
+#key_f63 kf63 str k+ ----- function key 63
+# 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.
+#
+#############################################################################
+#
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# case-fold-search:nil
+# truncate-lines:t
+# End:
diff --git a/contrib/ncurses/include/MKhashsize.sh b/contrib/ncurses/include/MKhashsize.sh
new file mode 100755
index 000000000000..d11d7bf23c8a
--- /dev/null
+++ b/contrib/ncurses/include/MKhashsize.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# MKhashsize.sh --- generate size include for hash functions
+#
+echo "/*"
+echo " * hashsize.h -- hash and token table constants"
+echo " */"
+
+CAPS="${1-Caps}"
+TABSIZE=`grep -v '^[ #]' $CAPS | grep -v "^$" | grep -v "^capalias"| grep -v "^infoalias" | wc -l`
+
+echo ""
+echo "#define CAPTABSIZE ${TABSIZE}"
+echo "#define HASHTABSIZE (${TABSIZE} * 2)"
diff --git a/contrib/ncurses/include/MKparametrized.sh b/contrib/ncurses/include/MKparametrized.sh
new file mode 100755
index 000000000000..cbbc3e0d62eb
--- /dev/null
+++ b/contrib/ncurses/include/MKparametrized.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# 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.
+#
+CAPS="${1-Caps}"
+cat <<EOF
+/*
+ * parametrized.h --- is a termcap capability parametrized?
+ *
+ * Note: this file is generated using parametrized.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....
+
+${AWK-awk} <$CAPS '
+$3 != "str" {next;}
+$1 ~ /^acs_/ {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);}
+'
+
diff --git a/contrib/ncurses/include/MKterm.h.awk.in b/contrib/ncurses/include/MKterm.h.awk.in
new file mode 100644
index 000000000000..8e913a77f0fa
--- /dev/null
+++ b/contrib/ncurses/include/MKterm.h.awk.in
@@ -0,0 +1,310 @@
+
+BEGIN {
+ print "/****************************************************************************"
+ print " * Copyright (c) 1998 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 "/****************************************************************************/"
+ print ""
+ print "/* $Id: MKterm.h.awk.in,v 1.35 1999/02/24 01:04:55 tom Exp $ */"
+ print ""
+ print "/*"
+ print "** term.h -- Definition of struct term"
+ print "*/"
+ print ""
+ print "#ifndef _NCU_TERM_H"
+ print "#define _NCU_TERM_H 1"
+ print ""
+ print "#undef NCURSES_VERSION"
+ print "#define NCURSES_VERSION \"@NCURSES_MAJOR@.@NCURSES_MINOR@\""
+ print ""
+ print "#ifdef __cplusplus"
+ print "extern \"C\" {"
+ print "#endif"
+ print ""
+ print "/* Make this file self-contained by providing defaults for the HAVE_TERMIO[S]_H"
+ print " * and BROKEN_LINKER definition (based on the system for which this was"
+ print " * configured)."
+ print " */"
+ print ""
+ print "#undef HAVE_TERMIOS_H"
+ print "#define HAVE_TERMIOS_H 1/*default*/"
+ print ""
+ print "#undef HAVE_TERMIO_H"
+ print "#define HAVE_TERMIO_H 0/*default*/"
+ print ""
+ print "#undef HAVE_TCGETATTR"
+ print "#define HAVE_TCGETATTR 1/*default*/"
+ print ""
+ print "#undef BROKEN_LINKER"
+ print "#define BROKEN_LINKER 0/*default*/"
+ print ""
+ print "#undef NCURSES_CONST"
+ print "#define NCURSES_CONST @NCURSES_CONST@"
+ 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 ""
+ 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 ""
+ print "#undef TERMIOS"
+ print "#define TERMIOS 1"
+ print ""
+ print "#include <termio.h>"
+ print "#define TTY struct termio"
+ print ""
+ print "/* Add definitions to make termio look like termios."
+ print " * But ifdef it, since there are some implementations"
+ print " * that try to do this for us in a fake <termio.h>."
+ print " */"
+ print "#ifndef TCSANOW"
+ print "#define TCSANOW TCSETA"
+ print "#endif"
+ print "#ifndef TCSADRAIN"
+ print "#define TCSADRAIN TCSETAW"
+ print "#endif"
+ print "#ifndef TCSAFLUSH"
+ print "#define TCSAFLUSH TCSETAF"
+ print "#endif"
+ print "#ifndef tcsetattr"
+ print "#define tcsetattr(fd, cmd, arg) ioctl(fd, cmd, arg)"
+ print "#endif"
+ print "#ifndef tcgetattr"
+ print "#define tcgetattr(fd, arg) ioctl(fd, TCGETA, arg)"
+ print "#endif"
+ print "#ifndef cfgetospeed"
+ print "#define cfgetospeed(t) ((t)->c_cflag & CBAUD)"
+ print "#endif"
+ print "#ifndef TCIFLUSH "
+ print "#define TCIFLUSH 0"
+ print "#endif"
+ print "#ifndef TCOFLUSH "
+ print "#define TCOFLUSH 1"
+ print "#endif"
+ print "#ifndef TCIOFLUSH "
+ print "#define TCIOFLUSH 2"
+ print "#endif"
+ print "#ifndef tcflush"
+ print "#define tcflush(fd, arg) ioctl(fd, TCFLSH, arg)"
+ print "#endif"
+ print ""
+ print "#else /* !HAVE_TERMIO_H */"
+ print ""
+ print "#undef TERMIOS"
+ print "#include <sgtty.h>"
+ print "#include <sys/ioctl.h>"
+ print "#define TTY struct sgttyb"
+ print ""
+ 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 "#else"
+ print "#define GET_TTY(fd, buf) gtty(fd, buf)"
+ print "#define SET_TTY(fd, buf) stty(fd, buf)"
+ print "#endif"
+ print ""
+ print "#define NAMESIZE 256"
+ print ""
+ print "#define CUR cur_term->type."
+ 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 "#define micro_char_size micro_col_size"
+ print ""
+ print "#ifdef __INTERNAL_CAPS_VISIBLE"
+ }
+
+/^#/ {next;}
+
+$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 "typedef struct termtype { /* in-core form of terminfo data */"
+ print " char *term_names; /* str_table offset of term names */"
+ print " char *str_table; /* pointer to string table */"
+ print " char *Booleans; /* array of boolean values */"
+ print " short *Numbers; /* array of integer values */"
+ 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 ""
+ print "} TERMTYPE;"
+ print ""
+ print "typedef struct term { /* describe an actual terminal */"
+ print " TERMTYPE type; /* terminal type description */"
+ print " short Filedes; /* file description being written to */"
+ print " TTY Ottyb, /* original state of the terminal */"
+ print " Nttyb; /* current state of the terminal */"
+ print " int _baudrate; /* used to compute padding */"
+ print "} TERMINAL;"
+ print ""
+ print "extern TERMINAL *cur_term;"
+ print ""
+ print "#if BROKEN_LINKER"
+ print "#define boolnames _nc_boolnames()"
+ print "#define boolcodes _nc_boolcodes()"
+ print "#define boolfnames _nc_boolfnames()"
+ print "#define numnames _nc_numnames()"
+ print "#define numcodes _nc_numcodes()"
+ print "#define numfnames _nc_numfnames()"
+ print "#define strnames _nc_strnames()"
+ print "#define strcodes _nc_strcodes()"
+ print "#define strfnames _nc_strfnames()"
+ print ""
+ print "extern NCURSES_CONST char * const *_nc_boolnames(void);"
+ print "extern NCURSES_CONST char * const *_nc_boolcodes(void);"
+ print "extern NCURSES_CONST char * const *_nc_boolfnames(void);"
+ print "extern NCURSES_CONST char * const *_nc_numnames(void);"
+ print "extern NCURSES_CONST char * const *_nc_numcodes(void);"
+ print "extern NCURSES_CONST char * const *_nc_numfnames(void);"
+ print "extern NCURSES_CONST char * const *_nc_strnames(void);"
+ print "extern NCURSES_CONST char * const *_nc_strcodes(void);"
+ print "extern NCURSES_CONST char * const *_nc_strfnames(void);"
+ print ""
+ print "#else"
+ print ""
+ print "extern NCURSES_CONST char *const boolnames[];"
+ print "extern NCURSES_CONST char *const boolcodes[];"
+ print "extern NCURSES_CONST char *const boolfnames[];"
+ print "extern NCURSES_CONST char *const numnames[];"
+ print "extern NCURSES_CONST char *const numcodes[];"
+ print "extern NCURSES_CONST char *const numfnames[];"
+ print "extern NCURSES_CONST char *const strnames[];"
+ print "extern NCURSES_CONST char *const strcodes[];"
+ print "extern NCURSES_CONST char *const strfnames[];"
+ print ""
+ print "#endif"
+ print ""
+ print "/* internals */"
+ print "extern int _nc_set_tty_mode(TTY *buf);"
+ print "extern int _nc_get_tty_mode(TTY *buf);"
+ print "extern int _nc_read_entry(const char * const, char * const, TERMTYPE *const);"
+ print "extern int _nc_read_file_entry(const char *const, TERMTYPE *);"
+ print "extern char *_nc_first_name(const char *const);"
+ print "extern int _nc_name_match(const char *const, const char *const, const char *const);"
+ print "extern int _nc_read_termcap_entry(const char *const, TERMTYPE *const);"
+ print "extern const TERMTYPE *_nc_fallback(const char *);"
+ print ""
+ print "/* entry points */"
+ print "extern TERMINAL *set_curterm(TERMINAL *);"
+ print "extern int del_curterm(TERMINAL *);"
+ print ""
+ print "/* miscellaneous entry points */"
+ print "extern int restartterm(NCURSES_CONST char *, int, int *);"
+ print "extern int setupterm(NCURSES_CONST char *,int,int *);"
+ print ""
+ print "/* terminfo entry points, also declared in curses.h */"
+ print "#if !defined(__NCURSES_H)"
+ print "extern char *tigetstr(NCURSES_CONST char *);"
+ print "extern char *tparm(NCURSES_CONST char *, ...);"
+ print "extern char ttytype[];"
+ print "extern int putp(const char *);"
+ print "extern int tigetflag(NCURSES_CONST char *);"
+ print "extern int tigetnum(NCURSES_CONST char *);"
+ print "#endif /* __NCURSES_H */"
+ print ""
+ print "/* termcap database emulation (XPG4 uses const only for 2nd param of tgetent) */"
+ print "#if !defined(_NCU_TERMCAP_H)"
+ print "extern char *tgetstr(NCURSES_CONST char *, char **);"
+ print "extern char *tgoto(const char *, int, int);"
+ print "extern int tgetent(char *, const char *);"
+ print "extern int tgetflag(NCURSES_CONST char *);"
+ print "extern int tgetnum(NCURSES_CONST char *);"
+ print "extern int tputs(const char *, int, int (*)(int));"
+ print "#endif /* _NCU_TERMCAP_H */"
+ print ""
+ print "#ifdef __cplusplus"
+ print "}"
+ print "#endif"
+ print ""
+ print "#endif /* _NCU_TERM_H */"
+ }
diff --git a/contrib/ncurses/include/Makefile.in b/contrib/ncurses/include/Makefile.in
new file mode 100644
index 000000000000..724be6d5a744
--- /dev/null
+++ b/contrib/ncurses/include/Makefile.in
@@ -0,0 +1,106 @@
+# $Id: Makefile.in,v 1.22 1998/02/11 12:13:46 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+includedir = @includedir@
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+AWK = @AWK@
+LN_S = @LN_S@
+
+VERSION = @cf_cv_rel_version@
+
+# These files are generated by the configure script
+CONFIG_SRC = \
+ MKterm.h.awk \
+ curses.h \
+ termcap.h \
+ unctrl.h
+
+# These files are generated by this makefile
+AUTO_SRC = \
+ hashsize.h \
+ parametrized.h \
+ term.h
+
+################################################################################
+all \
+sources \
+install :: $(AUTO_SRC)
+
+term.h: $(srcdir)/Caps MKterm.h.awk
+ $(AWK) -f MKterm.h.awk $(srcdir)/Caps > $@
+ sh $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@
+
+hashsize.h: $(srcdir)/Caps $(srcdir)/MKhashsize.sh
+ sh $(srcdir)/MKhashsize.sh $(srcdir)/Caps >$@
+
+parametrized.h: $(srcdir)/Caps $(srcdir)/MKparametrized.sh
+ AWK=$(AWK) sh $(srcdir)/MKparametrized.sh $(srcdir)/Caps >$@
+
+tags:
+ ctags *.[ch]
+
+TAGS:
+ etags *.[ch]
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+
+clean :: mostlyclean
+ -rm -f $(AUTO_SRC)
+
+distclean :: clean
+ -rm -f Makefile $(CONFIG_SRC)
+
+realclean :: distclean
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/contrib/ncurses/include/capdefaults.c b/contrib/ncurses/include/capdefaults.c
new file mode 100644
index 000000000000..af1193cc4981
--- /dev/null
+++ b/contrib/ncurses/include/capdefaults.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* $Id: capdefaults.c,v 1.8 1998/07/04 22:31:04 tom Exp $ */
+
+ /*
+ * Compute obsolete capabilities. The reason this is an include file
+ * is that the two places where it's needed want 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_entry().
+ */
+ {
+ char *sp;
+ int capval;
+
+#define EXTRACT_DELAY(str) (sp = strchr(str, '*'), sp ? atoi(sp+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 = (char *)0;
+ }
+ if (VALID_STRING(reset_1string)
+ && !VALID_STRING(reset_2string)
+ && VALID_STRING(reset_3string))
+ {
+ termcap_reset = reset_2string;
+ reset_2string = (char *)0;
+ }
+#if USE_XMC_SUPPORT
+ if (magic_cookie_glitch_ul < 0 && magic_cookie_glitch && VALID_STRING(enter_underline_mode))
+ magic_cookie_glitch_ul = magic_cookie_glitch;
+#else
+ magic_cookie_glitch_ul = -1;
+#endif
+
+ /* totally obsolete capabilities */
+ linefeed_is_newline = 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/contrib/ncurses/include/curses.h.in b/contrib/ncurses/include/curses.h.in
new file mode 100644
index 000000000000..1ed87e596027
--- /dev/null
+++ b/contrib/ncurses/include/curses.h.in
@@ -0,0 +1,1346 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* $Id: curses.h.in,v 1.84 1999/07/24 20:15:42 tom Exp $ */
+
+#ifndef __NCURSES_H
+#define __NCURSES_H
+
+#define CURSES 1
+#define CURSES_H 1
+
+/* This should be defined for the enhanced functionality to be visible.
+ * However, none of the wide-character (enhanced) functionality is implemented.
+ * So we do not define it (yet).
+#define _XOPEN_CURSES 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@"
+
+#ifdef NCURSES_NOMACROS
+#define NCURSES_ATTR_T attr_t
+#endif
+
+#ifndef NCURSES_ATTR_T
+#define NCURSES_ATTR_T int
+#endif
+
+#undef NCURSES_CONST
+#define NCURSES_CONST @NCURSES_CONST@
+
+typedef unsigned @cf_cv_typeof_chtype@ chtype;
+
+#include <stdio.h>
+#include <unctrl.h>
+#include <stdarg.h> /* we need va_list */
+#ifdef _XOPEN_SOURCE_EXTENDED
+#include <stddef.h> /* we want wchar_t */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+
+/* XSI 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.
+ */
+
+#undef TRUE
+#define TRUE 1
+
+#undef FALSE
+#define FALSE 0
+
+#if (!defined(__cplusplus) || !@cf_cv_builtin_bool@) && (!@cf_cv_cc_bool_type@)
+#undef bool
+typedef @cf_cv_type_of_bool@ bool;
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * XSI 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
+
+/* colors */
+extern int COLORS;
+extern int COLOR_PAIRS;
+
+#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 */
+
+extern chtype acs_map[];
+
+/* VT100 symbols begin here */
+#define ACS_ULCORNER (acs_map['l']) /* upper left corner */
+#define ACS_LLCORNER (acs_map['m']) /* lower left corner */
+#define ACS_URCORNER (acs_map['k']) /* upper right corner */
+#define ACS_LRCORNER (acs_map['j']) /* lower right corner */
+#define ACS_LTEE (acs_map['t']) /* tee pointing right */
+#define ACS_RTEE (acs_map['u']) /* tee pointing left */
+#define ACS_BTEE (acs_map['v']) /* tee pointing up */
+#define ACS_TTEE (acs_map['w']) /* tee pointing down */
+#define ACS_HLINE (acs_map['q']) /* horizontal line */
+#define ACS_VLINE (acs_map['x']) /* vertical line */
+#define ACS_PLUS (acs_map['n']) /* large plus or crossover */
+#define ACS_S1 (acs_map['o']) /* scan line 1 */
+#define ACS_S9 (acs_map['s']) /* scan line 9 */
+#define ACS_DIAMOND (acs_map['`']) /* diamond */
+#define ACS_CKBOARD (acs_map['a']) /* checker board (stipple) */
+#define ACS_DEGREE (acs_map['f']) /* degree symbol */
+#define ACS_PLMINUS (acs_map['g']) /* plus/minus */
+#define ACS_BULLET (acs_map['~']) /* bullet */
+/* Teletype 5410v1 symbols begin here */
+#define ACS_LARROW (acs_map[',']) /* arrow pointing left */
+#define ACS_RARROW (acs_map['+']) /* arrow pointing right */
+#define ACS_DARROW (acs_map['.']) /* arrow pointing down */
+#define ACS_UARROW (acs_map['-']) /* arrow pointing up */
+#define ACS_BOARD (acs_map['h']) /* board of squares */
+#define ACS_LANTERN (acs_map['i']) /* lantern symbol */
+#define ACS_BLOCK (acs_map['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 (acs_map['p']) /* scan line 3 */
+#define ACS_S7 (acs_map['r']) /* scan line 7 */
+#define ACS_LEQUAL (acs_map['y']) /* less/equal */
+#define ACS_GEQUAL (acs_map['z']) /* greater/equal */
+#define ACS_PI (acs_map['{']) /* Pi */
+#define ACS_NEQUAL (acs_map['|']) /* not equal */
+#define ACS_STERLING (acs_map['}']) /* 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
+
+#if !defined(ERR) || ((ERR) != -1)
+#define ERR (-1)
+#endif
+
+#if !defined(OK) || ((OK) != 0)
+#define OK (0)
+#endif
+
+/* 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
+
+typedef struct screen SCREEN;
+typedef struct _win_st WINDOW;
+
+typedef chtype attr_t; /* ...must be at least as wide as chtype */
+
+#ifdef _XOPEN_SOURCE_EXTENDED
+#ifndef _WCHAR_T
+typedef unsigned long wchar_t;
+#endif /* _WCHAR_T */
+#ifndef _WINT_T
+typedef long int wint_t;
+#endif /* _WINT_T */
+
+#define CCHARW_MAX 5
+typedef struct
+{
+ attr_t attr;
+ wchar_t chars[CCHARW_MAX];
+}
+cchar_t;
+#endif /* _XOPEN_SOURCE_EXTENDED */
+
+struct ldat
+{
+ chtype *text; /* text of the line */
+ short firstchar; /* first changed character in the line */
+ short lastchar; /* last changed character in the line */
+ short oldindex; /* index of the line at last update */
+};
+
+struct _win_st
+{
+ short _cury, _curx; /* current cursor position */
+
+ /* window location and size */
+ short _maxy, _maxx; /* maximums of x and y, NOT window size */
+ short _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 */
+ short _regtop; /* top line of scrolling region */
+ short _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
+ {
+ short _pad_y, _pad_x;
+ short _pad_top, _pad_left;
+ short _pad_bottom, _pad_right;
+ } _pad;
+
+ short _yoffset; /* real begy is _begy + _yoffset */
+};
+
+extern WINDOW *stdscr;
+extern WINDOW *curscr;
+extern WINDOW *newscr;
+
+extern int LINES;
+extern int COLS;
+extern int TABSIZE;
+
+/*
+ * This global was an undocumented feature under AIX curses.
+ */
+extern int ESCDELAY; /* ESC expire time in milliseconds */
+
+extern char *keybound (int, int);
+extern int define_key (char *, int);
+extern int keyok (int, bool);
+extern int resizeterm (int, int);
+extern int use_default_colors (void);
+extern int use_extended_names (bool);
+extern int wresize (WINDOW *, int, int);
+
+extern char ttytype[]; /* needed for backward compatibility */
+
+/*
+ * 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.
+ * G++ doesn't accept it anyway.
+ */
+#if !defined(__GNUC__) && !defined(__attribute__)
+#define __attribute__(p) /* nothing */
+#endif
+
+/*
+ * For g++, turn off our macros that use __attribute__ (g++ recognizes some
+ * of them, but not at the same version levels as gcc).
+ */
+#ifdef __cplusplus
+#undef GCC_NORETURN
+#undef GCC_PRINTF
+#undef GCC_SCANF
+#undef GCC_UNUSED
+#endif
+
+/*
+ * We cannot define these in ncurses_cfg.h, since they require parameters to be
+ * passed (that's non-portable).
+ */
+#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
+
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+
+/*
+ * Function prototypes. This is the complete XSI 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 int addch(const chtype); /* generated */
+extern int addchnstr(const chtype *, int); /* generated */
+extern int addchstr(const chtype *); /* generated */
+extern int addnstr(const char *, int); /* generated */
+extern int addstr(const char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int addnwstr(const wchar_t *, int); /* missing */
+extern int addwstr(const wchar_t *); /* missing */
+extern int add_wch(const cchar_t *); /* missing */
+extern int add_wchnstr(const cchar_t *, int); /* missing */
+extern int add_wchstr(const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int attroff(NCURSES_ATTR_T); /* generated */
+extern int attron(NCURSES_ATTR_T); /* generated */
+extern int attrset(NCURSES_ATTR_T); /* generated */
+extern int attr_get(attr_t *, short *, void *); /* generated */
+extern int attr_off(attr_t, void *); /* generated */
+extern int attr_on(attr_t, void *); /* generated */
+extern int attr_set(attr_t, short, void *); /* generated */
+extern int baudrate(void); /* implemented */
+extern int beep(void); /* implemented */
+extern int bkgd(chtype); /* generated */
+extern void bkgdset(chtype); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern void bkgrndset(const cchar_t *); /* missing */
+extern int bkgrnd(const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int border(chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern 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*); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int box(WINDOW *, chtype, chtype); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int box_set(WINDOW *, const cchar_t *, const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern bool can_change_color(void); /* implemented */
+extern int cbreak(void); /* implemented */
+extern int chgat(int, attr_t, short, const void *); /* generated */
+extern int clear(void); /* generated */
+extern int clearok(WINDOW *,bool); /* implemented */
+extern int clrtobot(void); /* generated */
+extern int clrtoeol(void); /* generated */
+extern int color_content(short,short*,short*,short*); /* implemented */
+extern int color_set(short,void*); /* generated */
+extern int COLOR_PAIR(int); /* generated */
+extern int copywin(const WINDOW*,WINDOW*,int,int,int,int,int,int,int); /* implemented */
+extern int curs_set(int); /* implemented */
+extern int def_prog_mode(void); /* implemented */
+extern int def_shell_mode(void); /* implemented */
+extern int delay_output(int); /* implemented */
+extern int delch(void); /* generated */
+extern void delscreen(SCREEN *); /* implemented */
+extern int delwin(WINDOW *); /* implemented */
+extern int deleteln(void); /* generated */
+extern WINDOW *derwin(WINDOW *,int,int,int,int); /* implemented */
+extern int doupdate(void); /* implemented */
+extern WINDOW *dupwin(WINDOW *); /* implemented */
+extern int echo(void); /* implemented */
+extern int echochar(const chtype); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int echo_wchar(const cchar_t *); /* missing */
+extern int erasewchar(wchar_t*); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int endwin(void); /* implemented */
+extern char erasechar(void); /* implemented */
+extern void filter(void); /* implemented */
+extern int flash(void); /* implemented */
+extern int flushinp(void); /* implemented */
+extern chtype getbkgd(WINDOW *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int getbkgrnd(cchar_t *); /* missing */
+extern int getcchar(const cchar_t *, wchar_t*, attr_t*, short*, void*); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int getch(void); /* generated */
+extern int getnstr(char *, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int getn_wstr(wint_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int getstr(char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int get_wch(wint_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern WINDOW *getwin(FILE *); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int get_wstr(wint_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int halfdelay(int); /* implemented */
+extern bool has_colors(void); /* implemented */
+extern bool has_ic(void); /* implemented */
+extern bool has_il(void); /* implemented */
+extern int hline(chtype, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int hline_set(const cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern void idcok(WINDOW *, bool); /* implemented */
+extern int idlok(WINDOW *, bool); /* implemented */
+extern void immedok(WINDOW *, bool); /* implemented */
+extern chtype inch(void); /* generated */
+extern int inchnstr(chtype *, int); /* generated */
+extern int inchstr(chtype *); /* generated */
+extern WINDOW *initscr(void); /* implemented */
+extern int init_color(short,short,short,short); /* implemented */
+extern int init_pair(short,short,short); /* implemented */
+extern int innstr(char *, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int innwstr(wchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int insch(chtype); /* generated */
+extern int insdelln(int); /* generated */
+extern int insertln(void); /* generated */
+extern int insnstr(const char *, int); /* generated */
+extern int insstr(const char *); /* generated */
+extern int instr(char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int ins_nwstr(const wchar_t *, int); /* missing */
+extern int ins_wch(const cchar_t *); /* missing */
+extern int ins_wstr(const wchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int intrflush(WINDOW *,bool); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int inwstr(wchar_t *); /* missing */
+extern int in_wch(NCURSES_CONST cchar_t *); /* missing */
+extern int in_wchstr(NCURSES_CONST cchar_t *); /* missing */
+extern int in_wchnstr(NCURSES_CONST cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern bool isendwin(void); /* implemented */
+extern bool is_linetouched(WINDOW *,int); /* implemented */
+extern bool is_wintouched(WINDOW *); /* implemented */
+extern NCURSES_CONST char *keyname(int); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern char *key_name(wchar_t); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int keypad(WINDOW *,bool); /* implemented */
+extern char killchar(void); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int killwchar(wchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int leaveok(WINDOW *,bool); /* implemented */
+extern char *longname(void); /* implemented */
+extern int meta(WINDOW *,bool); /* implemented */
+extern int move(int, int); /* generated */
+extern int mvaddch(int, int, const chtype); /* generated */
+extern int mvaddchnstr(int, int, const chtype *, int); /* generated */
+extern int mvaddchstr(int, int, const chtype *); /* generated */
+extern int mvaddnstr(int, int, const char *, int); /* generated */
+extern int mvaddstr(int, int, const char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvaddnwstr(int, int, const wchar_t *, int); /* missing */
+extern int mvaddwstr(int, int, const wchar_t *); /* missing */
+extern int mvadd_wch(int, int, const cchar_t *); /* missing */
+extern int mvadd_wchnstr(int, int, const cchar_t *, int);/* missing */
+extern int mvadd_wchstr(int, int, const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvchgat(int, int, int, attr_t, short, const void *); /* generated */
+extern int mvcur(int,int,int,int); /* implemented */
+extern int mvdelch(int, int); /* generated */
+extern int mvderwin(WINDOW *, int, int); /* implemented */
+extern int mvgetch(int, int); /* generated */
+extern int mvgetnstr(int, int, char *, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvgetn_wstr(int, int, wint_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvgetstr(int, int, char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvget_wch(int, int, wint_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvget_wstr(int, int, wint_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvhline(int, int, chtype, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvhline_set(int, int, const cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern chtype mvinch(int, int); /* generated */
+extern int mvinchnstr(int, int, chtype *, int); /* generated */
+extern int mvinchstr(int, int, chtype *); /* generated */
+extern int mvinnstr(int, int, char *, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvinnwstr(int, int, wchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvinsch(int, int, chtype); /* generated */
+extern int mvinsnstr(int, int, const char *, int); /* generated */
+extern int mvinsstr(int, int, const char *); /* generated */
+extern int mvinstr(int, int, char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvins_nwstr(int, int, const wchar_t *, int); /* missing */
+extern int mvins_wch(int, int, const cchar_t *); /* missing */
+extern int mvins_wstr(int, int, const wchar_t *); /* missing */
+extern int mvinwstr(int, int, wchar_t *); /* missing */
+extern int mvin_wch(int, int, NCURSES_CONST cchar_t *); /* missing */
+extern int mvin_wchstr(int, int, NCURSES_CONST cchar_t *); /* missing */
+extern int mvin_wchnstr(int, int, NCURSES_CONST cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvprintw(int,int, NCURSES_CONST char *,...) /* implemented */
+ GCC_PRINTFLIKE(3,4);
+extern int mvscanw(int,int, NCURSES_CONST char *,...) /* implemented */
+ GCC_SCANFLIKE(3,4);
+extern int mvvline(int, int, chtype, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvvline_set(int, int, const cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvwaddch(WINDOW *, int, int, const chtype); /* generated */
+extern int mvwaddchnstr(WINDOW *, int, int, const chtype *, int);/* generated */
+extern int mvwaddchstr(WINDOW *, int, int, const chtype *); /* generated */
+extern int mvwaddnstr(WINDOW *, int, int, const char *, int); /* generated */
+extern int mvwaddstr(WINDOW *, int, int, const char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwaddnwstr(WINDOW *, int, int, const wchar_t *, int);/* missing */
+extern int mvwaddwstr(WINDOW *, int, int, const wchar_t *); /* missing */
+extern int mvwadd_wch(WINDOW *, int, int, const cchar_t *); /* missing */
+extern int mvwadd_wchnstr(WINDOW *, int, int, const cchar_t *, int); /* missing */
+extern int mvwadd_wchstr(WINDOW *, int, int, const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *);/* generated */
+extern int mvwdelch(WINDOW *, int, int); /* generated */
+extern int mvwgetch(WINDOW *, int, int); /* generated */
+extern int mvwgetnstr(WINDOW *, int, int, char *, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwgetn_wstr(WINDOW *, int, int, wint_t *, int);/* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvwgetstr(WINDOW *, int, int, char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwget_wch(WINDOW *, int, int, wint_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwget_wstr(WINDOW *, int, int, wint_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvwhline(WINDOW *, int, int, chtype, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwhline_set(WINDOW *, int, int, const cchar_t *, int);/* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvwin(WINDOW *,int,int); /* implemented */
+extern chtype mvwinch(WINDOW *, int, int); /* generated */
+extern int mvwinchnstr(WINDOW *, int, int, chtype *, int); /* generated */
+extern int mvwinchstr(WINDOW *, int, int, chtype *); /* generated */
+extern int mvwinnstr(WINDOW *, int, int, char *, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwinnwstr(WINDOW *, int, int, wchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvwinsch(WINDOW *, int, int, chtype); /* generated */
+extern int mvwinsnstr(WINDOW *, int, int, const char *, int); /* generated */
+extern int mvwinsstr(WINDOW *, int, int, const char *); /* generated */
+extern int mvwinstr(WINDOW *, int, int, char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwins_nwstr(WINDOW *, int,int, const wchar_t *,int); /* missing */
+extern int mvwins_wch(WINDOW *, int, int, const cchar_t *); /* missing */
+extern int mvwins_wstr(WINDOW *, int, int, const wchar_t *); /* missing */
+extern int mvwinwstr(WINDOW *, int, int, wchar_t *); /* missing */
+extern int mvwin_wch(WINDOW *, int, int, NCURSES_CONST cchar_t *); /* missing */
+extern int mvwin_wchnstr(WINDOW *, int,int, NCURSES_CONST cchar_t *,int); /* missing */
+extern int mvwin_wchstr(WINDOW *, int, int, NCURSES_CONST cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int mvwprintw(WINDOW*,int,int, NCURSES_CONST char *,...) /* implemented */
+ GCC_PRINTFLIKE(4,5);
+extern int mvwscanw(WINDOW *,int,int, NCURSES_CONST char *,...) /* implemented */
+ GCC_SCANFLIKE(4,5);
+extern int mvwvline(WINDOW *,int, int, chtype, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int mvwvline_set(WINDOW *, int,int, const cchar_t *,int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int napms(int); /* implemented */
+extern WINDOW *newpad(int,int); /* implemented */
+extern SCREEN *newterm(NCURSES_CONST char *,FILE *,FILE *); /* implemented */
+extern WINDOW *newwin(int,int,int,int); /* implemented */
+extern int nl(void); /* implemented */
+extern int nocbreak(void); /* implemented */
+extern int nodelay(WINDOW *,bool); /* implemented */
+extern int noecho(void); /* implemented */
+extern int nonl(void); /* implemented */
+extern void noqiflush(void); /* implemented */
+extern int noraw(void); /* implemented */
+extern int notimeout(WINDOW *,bool); /* implemented */
+extern int overlay(const WINDOW*,WINDOW *); /* implemented */
+extern int overwrite(const WINDOW*,WINDOW *); /* implemented */
+extern int pair_content(short,short*,short*); /* implemented */
+extern int PAIR_NUMBER(int); /* generated */
+extern int pechochar(WINDOW *, const chtype); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int pecho_wchar(WINDOW *, const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int pnoutrefresh(WINDOW*,int,int,int,int,int,int);/* implemented */
+extern int prefresh(WINDOW *,int,int,int,int,int,int); /* implemented */
+extern int printw(NCURSES_CONST char *,...) /* implemented */
+ GCC_PRINTFLIKE(1,2);
+extern int putp(const char *); /* implemented */
+extern int putwin(WINDOW *, FILE *); /* implemented */
+extern void qiflush(void); /* implemented */
+extern int raw(void); /* implemented */
+extern int redrawwin(WINDOW *); /* generated */
+extern int refresh(void); /* generated */
+extern int resetty(void); /* implemented */
+extern int reset_prog_mode(void); /* implemented */
+extern int reset_shell_mode(void); /* implemented */
+extern int ripoffline(int, int (*init)(WINDOW *, int)); /* implemented */
+extern int savetty(void); /* implemented */
+extern int scanw(NCURSES_CONST char *,...) /* implemented */
+ GCC_SCANFLIKE(1,2);
+extern int scr_dump(const char *); /* implemented */
+extern int scr_init(const char *); /* implemented */
+extern int scrl(int); /* generated */
+extern int scroll(WINDOW *); /* generated */
+extern int scrollok(WINDOW *,bool); /* implemented */
+extern int scr_restore(const char *); /* implemented */
+extern int scr_set(const char *); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int setcchar(cchar_t *, const wchar_t *, const attr_t, short, const void *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int setscrreg(int,int); /* generated */
+extern SCREEN *set_term(SCREEN *); /* implemented */
+extern int slk_attroff(const chtype); /* implemented */
+extern int slk_attr_off(const attr_t, void *); /* generated:WIDEC */
+extern int slk_attron(const chtype); /* implemented */
+extern int slk_attr_on(attr_t,void*); /* generated:WIDEC */
+extern int slk_attrset(const chtype); /* implemented */
+extern attr_t slk_attr(void); /* implemented */
+extern int slk_attr_set(const attr_t,short,void*); /* implemented */
+extern int slk_clear(void); /* implemented */
+extern int slk_color(short); /* implemented */
+extern int slk_init(int); /* implemented */
+extern char *slk_label(int); /* implemented */
+extern int slk_noutrefresh(void); /* implemented */
+extern int slk_refresh(void); /* implemented */
+extern int slk_restore(void); /* implemented */
+extern int slk_set(int,const char *,int); /* implemented */
+extern int slk_touch(void); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int slk_wset(int, const wchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int standout(void); /* generated */
+extern int standend(void); /* generated */
+extern int start_color(void); /* implemented */
+extern WINDOW *subpad(WINDOW *, int, int, int, int); /* implemented */
+extern WINDOW *subwin(WINDOW *,int,int,int,int); /* implemented */
+extern int syncok(WINDOW *, bool); /* implemented */
+extern chtype termattrs(void); /* implemented */
+extern attr_t term_attrs(void); /* missing */
+extern char *termname(void); /* implemented */
+extern int tigetflag(NCURSES_CONST char *); /* implemented */
+extern int tigetnum(NCURSES_CONST char *); /* implemented */
+extern char *tigetstr(NCURSES_CONST char *); /* implemented */
+extern void timeout(int); /* generated */
+extern char *tparm(NCURSES_CONST char *, ...); /* implemented */
+extern int typeahead(int); /* implemented */
+extern int ungetch(int); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int unget_wch(const wchar_t); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int untouchwin(WINDOW *); /* generated */
+extern void use_env(bool); /* implemented */
+extern int vidattr(chtype); /* implemented */
+extern int vid_attr(attr_t, short, void *); /* generated:WIDEC */
+extern int vidputs(chtype, int (*)(int)); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int vid_puts(attr_t, short, void *, int (*)(int)); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int vline(chtype, int); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int vline_set(const cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int vwprintw(WINDOW *, NCURSES_CONST char *,va_list); /* implemented */
+extern int vw_printw(WINDOW *, NCURSES_CONST char *,va_list); /* generated */
+extern int vwscanw(WINDOW *, NCURSES_CONST char *,va_list); /* implemented */
+extern int vw_scanw(WINDOW *, NCURSES_CONST char *,va_list); /* generated */
+extern int waddch(WINDOW *, const chtype); /* implemented */
+extern int waddchnstr(WINDOW *,const chtype *const,int); /* implemented */
+extern int waddchstr(WINDOW *,const chtype *); /* generated */
+extern int waddnstr(WINDOW *,const char *const,int); /* implemented */
+extern int waddstr(WINDOW *,const char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int waddwstr(WINDOW *,const wchar_t *); /* missing */
+extern int waddnwstr(WINDOW *,const wchar_t *,int); /* missing */
+extern int wadd_wch(WINDOW *,const cchar_t *); /* missing */
+extern int wadd_wchnstr(WINDOW *,const cchar_t *,int); /* missing */
+extern int wadd_wchstr(WINDOW *,const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int wattron(WINDOW *, int); /* generated */
+extern int wattroff(WINDOW *, int); /* generated */
+extern int wattrset(WINDOW *, int); /* generated */
+extern int wattr_get(WINDOW *, attr_t *, short *, void *); /* generated */
+extern int wattr_on(WINDOW *, NCURSES_CONST attr_t, void *); /* implemented */
+extern int wattr_off(WINDOW *, NCURSES_CONST attr_t, void *); /* implemented */
+extern int wattr_set(WINDOW *, attr_t, short, void *); /* generated */
+extern int wbkgd(WINDOW *,const chtype); /* implemented */
+extern void wbkgdset(WINDOW *,chtype); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern void wbkgrndset(WINDOW *,const cchar_t *); /* missing */
+extern int wbkgrnd(WINDOW *,const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int wborder(WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern 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*); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int wchgat(WINDOW *, int, attr_t, short, const void *);/* implemented */
+extern int wclear(WINDOW *); /* implemented */
+extern int wclrtobot(WINDOW *); /* implemented */
+extern int wclrtoeol(WINDOW *); /* implemented */
+extern int wcolor_set(WINDOW*,short,void*); /* implemented */
+extern void wcursyncup(WINDOW *); /* implemented */
+extern int wdelch(WINDOW *); /* implemented */
+extern int wdeleteln(WINDOW *); /* generated */
+extern int wechochar(WINDOW *, const chtype); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int wecho_wchar(WINDOW *, const cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int werase(WINDOW *); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int wgetbkgrnd(WINDOW *, cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int wgetch(WINDOW *); /* implemented */
+extern int wgetnstr(WINDOW *,char *,int); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int wgetn_wstr(WINDOW *,wint_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int wgetstr(WINDOW *, char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int wget_wch(WINDOW *, wint_t *); /* missing */
+extern int wget_wstr(WINDOW *, wint_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int whline(WINDOW *, chtype, int); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int whline_set(WINDOW *, const cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern chtype winch(WINDOW *); /* implemented */
+extern int winchnstr(WINDOW *, chtype *, int); /* implemented */
+extern int winchstr(WINDOW *, chtype *); /* generated */
+extern int winnstr(WINDOW *, char *, int); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int winnwstr(WINDOW *, wchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int winsch(WINDOW *, chtype); /* implemented */
+extern int winsdelln(WINDOW *,int); /* implemented */
+extern int winsertln(WINDOW *); /* generated */
+extern int winsnstr(WINDOW *, const char *,int); /* implemented */
+extern int winsstr(WINDOW *, const char *); /* generated */
+extern int winstr(WINDOW *, char *); /* generated */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int wins_nwstr(WINDOW *, const wchar_t *, int); /* missing */
+extern int wins_wch(WINDOW *, const cchar_t *); /* missing */
+extern int wins_wstr(WINDOW *, const wchar_t *); /* missing */
+extern int winwstr(WINDOW *, wchar_t *); /* missing */
+extern int win_wch(WINDOW *, NCURSES_CONST cchar_t *); /* missing */
+extern int win_wchnstr(WINDOW *, NCURSES_CONST cchar_t *, int); /* missing */
+extern int win_wchstr(WINDOW *, NCURSES_CONST cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int wmove(WINDOW *,int,int); /* implemented */
+extern int wnoutrefresh(WINDOW *); /* implemented */
+extern int wprintw(WINDOW *, NCURSES_CONST char *,...) /* implemented */
+ GCC_PRINTFLIKE(2,3);
+extern int wredrawln(WINDOW *,int,int); /* implemented */
+extern int wrefresh(WINDOW *); /* implemented */
+extern int wscanw(WINDOW *, NCURSES_CONST char *,...) /* implemented */
+ GCC_SCANFLIKE(2,3);
+extern int wscrl(WINDOW *,int); /* implemented */
+extern int wsetscrreg(WINDOW *,int,int); /* implemented */
+extern int wstandout(WINDOW *); /* generated */
+extern int wstandend(WINDOW *); /* generated */
+extern void wsyncdown(WINDOW *); /* implemented */
+extern void wsyncup(WINDOW *); /* implemented */
+extern void wtimeout(WINDOW *,int); /* implemented */
+extern int wtouchln(WINDOW *,int,int,int); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern wchar_t *wunctrl(cchar_t *); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+extern int wvline(WINDOW *,chtype,int); /* implemented */
+#ifdef _XOPEN_SOURCE_EXTENDED
+extern int wvline_set(WINDOW *, const cchar_t *, int); /* missing */
+#endif /* _XOPEN_SOURCE_EXTENDED */
+
+extern bool mouse_trafo(int*, int*, bool); /* generated */
+
+/* attributes */
+
+#define NCURSES_BITS(mask,shift) ((mask) << ((shift) + @cf_cv_widec_shift@))
+
+#define A_NORMAL 0L
+#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)
+
+/* Tradeoff on 32-bit machines ('protect' vs widec). The others (e.g., left
+ * highlight are not implemented in any terminal descriptions, anyway.
+ */
+#if ((16 + @cf_cv_widec_shift@) < @cf_cv_shift_limit@)
+#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)
+#else
+#define A_PROTECT 0L
+#define A_HORIZONTAL 0L
+#define A_LEFT 0L
+#define A_LOW 0L
+#define A_RIGHT 0L
+#define A_TOP 0L
+#define A_VERTICAL 0L
+#endif
+
+#define COLOR_PAIR(n) NCURSES_BITS(n, 0)
+#define PAIR_NUMBER(a) (((a) & A_COLOR) >> @cf_cv_widec_shift@)
+
+/*
+ * pseudo functions
+ */
+#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()
+
+#define getyx(win,y,x) (y = (win)?(win)->_cury:ERR, x = (win)?(win)->_curx:ERR)
+#define getbegyx(win,y,x) (y = (win)?(win)->_begy:ERR, x = (win)?(win)->_begx:ERR)
+#define getmaxyx(win,y,x) (y = (win)?((win)->_maxy + 1):ERR, x = (win)?((win)->_maxx + 1):ERR)
+#define getparyx(win,y,x) (y = (win)?(win)->_pary:ERR, x = (win)?(win)->_parx:ERR)
+#define getsyx(y,x) do { if(newscr->_leaveok) (y)=(x)=-1; \
+ else getyx(newscr,(y),(x)); \
+ } while(0)
+#define setsyx(y,x) do { if((y)==-1 && (x)==-1) newscr->_leaveok=TRUE; \
+ else {newscr->_leaveok=FALSE;wmove(newscr,(y),(x));} \
+ } while(0)
+
+/* It seems older SYSV curses versions define these */
+#define getattrs(win) ((win)?(win)->_attrs:A_NORMAL)
+#define getcurx(win) ((win)?(win)->_curx:ERR)
+#define getcury(win) ((win)?(win)->_cury:ERR)
+#define getbegx(win) ((win)?(win)->_begx:ERR)
+#define getbegy(win) ((win)?(win)->_begy:ERR)
+#define getmaxx(win) ((win)?((win)->_maxx + 1):ERR)
+#define getmaxy(win) ((win)?((win)->_maxy + 1):ERR)
+#define getparx(win) ((win)?(win)->_parx:ERR)
+#define getpary(win) ((win)?(win)->_pary:ERR)
+
+#define wstandout(win) (wattrset(win,A_STANDOUT))
+#define wstandend(win) (wattrset(win,A_NORMAL))
+#define wattr_set(win,a,p,opts) ((win)->_attrs = (((a) & ~A_COLOR) | COLOR_PAIR(p)), OK)
+
+#define wattron(win,at) wattr_on(win, at, (void *)0)
+#define wattroff(win,at) wattr_off(win, at, (void *)0)
+#define wattrset(win,at) ((win)->_attrs = (at))
+
+#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)
+
+#define redrawwin(w) wredrawln(w, 0, w->_maxy+1)
+#define waddstr(win,str) waddnstr(win,str,-1)
+#define waddchstr(win,str) waddchnstr(win,str,-1)
+
+/*
+ * 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 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 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 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 ? (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 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)
+
+/*
+ * XSI curses macros for XPG4 conformance.
+ * The underlying functions needed to make these work are:
+ * waddnwstr(), waddchnwstr(), wadd_wch(), wborder_set(), wchgat(),
+ * wecho_wchar(), wgetn_wstr(), wget_wch(), whline_set(), vhline_set(),
+ * winnwstr(), wins_nwstr(), wins_wch(), win_wch(), win_wchnstr().
+ * Except for wchgat(), these are not yet implemented. They will be someday.
+ */
+#define add_wch(c) wadd_wch(stdscr,c)
+#define addnwstr(wstr,n) waddnwstr(stdscr,wstr,n)
+#define addwstr(wstr,n) waddnwstr(stdscr,wstr,-1)
+#define attr_get(a,pair,opts) wattr_get(stdscr,a,pair,opts)
+#define attr_off(a,opts) wattr_off(stdscr,a,opts)
+#define attr_on(a,opts) wattr_on(stdscr,a,opts)
+#define attr_set(a,pair,opts) wattr_set(stdscr,a,pair,opts)
+#define box_set(w,v,h) wborder_set(w,v,v,h,h,0,0,0,0)
+#define chgat(n,a,c,o) wchgat(stdscr,n,a,c,o)
+#define echo_wchar(c) wecho_wchar(stdscr,c)
+#define getbkgd(win) ((win)->_bkgd)
+#define get_wch(c) wget_wch(stdscr,c)
+#define get_wstr(t) wgetn_wstr(stdscr,t,-1)
+#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_wchnstr(stdscr,c,-1)
+#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_nwstr(stdscr,t,-1)
+#define inwstr(c) winnwstr(stdscr,c,-1)
+
+#define mvadd_wch(y,x,c) mvwadd_wch(stdscr,y,x,c)
+#define mvaddnwstr(y,x,wstr,n) mvwaddnwstr(stdscr,y,x,wstr,n)
+#define mvaddwstr(y,x,wstr,n) mvwaddnwstr(stdscr,y,x,wstr,-1)
+#define mvchgat(y,x,n,a,c,o) mvwchgat(stdscr,y,x,n,a,c,o)
+#define mvget_wch(y,x,c) mvwget_wch(stdscr,y,x,c)
+#define mvget_wstr(y,x,t) mvwgetn_wstr(stdscr,y,x,t,-1)
+#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_wchnstr(stdscr,y,x,c,-1)
+#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_nwstr(stdscr,y,x,t,-1)
+#define mvinwstr(y,x,c) mvwinnwstr(stdscr,y,x,c,-1)
+#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(stdscr,c))
+#define mvwaddnwstr(win,y,x,wstr,n) (wmove(win,y,x) == ERR ? ERR : waddnwstr(stdscr,wstr,n))
+#define mvwaddwstr(win,y,x,wstr,n) (wmove(win,y,x) == ERR ? ERR : waddnwstr(stdscr,wstr,-1))
+#define mvwchgat(win,y,x,n,a,c,o) (wmove(win,y,x) == ERR ? ERR : wchgat(win,n,a,c,o))
+#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 : wgetn_wstr(win,t,-1))
+#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(stdscr,c,n))
+#define mvwin_wchstr(win,y,x,c) (wmove(win,y,x) == ERR ? ERR : win_wchnstr(stdscr,c,-1))
+#define mvwinnwstr(win,y,x,c,n) (wmove(win,y,x) == ERR ? ERR : winnwstr(stdscr,c,n))
+#define mvwins_nwstr(win,y,x,t,n) (wmove(win,y,x) == ERR ? ERR : wins_nwstr(stdscr,t,n))
+#define mvwins_wch(win,y,x,c) (wmove(win,y,x) == ERR ? ERR : wins_wch(stdscr,c))
+#define mvwins_wstr(win,y,x,t) (wmove(win,y,x) == ERR ? ERR : wins_nwstr(stdscr,t,-1))
+#define mvwinwstr(win,y,x,c) (wmove(win,y,x) == ERR ? ERR : winnwstr(stdscr,c,-1))
+#define mvwvline_set(win,y,x,c,n) (wmove(win,y,x) == ERR ? ERR : wvline_set(win,c,n))
+
+#define slk_attr_off(a,v) ((v) ? ERR : slk_attroff(a))
+#define slk_attr_on(a,v) ((v) ? ERR : slk_attron(a))
+
+#define vid_attr(a,pair,opts) vidattr(a)
+#define vline_set(c,n) wvline_set(stdscr,c,n)
+#define waddwstr(win,wstr,n) waddnwstr(win,wstr,-1)
+#define wattr_get(win,a,p,opts) ((void)((a) != 0 && (*(a) = (win)->_attrs)), \
+ (void)((p) != 0 && (*(p) = PAIR_NUMBER((win)->_attrs))), \
+ OK)
+#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)
+#define winwstr(w,c) winnwstr(w,c,-1)
+
+
+/*
+ * XSI 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
+
+/*
+ * 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.
+ */
+#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_DOWN 0402 /* Down-arrow */
+#define KEY_UP 0403 /* Up-arrow */
+#define KEY_LEFT 0404 /* Left-arrow */
+#define KEY_RIGHT 0405 /* Right-arrow */
+#define KEY_HOME 0406 /* Home key (upward+left arrow) */
+#define KEY_BACKSPACE 0407 /* Backspace (unreliable) */
+#define KEY_F0 0410 /* Function keys. Space for 64 */
+#define KEY_F(n) (KEY_F0+(n)) /* Value of function key n */
+#define KEY_DL 0510 /* Delete line */
+#define KEY_IL 0511 /* Insert line */
+#define KEY_DC 0512 /* Delete character */
+#define KEY_IC 0513 /* Insert char or enter insert mode */
+#define KEY_EIC 0514 /* Exit insert char mode */
+#define KEY_CLEAR 0515 /* Clear screen */
+#define KEY_EOS 0516 /* Clear to end of screen */
+#define KEY_EOL 0517 /* Clear to end of line */
+#define KEY_SF 0520 /* Scroll 1 line forward */
+#define KEY_SR 0521 /* Scroll 1 line backward (reverse) */
+#define KEY_NPAGE 0522 /* Next page */
+#define KEY_PPAGE 0523 /* Previous page */
+#define KEY_STAB 0524 /* Set tab */
+#define KEY_CTAB 0525 /* Clear tab */
+#define KEY_CATAB 0526 /* Clear all tabs */
+#define KEY_ENTER 0527 /* Enter or send (unreliable) */
+#define KEY_SRESET 0530 /* Soft (partial) reset (unreliable) */
+#define KEY_RESET 0531 /* Reset or hard reset (unreliable) */
+#define KEY_PRINT 0532 /* Print */
+#define KEY_LL 0533 /* Home down or bottom (lower left) */
+
+/* The keypad is arranged like this: */
+/* a1 up a3 */
+/* left b2 right */
+/* c1 down c3 */
+
+#define KEY_A1 0534 /* Upper left of keypad */
+#define KEY_A3 0535 /* Upper right of keypad */
+#define KEY_B2 0536 /* Center of keypad */
+#define KEY_C1 0537 /* Lower left of keypad */
+#define KEY_C3 0540 /* Lower right of keypad */
+#define KEY_BTAB 0541 /* Back tab */
+#define KEY_BEG 0542 /* Beg (beginning) */
+#define KEY_CANCEL 0543 /* Cancel */
+#define KEY_CLOSE 0544 /* Close */
+#define KEY_COMMAND 0545 /* Cmd (command) */
+#define KEY_COPY 0546 /* Copy */
+#define KEY_CREATE 0547 /* Create */
+#define KEY_END 0550 /* End */
+#define KEY_EXIT 0551 /* Exit */
+#define KEY_FIND 0552 /* Find */
+#define KEY_HELP 0553 /* Help */
+#define KEY_MARK 0554 /* Mark */
+#define KEY_MESSAGE 0555 /* Message */
+#define KEY_MOVE 0556 /* Move */
+#define KEY_NEXT 0557 /* Next */
+#define KEY_OPEN 0560 /* Open */
+#define KEY_OPTIONS 0561 /* Options */
+#define KEY_PREVIOUS 0562 /* Prev (previous) */
+#define KEY_REDO 0563 /* Redo */
+#define KEY_REFERENCE 0564 /* Ref (reference) */
+#define KEY_REFRESH 0565 /* Refresh */
+#define KEY_REPLACE 0566 /* Replace */
+#define KEY_RESTART 0567 /* Restart */
+#define KEY_RESUME 0570 /* Resume */
+#define KEY_SAVE 0571 /* Save */
+#define KEY_SBEG 0572 /* Shifted Beg (beginning) */
+#define KEY_SCANCEL 0573 /* Shifted Cancel */
+#define KEY_SCOMMAND 0574 /* Shifted Command */
+#define KEY_SCOPY 0575 /* Shifted Copy */
+#define KEY_SCREATE 0576 /* Shifted Create */
+#define KEY_SDC 0577 /* Shifted Delete char */
+#define KEY_SDL 0600 /* Shifted Delete line */
+#define KEY_SELECT 0601 /* Select */
+#define KEY_SEND 0602 /* Shifted End */
+#define KEY_SEOL 0603 /* Shifted Clear line */
+#define KEY_SEXIT 0604 /* Shifted Dxit */
+#define KEY_SFIND 0605 /* Shifted Find */
+#define KEY_SHELP 0606 /* Shifted Help */
+#define KEY_SHOME 0607 /* Shifted Home */
+#define KEY_SIC 0610 /* Shifted Input */
+#define KEY_SLEFT 0611 /* Shifted Left arrow */
+#define KEY_SMESSAGE 0612 /* Shifted Message */
+#define KEY_SMOVE 0613 /* Shifted Move */
+#define KEY_SNEXT 0614 /* Shifted Next */
+#define KEY_SOPTIONS 0615 /* Shifted Options */
+#define KEY_SPREVIOUS 0616 /* Shifted Prev */
+#define KEY_SPRINT 0617 /* Shifted Print */
+#define KEY_SREDO 0620 /* Shifted Redo */
+#define KEY_SREPLACE 0621 /* Shifted Replace */
+#define KEY_SRIGHT 0622 /* Shifted Right arrow */
+#define KEY_SRSUME 0623 /* Shifted Resume */
+#define KEY_SSAVE 0624 /* Shifted Save */
+#define KEY_SSUSPEND 0625 /* Shifted Suspend */
+#define KEY_SUNDO 0626 /* Shifted Undo */
+#define KEY_SUSPEND 0627 /* Suspend */
+#define KEY_UNDO 0630 /* Undo */
+#define KEY_MOUSE 0631 /* Mouse event has occurred */
+#define KEY_RESIZE 0632 /* Terminal resize event */
+#define KEY_MAX 0777 /* Maximum key value */
+
+/* mouse interface */
+#define NCURSES_MOUSE_VERSION 1
+
+/* event masks */
+#define BUTTON1_RELEASED 000000000001L
+#define BUTTON1_PRESSED 000000000002L
+#define BUTTON1_CLICKED 000000000004L
+#define BUTTON1_DOUBLE_CLICKED 000000000010L
+#define BUTTON1_TRIPLE_CLICKED 000000000020L
+#define BUTTON1_RESERVED_EVENT 000000000040L
+#define BUTTON2_RELEASED 000000000100L
+#define BUTTON2_PRESSED 000000000200L
+#define BUTTON2_CLICKED 000000000400L
+#define BUTTON2_DOUBLE_CLICKED 000000001000L
+#define BUTTON2_TRIPLE_CLICKED 000000002000L
+#define BUTTON2_RESERVED_EVENT 000000004000L
+#define BUTTON3_RELEASED 000000010000L
+#define BUTTON3_PRESSED 000000020000L
+#define BUTTON3_CLICKED 000000040000L
+#define BUTTON3_DOUBLE_CLICKED 000000100000L
+#define BUTTON3_TRIPLE_CLICKED 000000200000L
+#define BUTTON3_RESERVED_EVENT 000000400000L
+#define BUTTON4_RELEASED 000001000000L
+#define BUTTON4_PRESSED 000002000000L
+#define BUTTON4_CLICKED 000004000000L
+#define BUTTON4_DOUBLE_CLICKED 000010000000L
+#define BUTTON4_TRIPLE_CLICKED 000020000000L
+#define BUTTON4_RESERVED_EVENT 000040000000L
+#define BUTTON_CTRL 000100000000L
+#define BUTTON_SHIFT 000200000000L
+#define BUTTON_ALT 000400000000L
+#define ALL_MOUSE_EVENTS 000777777777L
+#define REPORT_MOUSE_POSITION 001000000000L
+
+/* macros to extract single event-bits from masks */
+#define BUTTON_RELEASE(e, x) ((e) & (001 << (6 * ((x) - 1))))
+#define BUTTON_PRESS(e, x) ((e) & (002 << (6 * ((x) - 1))))
+#define BUTTON_CLICK(e, x) ((e) & (004 << (6 * ((x) - 1))))
+#define BUTTON_DOUBLE_CLICK(e, x) ((e) & (010 << (6 * ((x) - 1))))
+#define BUTTON_TRIPLE_CLICK(e, x) ((e) & (020 << (6 * ((x) - 1))))
+#define BUTTON_RESERVED_EVENT(e, x) ((e) & (040 << (6 * ((x) - 1))))
+
+typedef unsigned long mmask_t;
+
+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 int getmouse(MEVENT *);
+extern int ungetmouse(MEVENT *);
+extern mmask_t mousemask(mmask_t, mmask_t *);
+extern bool wenclose(const WINDOW *, int, int);
+extern int mouseinterval(int);
+extern bool wmouse_trafo(const WINDOW* win,int* y, int* x, bool to_screen);
+
+#define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)
+
+/* other non-XSI functions */
+
+extern int mcprint(char *, int); /* direct data to printer */
+extern int has_key(int); /* do we have given key? */
+
+/* Debugging : use with libncurses_g.a */
+
+extern void _tracef(const char *, ...) GCC_PRINTFLIKE(1,2);
+extern void _tracedump(const char *, WINDOW *);
+extern char *_traceattr(attr_t);
+extern char *_traceattr2(int, chtype);
+extern char *_nc_tracebits(void);
+extern char *_tracechar(const unsigned char);
+extern char *_tracechtype(chtype);
+extern char *_tracechtype2(int, chtype);
+extern char *_tracemouse(const MEVENT *);
+extern void trace(const unsigned int);
+
+/* 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_MAXIMUM 0xffff /* maximum trace level */
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+extern int _nc_optimize_enable; /* enable optimizations */
+extern 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
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NCURSES_H */
diff --git a/contrib/ncurses/include/edit_cfg.sh b/contrib/ncurses/include/edit_cfg.sh
new file mode 100755
index 000000000000..baa31f687d1e
--- /dev/null
+++ b/contrib/ncurses/include/edit_cfg.sh
@@ -0,0 +1,66 @@
+#!/bin/sh
+# $Id: edit_cfg.sh,v 1.9 1998/02/11 12:13:46 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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" 0 1 2 5 15
+for name in \
+ HAVE_TCGETATTR \
+ HAVE_TERMIOS_H \
+ HAVE_TERMIO_H \
+ NCURSES_CONST \
+ BROKEN_LINKER
+do
+ mv $2 $BAK
+ if ( grep "[ ]$name[ ]" $1 2>&1 >$TMP )
+ then
+ sed -e 's@#define '$name'.*$@'"`cat $TMP`@" $BAK >$2
+ elif test "$name" = "NCURSES_CONST" ; then
+ sed -e 's/define '$name'.*$/define '$name' \/\*nothing\*\//' $BAK >$2
+ else
+ sed -e 's/define '$name'.*$/define '$name' 0/' $BAK >$2
+ fi
+ if (cmp -s $2 $BAK)
+ then
+ echo '** same: '$name
+ mv $BAK $2
+ else
+ echo '** edit: '$name
+ rm -f $BAK
+ fi
+done
diff --git a/contrib/ncurses/include/headers b/contrib/ncurses/include/headers
new file mode 100644
index 000000000000..2a185c21627d
--- /dev/null
+++ b/contrib/ncurses/include/headers
@@ -0,0 +1,34 @@
+##############################################################################
+# Copyright (c) 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> 1996
+#
+term.h
+curses.h
+unctrl.h
+termcap.h
diff --git a/contrib/ncurses/include/nc_alloc.h b/contrib/ncurses/include/nc_alloc.h
new file mode 100644
index 000000000000..1e23a97720e0
--- /dev/null
+++ b/contrib/ncurses/include/nc_alloc.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright (c) 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> 1996,1997 *
+ ****************************************************************************/
+/* $Id: nc_alloc.h,v 1.7 1999/04/03 23:15:13 tom Exp $ */
+
+#ifndef NC_ALLOC_included
+#define NC_ALLOC_included 1
+
+#if HAVE_LIBDMALLOC
+#include <dmalloc.h> /* Gray Watson's library */
+#else
+#undef HAVE_LIBDMALLOC
+#define HAVE_LIBDMALLOC 0
+#endif
+
+#if HAVE_LIBDBMALLOC
+#include <dbmalloc.h> /* Conor Cahill's library */
+#else
+#undef HAVE_LIBDBMALLOC
+#define HAVE_LIBDBMALLOC 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 void _nc_free_and_exit(int) GCC_NORETURN;
+extern void _nc_free_tparm(void);
+extern void _nc_leaks_dump_entry(void);
+#define ExitProgram(code) _nc_free_and_exit(code)
+#endif
+
+#ifndef HAVE_NC_FREEALL
+#define HAVE_NC_FREEALL 0
+#endif
+
+#ifndef ExitProgram
+#define ExitProgram(code) return code
+#endif
+
+#endif /* NC_ALLOC_included */
diff --git a/contrib/ncurses/include/nc_panel.h b/contrib/ncurses/include/nc_panel.h
new file mode 100644
index 000000000000..dbb20fa184d1
--- /dev/null
+++ b/contrib/ncurses/include/nc_panel.h
@@ -0,0 +1,66 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * $Id: nc_panel.h,v 1.2 1998/02/11 12:13:45 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
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct panel; /* Forward Declaration */
+
+struct panelhook {
+ struct panel* top_panel;
+ struct panel* bottom_panel;
+ struct panel* stdscr_pseudo_panel;
+};
+
+/* Retrieve the panelhook of the current screen */
+extern struct panelhook* _nc_panelhook(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NC_PANEL_H */
diff --git a/contrib/ncurses/include/ncurses_cfg.hin b/contrib/ncurses/include/ncurses_cfg.hin
new file mode 100644
index 000000000000..f80fb83f0cd1
--- /dev/null
+++ b/contrib/ncurses/include/ncurses_cfg.hin
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+/*
+ * $Id: ncurses_cfg.hin,v 1.2 1998/02/11 12:13:46 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/contrib/ncurses/include/term_entry.h b/contrib/ncurses/include/term_entry.h
new file mode 100644
index 000000000000..a19b6010af76
--- /dev/null
+++ b/contrib/ncurses/include/term_entry.h
@@ -0,0 +1,155 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * term_entry.h -- interface to entry-manipulation code
+ */
+
+#ifndef _TERM_ENTRY_H
+#define _TERM_ENTRY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <term.h>
+
+#define MAX_USES 32
+
+typedef struct entry {
+ TERMTYPE tterm;
+ int nuses;
+ struct
+ {
+ void *parent; /* (char *) or (ENTRY *) */
+ long line;
+ }
+ uses[MAX_USES];
+ long cstart, cend;
+ long startline;
+ struct entry *next;
+ struct entry *last;
+}
+ENTRY;
+
+#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) ((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++)
+
+#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)
+
+extern ENTRY *_nc_head, *_nc_tail;
+#define for_entry_list(qp) for (qp = _nc_head; 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's 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); \
+ }
+
+/* alloc_entry.c: elementary allocation code */
+extern ENTRY *_nc_copy_entry(ENTRY *oldp);
+extern char *_nc_save_str(const char *const);
+extern void _nc_init_entry(TERMTYPE *const);
+extern void _nc_merge_entry(TERMTYPE *const, TERMTYPE *const);
+extern void _nc_wrap_entry(ENTRY *const);
+
+/* alloc_ttype.c: elementary allocation code */
+extern void _nc_align_termtype(TERMTYPE *, TERMTYPE *);
+extern void _nc_copy_termtype(TERMTYPE *, TERMTYPE *);
+
+/* free_ttype.c: elementary allocation code */
+extern void _nc_free_termtype(TERMTYPE *);
+
+/* lib_acs.c */
+extern void _nc_init_acs(void); /* corresponds to traditional 'init_acs()' */
+
+/* parse_entry.c: entry-parsing code */
+#if NCURSES_XNAMES
+extern bool _nc_user_definable;
+#endif
+extern int _nc_parse_entry(ENTRY *, int, bool);
+extern int _nc_capcmp(const char *, const char *);
+
+/* write_entry.c: writing an entry to the file system */
+extern void _nc_set_writedir(char *);
+extern void _nc_write_entry(TERMTYPE *const);
+
+/* comp_parse.c: entry list handling */
+extern void _nc_read_entry_source(FILE*, char*, int, bool, bool (*)(ENTRY*));
+extern bool _nc_entry_match(char *, char *);
+extern int _nc_resolve_uses(void);
+extern void _nc_free_entries(ENTRY *);
+extern void (*_nc_check_termtype)(TERMTYPE *);
+
+/* trace_xnames.c */
+extern void _nc_trace_xnames(TERMTYPE *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _TERM_ENTRY_H */
diff --git a/contrib/ncurses/include/termcap.h.in b/contrib/ncurses/include/termcap.h.in
new file mode 100644
index 000000000000..5c6c07a8e8d0
--- /dev/null
+++ b/contrib/ncurses/include/termcap.h.in
@@ -0,0 +1,71 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* $Id: termcap.h.in,v 1.10 1999/01/09 22:38:04 Uchiyama.Yasushi Exp $ */
+
+#ifndef _NCU_TERMCAP_H
+#define _NCU_TERMCAP_H 1
+
+#undef NCURSES_VERSION
+#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#include <sys/types.h>
+@OSPEED_INCLUDES@
+
+#undef NCURSES_CONST
+#define NCURSES_CONST @NCURSES_CONST@
+
+extern char PC;
+extern char *UP;
+extern char *BC;
+extern @OSPEED_TYPE@ ospeed;
+
+#if !defined(_NCU_TERM_H)
+extern char *tgetstr(NCURSES_CONST char *, char **);
+extern char *tgoto(const char *, int, int);
+extern int tgetent(char *, const char *);
+extern int tgetflag(NCURSES_CONST char *);
+extern int tgetnum(NCURSES_CONST char *);
+extern int tputs(const char *, int, int (*)(int));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NCU_TERMCAP_H */
diff --git a/contrib/ncurses/include/tic.h b/contrib/ncurses/include/tic.h
new file mode 100644
index 000000000000..58bc27faae0b
--- /dev/null
+++ b/contrib/ncurses/include/tic.h
@@ -0,0 +1,274 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * tic.h - Global variables and structures for the terminfo
+ * compiler.
+ *
+ */
+
+#ifndef __TIC_H
+#define __TIC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <curses.h> /* for the _tracef() prototype, ERR/OK, bool defs */
+
+/*
+** The format of 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.
+**
+** 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 */
+
+/*
+ * 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_SIZE 4096 /* maximum legal entry size */
+
+/* The maximum size of individual name or alias is guaranteed in XSI to
+ * be 14, since that corresponds to the older filename lengths. Newer
+ * systems allow longer aliases, though not many terminal descriptions
+ * are written to use them.
+ */
+#if HAVE_LONG_FILE_NAMES
+#define MAX_ALIAS 32 /* 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 */
+
+#ifdef TRACE
+#define DEBUG(n, a) if (_nc_tracing & (1 << (n - 1))) _tracef a
+#else
+#define DEBUG(n, a) /*nothing*/
+#endif
+
+extern unsigned _nc_tracing;
+extern void _nc_tracef(char *, ...) GCC_PRINTFLIKE(1,2);
+extern const char *_nc_visbuf(const char *);
+
+/*
+ * 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) */
+};
+
+extern struct token _nc_curr_token;
+
+ /*
+ * List of keynames with their corresponding code.
+ */
+struct kn {
+ const char *name;
+ int code;
+};
+
+extern const struct kn _nc_key_names[];
+
+ /*
+ * Offsets to string capabilities, with the corresponding functionkey
+ * codes.
+ */
+struct tinfo_fkeys {
+ unsigned offset;
+ chtype code;
+ };
+
+extern struct tinfo_fkeys _nc_tinfo_fkeys[];
+
+ /*
+ * 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 */
+ short nte_index; /* index of associated variable in its array */
+ short nte_link; /* index in table of next hash, or -1 */
+};
+
+struct alias
+{
+ const char *from;
+ const char *to;
+ const char *source;
+};
+
+extern const struct name_table_entry * const _nc_info_hash_table[];
+extern const struct name_table_entry * const _nc_cap_hash_table[];
+
+extern const struct alias _nc_capalias_table[];
+extern const struct alias _nc_infoalias_table[];
+
+extern const struct name_table_entry *_nc_get_table(bool);
+extern const struct name_table_entry * const *_nc_get_hash_table(bool);
+
+#define NOTFOUND ((struct name_table_entry *) 0)
+
+/* out-of-band values for representing absent capabilities */
+#define ABSENT_BOOLEAN -1
+#define ABSENT_NUMERIC -1
+#define ABSENT_STRING (char *)0
+
+/* out-of-band values for representing cancels */
+#define CANCELLED_BOOLEAN (char)(-2)
+#define CANCELLED_NUMERIC -2
+#define CANCELLED_STRING (char *)-1
+
+#define VALID_BOOLEAN(s) ((s) >= 0)
+#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
+
+/* comp_hash.c: name lookup */
+struct name_table_entry const *_nc_find_entry(const char *,
+ const struct name_table_entry *const *);
+struct name_table_entry const *_nc_find_type_entry(const char *,
+ int,
+ const struct name_table_entry *);
+
+/* comp_scan.c: lexical analysis */
+extern int _nc_get_token(void);
+extern void _nc_push_token(int);
+extern void _nc_reset_input(FILE *, char *);
+extern void _nc_panic_mode(char);
+extern int _nc_curr_line;
+extern int _nc_curr_col;
+extern long _nc_curr_file_pos;
+extern long _nc_comment_start, _nc_comment_end;
+extern int _nc_syntax;
+extern long _nc_start_line;
+#define SYN_TERMINFO 0
+#define SYN_TERMCAP 1
+
+/* comp_error.c: warning & abort messages */
+extern void _nc_set_source(const char *const name);
+extern void _nc_get_type(char *name);
+extern void _nc_set_type(const char *const name);
+extern void _nc_syserr_abort(const char *const,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
+extern void _nc_err_abort(const char *const,...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
+extern void _nc_warning(const char *const,...) GCC_PRINTFLIKE(1,2);
+extern bool _nc_suppress_warnings;
+
+/* comp_expand.c: expand string into readable form */
+extern char *_nc_tic_expand(const char *, bool, int);
+
+/* comp_scan.c: decode string from readable form */
+extern char _nc_trans_string(char *);
+
+/* captoinfo.c: capability conversion */
+extern char *_nc_captoinfo(const char *, const char *, int const);
+extern char *_nc_infotocap(const char *, const char *, int const);
+
+/* lib_tputs.c */
+extern int _nc_nulls_sent; /* Add one for every null sent */
+
+/* comp_main.c: compiler main */
+extern const char *_nc_progname;
+
+/* read_entry.c */
+extern const char *_nc_tic_dir(const char *);
+
+/* write_entry.c */
+extern int _nc_tic_written(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __TIC_H */
diff --git a/contrib/ncurses/include/unctrl.h.in b/contrib/ncurses/include/unctrl.h.in
new file mode 100644
index 000000000000..cc10079f11c7
--- /dev/null
+++ b/contrib/ncurses/include/unctrl.h.in
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.8 1998/02/11 12:13:45 tom Exp $ */
+
+#ifndef _UNCTRL_H
+#define _UNCTRL_H 1
+
+#undef NCURSES_VERSION
+#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <curses.h>
+
+#undef unctrl
+extern NCURSES_CONST char *unctrl(chtype);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNCTRL_H */
diff --git a/contrib/ncurses/install-sh b/contrib/ncurses/install-sh
new file mode 100755
index 000000000000..89fc9b098b8c
--- /dev/null
+++ b/contrib/ncurses/install-sh
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# 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.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# 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 $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/contrib/ncurses/man/MKterminfo.sh b/contrib/ncurses/man/MKterminfo.sh
new file mode 100755
index 000000000000..a6f765a4f00c
--- /dev/null
+++ b/contrib/ncurses/man/MKterminfo.sh
@@ -0,0 +1,99 @@
+#!/bin/sh
+#***************************************************************************
+# Copyright (c) 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. *
+#***************************************************************************
+#
+# $Id: MKterminfo.sh,v 1.5 1998/09/06 00:20:01 tom Exp $
+#
+# MKterminfo.sh -- generate terminfo.5 from Caps tabular data
+#
+# 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.
+#
+head=$1
+caps=$2
+tail=$3
+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 "rm -f $sorted $temp $unsorted; exit 99" 1 2 5 15
+
+sed -n <$caps "\
+/%%-STOP-HERE-%%/q
+/^#%/s///p
+/^#/d
+s/$/T}/
+s/ [Y\-][B\-][C\-][G\-][E\-]\** / 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
+ 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"
+cat $tail
+
+rm -f $sorted $temp $unsorted
diff --git a/contrib/ncurses/man/Makefile.in b/contrib/ncurses/man/Makefile.in
new file mode 100644
index 000000000000..f0607f566293
--- /dev/null
+++ b/contrib/ncurses/man/Makefile.in
@@ -0,0 +1,75 @@
+# $Id: Makefile.in,v 1.25 1998/02/11 12:13:49 tom Exp $
+##############################################################################
+# Copyright (c) 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> 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 = /bin/sh
+
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+mandir = @mandir@
+
+ticdir = $(datadir)/terminfo
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+all \
+sources: terminfo.5
+
+$(INSTALL_PREFIX)$(mandir) :
+ $(srcdir)/../mkinstalldirs $@
+
+install install.man : terminfo.5 $(INSTALL_PREFIX)$(mandir)
+ sh ./edit_man.sh installing $(INSTALL_PREFIX)$(mandir) terminfo.5 $(srcdir)/*.[0-9]*
+
+uninstall uninstall.man :
+ -sh ./edit_man.sh removing $(INSTALL_PREFIX)$(mandir) terminfo.5 $(srcdir)/*.[0-9]*
+
+# We compose terminfo.5 from the real sources...
+CAPLIST=$(srcdir)/../include/Caps
+terminfo.5: $(srcdir)/terminfo.head $(CAPLIST) $(srcdir)/terminfo.tail Makefile $(srcdir)/MKterminfo.sh
+ sh $(srcdir)/MKterminfo.sh $(srcdir)/terminfo.head $(CAPLIST) $(srcdir)/terminfo.tail >terminfo.5
+
+mostlyclean :
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+
+clean: mostlyclean
+ rm -f terminfo.5
+
+distclean realclean: clean
+ rm -f Makefile edit_man.*
diff --git a/contrib/ncurses/man/captoinfo.1m b/contrib/ncurses/man/captoinfo.1m
new file mode 100644
index 000000000000..70e278cbf6f3
--- /dev/null
+++ b/contrib/ncurses/man/captoinfo.1m
@@ -0,0 +1,188 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: captoinfo.1m,v 1.13 1998/12/26 19:57:11 tom Exp $
+.TH captoinfo 1M ""
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+\fBcaptoinfo\fR - convert a \fItermcap\fR description into a \fIterminfo\fR description
+.SH SYNOPSIS
+\fBcaptoinfo\fR [\fB-v\fR\fIn\fR \fIwidth\fR] [\fB-V\fR] [\fB-1\fR] [\fB-w\fR \fIwidth\fR] \fIfile\fR . . .
+.SH DESCRIPTION
+\fBcaptoinfo\fR looks in \fIfile\fR for \fBtermcap\fR descriptions. For each
+one found, an equivalent \fBterminfo\fR description is written to standard
+output. Termcap \fBtc\fR capabilities are translated directly to terminfo
+\fBuse\fR capabilities.
+
+If no \fIfile\fR is given, then the environment variable \fBTERMCAP\fR is used
+for the filename or entry. If \fBTERMCAP\fR is a full pathname to a file, only
+the terminal whose name is specified in the environment variable \fBTERM\fR is
+extracted from that file. If the environment variable \fBTERMCAP\fR is not
+set, then the file \fB\*d\fR is read.
+.TP 5
+\fB-v\fR
+print out tracing information on standard error as the program runs.
+.TP 5
+\fB-V\fR
+print out the version of the program in use on standard error and exit.
+.TP 5
+\fB-1\fR
+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\fR
+change the output to \fIwidth\fR 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 \fBcaptoinfo\fR.
+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\fR string. The double-line capabilities and
+\fBGG\fR 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:
+.PP
+.TS
+c c
+l l.
+IBM XSI
+_
+ksel kslt
+kbtab kcbt
+font0 s0ds
+font1 s1ds
+font2 s2ds
+font3 s3ds
+.TE
+.PP
+Additionally, the AIX \fBbox1\fR capability will be automatically translated to
+an \fBacsc\fR string.
+.PP
+Hewlett-Packard's terminfo library supports two nonstandard terminfo
+capabilities \fBmeml\fR (memory lock) and \fBmemu\fR (memory unlock).
+These will be discarded with a warning message.
+.SH NOTES
+This utility is actually a link to \fItic\fR(1M), running in \fI-I\fR mode.
+
+The trace option isn't identical to SVr4's. Under SVr4, instead of following
+the -v with a trace level n, you repeat it n times.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBinfocmp\fR(1M), \fBterminfo\fR(\*n)
+.SH AUTHOR
+Eric S. Raymond <esr@snark.thyrsus.com>
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/clear.1 b/contrib/ncurses/man/clear.1
new file mode 100644
index 000000000000..71d2883b747e
--- /dev/null
+++ b/contrib/ncurses/man/clear.1
@@ -0,0 +1,48 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: clear.1,v 1.2 1998/03/11 21:12:53 juergen Exp $
+.TH clear 1 ""
+.ds n 5
+.SH NAME
+\fBclear\fR - clear the terminal screen
+.SH SYNOPSIS
+\fBclear\fR
+.br
+.SH DESCRIPTION
+\fBclear\fR clears your screen if this is possible. It looks in the
+environment for the terminal type and then in the \fBterminfo\fR database to
+figure out how to clear the screen.
+.SH SEE ALSO
+\fBtput\fR(1), \fBterminfo\fR(\*n)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_addch.3x b/contrib/ncurses/man/curs_addch.3x
new file mode 100644
index 000000000000..7cdfd7835355
--- /dev/null
+++ b/contrib/ncurses/man/curs_addch.3x
@@ -0,0 +1,163 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_addch.3x,v 1.16 1999/02/07 03:47:42 tom Exp $
+.TH curs_addch 3X ""
+.SH NAME
+\fBaddch\fR, \fBwaddch\fR, \fBmvaddch\fR, \fBmvwaddch\fR,
+\fBechochar\fR, \fBwechochar\fR - add a character (with attributes) to a
+\fBcurses\fR window, then advance the cursor
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint addch(chtype ch);\fR
+.br
+\fBint waddch(WINDOW *win, chtype ch);\fR
+.br
+\fBint mvaddch(int y, int x, chtype ch);\fR
+.br
+\fBint mvwaddch(WINDOW *win, int y, int x, chtype ch);\fR
+.br
+\fBint echochar(chtype ch);\fR
+.br
+\fBint wechochar(WINDOW *win, chtype ch);\fR
+.br
+.SH DESCRIPTION
+The \fBaddch\fR, \fBwaddch\fR, \fBmvaddch\fR and \fBmvwaddch\fR routines put
+the character \fIch\fR into the given window at its current window position,
+which is then advanced. They are analogous to \fBputchar\fR in \fBstdio\fR(3).
+If the advance is at the right margin, the cursor automatically wraps to the
+beginning of the next line. At the bottom of the current scrolling region, if
+\fBscrollok\fR is enabled, the scrolling region is scrolled up one line.
+
+If \fIch\fR is a tab, newline, or backspace, the cursor is moved appropriately
+within the window. Backspace moves the cursor one character left; at the left
+edge of a window it does nothing. Newline does a \fBclrtoeol\fR, then moves
+the cursor to the window left margin on the next line, scrolling the window if
+on the last line). Tabs are considered to be at every eighth column.
+
+If \fIch\fR is any control character other than tab, newline, or backspace, it
+is drawn in \fB^\fR\fIX\fR notation. Calling \fBwinch\fR after adding a
+control character does not return the character itself, but instead returns
+the ^-representation of the control character.
+
+Video attributes can be combined with a character argument passed to
+\fBaddch\fR or related functions by logical-ORing them into the character.
+(Thus, text, including attributes, can be copied from one place to another
+using \fBinch\fR and \fBaddch\fR.). See the \fBcurs_attr\fR(3X) page for
+values of predefined video attribute constants that can be usefully OR'ed
+into characters.
+
+The \fBechochar\fR and \fBwechochar\fR routines are equivalent to a call to
+\fBaddch\fR followed by a call to \fBrefresh\fR, or a call to \fBwaddch\fR
+followed by a call to \fBwrefresh\fR. 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\fR family. The default character listed
+below is used if the \fBacsc\fR capability doesn't define a terminal-specific
+replacement for it (but see the EXTENSIONS section below). The names are
+taken from VT100 nomenclature.
+
+.TS
+l l l
+_ _ _
+l l l.
+\fIName\fR \fIDefault\fR \fIDescription\fR
+ACS_BLOCK # solid square block
+ACS_BOARD # board of squares
+ACS_BTEE + bottom tee
+ACS_BULLET o bullet
+ACS_CKBOARD : checker board (stipple)
+ACS_DARROW v arrow pointing down
+ACS_DEGREE ' degree symbol
+ACS_DIAMOND + diamond
+ACS_GEQUAL > greater-than-or-equal-to
+ACS_HLINE - horizontal line
+ACS_LANTERN # lantern symbol
+ACS_LARROW < arrow pointing left
+ACS_LEQUAL < less-than-or-equal-to
+ACS_LLCORNER + lower left-hand corner
+ACS_LRCORNER + lower right-hand corner
+ACS_LTEE + left tee
+ACS_NEQUAL ! not-equal
+ACS_PI * greek pi
+ACS_PLMINUS # plus/minus
+ACS_PLUS + plus
+ACS_RARROW > arrow pointing right
+ACS_RTEE + right tee
+ACS_S1 - scan line 1
+ACS_S3 - scan line 3
+ACS_S7 - scan line 7
+ACS_S9 \&_ scan line 9
+ACS_STERLING f pound-sterling symbol
+ACS_TTEE + top tee
+ACS_UARROW ^ arrow pointing up
+ACS_ULCORNER + upper left-hand corner
+ACS_URCORNER + upper right-hand corner
+ACS_VLINE | vertical line
+.TE
+
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and \fBOK\fR on success
+(the SVr4 manuals specify only "an integer value other than \fBERR\fR") upon
+successful completion, unless otherwise noted in the preceding routine
+descriptions.
+.SH NOTES
+Note that \fBaddch\fR, \fBmvaddch\fR, \fBmvwaddch\fR, and
+\fBechochar\fR 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.
+
+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\fR 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\fR(3X).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_attr\fR(3X), \fBcurs_clear\fR(3X),
+\fBcurs_inch\fR(3X), \fBcurs_outopts\fR(3X), \fBcurs_refresh\fR(3X),
+\fBputc\fR(3S).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_addchstr.3x b/contrib/ncurses/man/curs_addchstr.3x
new file mode 100644
index 000000000000..f552a3b0f5e8
--- /dev/null
+++ b/contrib/ncurses/man/curs_addchstr.3x
@@ -0,0 +1,84 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_addchstr.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_addchstr 3X ""
+.SH NAME
+\fBaddchstr\fR, \fBaddchnstr\fR, \fBwaddchstr\fR,
+\fBwaddchnstr\fR, \fBmvaddchstr\fR, \fBmvaddchnstr\fR, \fBmvwaddchstr\fR,
+\fBmvwaddchnstr\fR - add a string of characters (and attributes) to a
+\fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint addchstr(const chtype *chstr);\fR
+.br
+\fBint addchnstr(const chtype *chstr, int n);\fR
+.br
+\fBint waddchstr(WINDOW *win, const chtype *chstr);\fR
+.br
+\fBint waddchnstr(WINDOW *win, const chtype *chstr, int n);\fR
+.br
+\fBint mvaddchstr(int y, int x, const chtype *chstr);\fR
+.br
+\fBint mvaddchnstr(int y, int x, const chtype *chstr, int n);\fR
+.br
+\fBint mvwaddchstr(WINDOW *win, int y, int x, const chtype *chstr);\fR
+.br
+\fBint mvwaddchnstr(WINDOW *win, int y, int x, const chtype *chstr, int n);\fR
+.SH DESCRIPTION
+These routines copy \fIchstr\fR into the window image structure at and after
+the current cursor position. The four routines with \fIn\fR as the last
+argument copy at most \fIn\fR elements, but no more than will fit on the line.
+If \fBn\fR=\fB-1\fR then the whole string is copied, to the maximum number of
+characters that will fit on the line.
+
+The window cursor is \fInot\fR advanced, and these routines work faster than
+\fBwaddnstr\fR. On the other hand, they don't perform any kind of checking
+(such as for the newline, backspace, or carriage return characters), they don't
+advance the current cursor position, they don't expand other control characters
+to ^-escapes, and they truncate the string if it crosses the right margin,
+rather then wrapping it around to the new line.
+
+.SH RETURN VALUES
+All routines return the integer \fBERR\fR upon failure and \fBOK\fR on success
+(the SVr4 manuals specify only "an integer value other than \fBERR\fR") upon
+successful completion, unless otherwise noted in the preceding routine
+descriptions.
+.SH NOTES
+Note that all routines except \fBwaddchnstr\fR may be macros.
+.SH PORTABILITY
+All these entry points are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_addstr.3x b/contrib/ncurses/man/curs_addstr.3x
new file mode 100644
index 000000000000..fee3f8145e35
--- /dev/null
+++ b/contrib/ncurses/man/curs_addstr.3x
@@ -0,0 +1,77 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_addstr.3x,v 1.8 1998/03/11 21:12:53 juergen Exp $
+.TH curs_addstr 3X ""
+.SH NAME
+\fBaddstr\fR, \fBaddnstr\fR, \fBwaddstr\fR, \fBwaddnstr\fR,
+\fBmvaddstr\fR, \fBmvaddnstr\fR, \fBmvwaddstr\fR, \fBmvwaddnstr\fR - add a
+string of characters to a \fBcurses\fR window and advance cursor
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint addstr(const char *str);\fR
+.br
+\fBint addnstr(const char *str, int n);\fR
+.br
+\fBint waddstr(WINDOW *win, const char *str);\fR
+.br
+\fBint waddnstr(WINDOW *win, const char *str, int n);\fR
+.br
+\fBint mvaddstr(int y, int x, const char *str);\fR
+.br
+\fBint mvaddnstr(int y, int x, const char *str, int n);\fR
+.br
+\fBint mvwaddstr(WINDOW *win, int y, int x, const char *str);\fR
+.br
+\fBint mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n);\fR
+.SH DESCRIPTION
+These routines write the characters of the (null-terminated) character string
+\fIstr\fR on the given window. It is similar to calling \fBwaddch\fR once for
+each character in the string. The four routines with \fIn\fR as the last
+argument write at most \fIn\fR characters. If \fIn\fR is -1, then the
+entire string will be added.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and \fBOK\fR on success
+(the SVr4 manuals specify only "an integer value other than \fBERR\fR") upon
+successful completion.
+.SH NOTES
+Note that all of these routines except \fBwaddstr\fR and \fBwaddnstr\fR may be
+macros.
+.SH PORTABILITY
+All these entry points are described in the XSI Curses standard, Issue 4. The
+XSI errors EILSEQ and EOVERFLOW, associated with extended-level conformance,
+are not yet detected.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_addch\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_attr.3x b/contrib/ncurses/man/curs_attr.3x
new file mode 100644
index 000000000000..d6ad62471acf
--- /dev/null
+++ b/contrib/ncurses/man/curs_attr.3x
@@ -0,0 +1,215 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_attr.3x,v 1.19 1998/12/26 19:25:35 tom Exp $
+.TH curs_attr 3X ""
+.SH NAME
+\fBattroff\fR, \fBwattroff\fR, \fBattron\fR, \fBwattron\fR,
+\fBattrset\fR, \fBwattrset\fR, \fBcolor_set\fR, \fBwcolor_set\fR,
+\fBstandend\fR, \fBwstandend\fR, \fBstandout\fR,
+\fBwstandout\fR - \fBcurses\fR character and window attribute control routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+.br
+\fBint attroff(int attrs);\fR
+.br
+\fBint wattroff(WINDOW *win, int attrs);\fR
+.br
+\fBint attron(int attrs);\fR
+.br
+\fBint wattron(WINDOW *win, int attrs);\fR
+.br
+\fBint attrset(int attrs);\fR
+.br
+\fBint wattrset(WINDOW *win, int attrs);\fR
+.br
+\fBint color_set(short color_pair_number, void* opts);\fR
+.br
+\fBint wcolor_set(WINDOW *win, short color_pair_number,\fR
+ \fBvoid* opts);\fR
+.br
+\fBint standend(void);\fR
+.br
+\fBint wstandend(WINDOW *win);\fR
+.br
+\fBint standout(void);\fR
+.br
+\fBint wstandout(WINDOW *win);\fR
+.br
+\fBint attr_get(attr_t *attrs, short *pair, void *opts);\fR
+.br
+\fBint wattr_get(WINDOW *win, attr_t *attrs, short *pair,\fR
+ \fBvoid *opts);\fR
+.br
+\fBint attr_off(attr_t attrs, void *opts);\fR
+.br
+\fBint wattr_off(WINDOW *win, attr_t attrs, void *opts);\fR
+.br
+\fBint attr_on(attr_t attrs, void *opts);\fR
+.br
+\fBint wattr_on(WINDOW *win, attr_t attrs, void *opts);\fR
+.br
+\fBint attr_set(attr_t attrs, void *opts);\fR
+.br
+\fBint wattr_set(WINDOW *win, attr_t attrs, void *opts);\fR
+.br
+\fBint chgat(int n, attr_t attr, short color,\fR
+ \fBconst void *opts)\fR
+.br
+\fBint wchgat(WINDOW *win, int n, attr_t attr,\fR
+ \fBshort color, const void *opts)\fR
+.br
+\fBint mvchgat(int y, int x, int n, attr_t attr,\fR
+ \fBshort color, const void *opts)\fR
+.br
+\fBint mvwchgat(WINDOW *win, int y, int x, int n,\fR
+ \fBattr_t attr, short color, const void *opts)\fR
+.br
+.SH DESCRIPTION
+These routines manipulate the current attributes of the named window. The
+current attributes of a window apply to all characters that are written into
+the window with \fBwaddch\fR, \fBwaddstr\fR and \fBwprintw\fR. 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.
+
+The routine \fBattrset\fR sets the current attributes of the given window to
+\fIattrs\fR. The routine \fBattroff\fR turns off the named attributes without
+turning any other attributes on or off. The routine \fBattron\fR turns on the
+named attributes without affecting any others. The routine \fBstandout\fR is
+the same as \fBattron(A_STANDOUT)\fR. The routine \fBstandend\fR is the same
+as \fBattrset(A_NORMAL)\fR or \fBattrset(0)\fR, that is, it turns off all
+attributes.
+
+The routine \fBcolor_set\fR sets the current color of the given window to the
+foreground/background combination described by the color_pair_number. The
+parameter opts is reserved for future use, applications must supply a null
+pointer.
+
+The routine \fBwattr_get\fR returns the current attribute and color pair for
+the given window; \fBattr_get\fR returns the current attribute and color pair
+for \fBstdscr\fR.
+The remaining \fBattr_\fR* functions operate exactly like the corresponding
+\fBattr\fR* functions, except that they take arguments of type \fBattr_t\fR
+rather than \fBint\fR.
+
+The routine \fBchgat\fR changes the attributes of a given number of characters
+starting at the current cursor location of \fBstdscr\fR. 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\fR function generalizes this to any
+window; the \fBmvwchgat\fR function does a cursor move before acting. In these
+functions, the color argument is a color-pair index (as in the first argument
+of \fIinit_pair\fR, see \fBcurs_color\fR(3X)). The \fBopts\fR argument is not
+presently used, but is reserved for the future (leave it \fBNULL\fR).
+.SS Attributes
+The following video attributes, defined in \fB<curses.h>\fR, can be passed to
+the routines \fBattron\fR, \fBattroff\fR, and \fBattrset\fR, or OR'ed with the
+characters passed to \fBaddch\fR.
+
+.TS
+center ;
+l l .
+\fBA_NORMAL\fR Normal display (no highlight)
+\fBA_STANDOUT\fR Best highlighting mode of the terminal.
+\fBA_UNDERLINE\fR Underlining
+\fBA_REVERSE\fR Reverse video
+\fBA_BLINK\fR Blinking
+\fBA_DIM\fR Half bright
+\fBA_BOLD\fR Extra bright or bold
+\fBA_PROTECT\fR Protected mode
+\fBA_INVIS\fR Invisible or blank mode
+\fBA_ALTCHARSET\fR Alternate character set
+\fBA_CHARTEXT\fR Bit-mask to extract a character
+\fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR Color-pair number \fIn\fR
+.TE
+
+The following macro is the reverse of \fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR:
+
+.DS C
+\fBPAIR_NUMBER(\fR\fIattrs\fR) Returns the pair number associated
+ with the \fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR attribute.
+.DE
+
+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\fR.
+
+.SH NOTES
+Note that \fBattroff\fR, \fBwattroff\fR, \fBattron\fR, \fBwattron\fR,
+\fBattrset\fR, \fBwattrset\fR, \fBstandend\fR and \fBstandout\fR may be macros.
+.SH PORTABILITY
+All these functions are supported in the XSI Curses standard, Issue 4. The
+standard defined the dedicated type for highlights, \fBattr_t\fR, which is not
+defined in SVr4 curses. The functions taking \fBattr_t\fR arguments are
+not supported under SVr4.
+
+The XSI Curses standard states that whether the traditional functions
+\fBattron\fR/\fBattroff\fR/\fBattrset\fR can manipulate attributes other than
+\fBA_BLINK\fR, \fBA_BOLD\fR, \fBA_DIM\fR, \fBA_REVERSE\fR, \fBA_STANDOUT\fR, or
+\fBA_UNDERLINE\fR is "unspecified". Under this implementation as well as
+SVr4 curses, these functions correctly manipulate all other highlights
+(specifically, \fBA_ALTCHARSET\fR, \fBA_PROTECT\fR, and \fBA_INVIS\fR).
+
+XSI Curses added the new entry points, \fBattr_get\fR, \fBattr_on\fR,
+\fBattr_off\fR, \fBattr_set\fR, \fBwattr_on\fR, \fBwattr_off\fR,
+\fBwattr_get\fR, \fBwattr_set\fR. These are intended to work with
+a new series of highlight macros prefixed with \fBWA_\fR.
+
+.TS
+center ;
+l l .
+\fBWA_NORMAL\fR Normal display (no highlight)
+\fBWA_STANDOUT\fR Best highlighting mode of the terminal.
+\fBWA_UNDERLINE\fR Underlining
+\fBWA_REVERSE\fR Reverse video
+\fBWA_BLINK\fR Blinking
+\fBWA_DIM\fR Half bright
+\fBWA_BOLD\fR Extra bright or bold
+\fBWA_ALTCHARSET\fR Alternate character set
+.TE
+
+The XSI curses standard specifies that each pair of corresponding \fBA_\fR
+and \fBWA_\fR-using functions operates on the same current-highlight
+information.
+
+The XSI standard extended conformance level adds new highlights
+\fBA_HORIZONTAL\fR, \fBA_LEFT\fR, \fBA_LOW\fR, \fBA_RIGHT\fR, \fBA_TOP\fR,
+\fBA_VERTICAL\fR (and corresponding \fBWA_\fR macros for each) which this
+curses does not yet support.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_addch\fR(3X), \fBcurs_addstr\fR(3X),
+\fBcurs_printw\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_beep.3x b/contrib/ncurses/man/curs_beep.3x
new file mode 100644
index 000000000000..b9caaa804f76
--- /dev/null
+++ b/contrib/ncurses/man/curs_beep.3x
@@ -0,0 +1,63 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_beep.3x,v 1.7 1998/03/11 21:12:53 juergen Exp $
+.TH curs_beep 3X ""
+.SH NAME
+\fBbeep\fR, \fBflash\fR - \fBcurses\fR bell and screen flash routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint beep(void);\fR
+.br
+\fBint flash(void);\fR
+.br
+.SH DESCRIPTION
+The \fBbeep\fR and \fBflash\fR routines are used to alert the terminal user.
+The routine \fBbeep\fR sounds an audible alarm on the terminal, if possible;
+otherwise it flashes the screen (visible bell). The routine \fBflash\fR
+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\fR if they succeed in beeping or flashing,
+\fBERR\fR otherwise.
+.SH EXTENSIONS
+SVr4's beep and flash routines always returned \fBOK\fR, so it was not
+possible to tell when the beep or flash failed.
+.SH PORTABILITY
+These functions are defined in the XSI Curses standard, Issue 4. Like SVr4, it
+specifies that they always return \fBOK\fR.
+.SH SEE ALSO
+\fBcurses\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_bkgd.3x b/contrib/ncurses/man/curs_bkgd.3x
new file mode 100644
index 000000000000..a25699976561
--- /dev/null
+++ b/contrib/ncurses/man/curs_bkgd.3x
@@ -0,0 +1,101 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_bkgd.3x,v 1.12 1998/03/14 23:43:31 tom Exp $
+.TH curs_bkgd 3X ""
+.SH NAME
+\fBbkgdset\fR, \fBwbkgdset\fR, \fBbkgd\fR,
+\fBwbkgd\fR - \fBcurses\fR window background manipulation routines
+..
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBvoid bkgdset(const chtype ch);\fR
+.br
+\fBvoid wbkgdset(WINDOW *win, const chtype ch);\fR
+.br
+\fBint bkgd(const chtype ch);\fR
+.br
+\fBint wbkgd(WINDOW *win, const chtype ch);\fR
+.br
+\fBchtype getbkgd(WINDOW *win);\fR
+.br
+..
+.SH DESCRIPTION
+The \fBbkgdset\fR and \fBwbkgdset\fR routines manipulate the
+background of the named window.
+The window background is a \fBchtype\fR consisting of
+any combination of attributes (i.e., rendition) and a character.
+The attribute part of the background is combined (OR'ed) with all non-blank
+characters that are written into the window with \fBwaddch\fR. 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.
+
+The \fBbkgd\fR and \fBwbkgd\fR functions
+set the background property of the current or specified window
+and then apply this setting to every character position in that window:
+
+.RS
+The rendition of every character on the screen is changed to
+the new background rendition.
+
+Wherever the former background character
+appears, it is changed to the new background character.
+.RE
+
+The \fBgetbkgd\fR function returns the given window's current background
+character/attribute pair.
+..
+.SH RETURN VALUE
+The routines \fBbkgd\fR and \fBwbkgd\fR return the integer \fBOK\fR.
+The SVr4.0 manual says "or a non-negative integer if \fBimmedok\fR is set",
+but this appears to be an error.
+..
+.SH NOTES
+Note that \fBbkgdset\fR and \fBbkgd\fR may be macros.
+..
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. The draft
+does not include \fBconst\fR qualifiers on the arguments. The standard
+specifies that \fBbkgd\fR and \fBwbkgd\fR return \fBERR\fR, on failure. but
+gives no failure conditions.
+..
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_addch\fR(3X), \fBcurs_outopts\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_border.3x b/contrib/ncurses/man/curs_border.3x
new file mode 100644
index 000000000000..45200eb15cb8
--- /dev/null
+++ b/contrib/ncurses/man/curs_border.3x
@@ -0,0 +1,108 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_border.3x,v 1.11 1999/01/30 23:11:47 tom Exp $
+.TH curs_border 3X ""
+.SH NAME
+\fBborder\fR, \fBwborder\fR, \fBbox\fR,
+\fBhline\fR, \fBwhline\fR, \fBvline\fR, \fBwvline\fR - create
+\fBcurses\fR borders, horizontal and vertical lines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+.br
+\fBint border(chtype ls, chtype rs, chtype ts, chtype bs,\fR
+ \fBchtype tl, chtype tr, chtype bl, chtype br);\fR
+.br
+\fBint wborder(WINDOW *win, chtype ls, chtype rs,\fR
+ \fBchtype ts, chtype bs, chtype tl, chtype tr,\fR
+ \fBchtype bl, chtype br);\fR
+.br
+\fBint box(WINDOW *win, chtype verch, chtype horch);\fR
+.br
+\fBint hline(chtype ch, int n);\fR
+.br
+\fBint whline(WINDOW *win, chtype ch, int n);\fR
+.br
+\fBint vline(chtype ch, int n);\fR
+.br
+\fBint wvline(WINDOW *win, chtype ch, int n);\fR
+.br
+\fBmvhline(int y, int x, chtype ch, int n);\fR
+.br
+\fBmvwhline(WINDOW *, int y, int x, chtype ch, int n);\fR
+.br
+\fBint mvvline(int y, int x, chtype ch, int n);\fR
+.br
+\fBint mvwvline(WINDOW *, int y, int x, chtype ch, int n);\fR
+.br
+.SH DESCRIPTION
+The \fBborder\fR, \fBwborder\fR and \fBbox\fR routines draw a box around the
+edges of a window. The argument \fIls\fR is a character and attributes used
+for the left side of the border, \fIrs\fR - right side, \fIts\fR - top side,
+\fIbs\fR - bottom side, \fItl\fR - top left-hand corner, \fItr\fR - top
+right-hand corner, \fIbl\fR - bottom left-hand corner, and \fIbr\fR - bottom
+right-hand corner. If any of these arguments is zero, then the following
+default values (defined in \fBcurses.h\fR) are used instead: \fBACS_VLINE\fR,
+\fBACS_VLINE\fR, \fBACS_HLINE\fR, \fBACS_HLINE\fR, \fB\fBACS_ULCORNER\fR,
+\fBACS_URCORNER\fR, \fBACS_LLCORNER\fR, \fBACS_LRCORNER\fR.
+
+\fBbox(\fR\fIwin\fR\fB, \fR\fIverch\fR\fB, \fR\fIhorch\fR\fB)\fR is a shorthand
+for the following call: \fBwborder(\fR\fIwin\fR\fB,\fR \fIverch\fR\fB,\fR
+\fIverch\fR\fB,\fR \fIhorch\fR\fB,\fR \fIhorch\fR\fB, 0, 0, 0, 0)\fR.
+
+The \fBhline\fR and \fBwhline\fR functions draw a horizontal (left to right)
+line using \fIch\fR starting at the current cursor position in the window. The
+current cursor position is not changed. The line is at most \fIn\fR characters
+long, or as many as fit into the window.
+
+The \fBvline\fR and \fBwvline\fR functions draw a vertical (top to bottom) line
+using \fIch\fR starting at the current cursor position in the window. The
+current cursor position is not changed. The line is at most \fIn\fR characters
+long, or as many as fit into the window.
+.SH RETURN VALUE
+All routines return the integer \fBOK\fR. The SVr4.0 manual says "or a
+non-negative integer if \fBimmedok\fR is set", but this appears to be an error.
+.SH NOTES
+The borders generated by these functions are \fIinside\fR borders (this
+is also true of SVr4 curses, though the fact is not documented).
+
+Note that \fBborder\fR and \fBbox\fR may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. Additional
+functions \fBmvhline\fR, \fBmvvline\fR, \fBmvwhline\fR, and \fBmvwvline\fR are
+described there which this implementation does not yet support. The standard
+specifies that they return \fBERR\fR on failure, but specifies no error
+conditions.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_outopts\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_clear.3x b/contrib/ncurses/man/curs_clear.3x
new file mode 100644
index 000000000000..d08e852a27b1
--- /dev/null
+++ b/contrib/ncurses/man/curs_clear.3x
@@ -0,0 +1,94 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_clear.3x,v 1.7 1998/03/11 21:12:53 juergen Exp $
+.TH curs_clear 3X ""
+.SH NAME
+\fBerase\fR, \fBwerase\fR, \fBclear\fR,
+\fBwclear\fR, \fBclrtobot\fR, \fBwclrtobot\fR, \fBclrtoeol\fR,
+\fBwclrtoeol\fR - clear all or part of a \fBcurses\fR window
+.SH SYNOPSIS
+\fB# include <curses.h>\fR
+
+\fBint erase(void);\fR
+.br
+\fBint werase(WINDOW *win);\fR
+.br
+\fBint clear(void);\fR
+.br
+\fBint wclear(WINDOW *win);\fR
+.br
+\fBint clrtobot(void);\fR
+.br
+\fBint wclrtobot(WINDOW *win);\fR
+.br
+\fBint clrtoeol(void);\fR
+.br
+\fBint wclrtoeol(WINDOW *win);\fR
+.br
+.SH DESCRIPTION
+The \fBerase\fR and \fBwerase\fR routines copy blanks to every
+position in the window, clearing the screen.
+
+The \fBclear\fR and \fBwclear\fR routines are like \fBerase\fR and
+\fBwerase\fR, but they also call \fBclearok\fR, so that the screen is
+cleared completely on the next call to \fBwrefresh\fR for that window
+and repainted from scratch.
+
+The \fBclrtobot\fR and \fBwclrtobot\fR 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.
+
+The \fBclrtoeol\fR and \fBwclrtoeol\fR routines erase the current line
+to the right of the cursor, inclusive, to the end of the current line.
+
+Blanks created by erasure have the current background rendition (as set
+by \fBwbkgdset\fR) merged into them.
+.SH RETURN VALUE
+All routines return the integer \fBOK\fR. The SVr4.0 manual says "or a
+non-negative integer if \fBimmedok\fR is set", but this appears to be an error.
+.SH NOTES
+Note that \fBerase\fR, \fBwerase\fR, \fBclear\fR, \fBwclear\fR,
+\fBclrtobot\fR, and \fBclrtoeol\fR may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. The
+standard specifies that they return \fBERR\fR on failure, but specifies no
+error conditions.
+
+Some historic curses implementations had, as an undocumented feature, the
+ability to do the equivalent of \fBclearok(..., 1)\fR by saying
+\fBtouchwin(stdscr)\fR or \fBclear(stdscr)\fR. This will not work under
+ncurses.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_outopts\fR(3X), \fBcurs_refresh\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_color.3x b/contrib/ncurses/man/curs_color.3x
new file mode 100644
index 000000000000..03cbba6349e6
--- /dev/null
+++ b/contrib/ncurses/man/curs_color.3x
@@ -0,0 +1,190 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_color.3x,v 1.10 1998/03/11 21:12:53 juergen Exp $
+.TH curs_color 3X ""
+.SH NAME
+\fBstart_color\fR, \fBinit_pair\fR,
+\fBinit_color\fR, \fBhas_colors\fR, \fBcan_change_color\fR,
+\fBcolor_content\fR, \fBpair_content\fR - \fBcurses\fR color
+manipulation routines
+.SH SYNOPSIS
+\fB# include <curses.h>\fR
+.br
+\fBint start_color(void);\fR
+.br
+\fBint init_pair(short pair, short f, short b);\fR
+.br
+\fBint init_color(short color, short r, short g, short b);\fR
+.br
+\fBbool has_colors(void);\fR
+.br
+\fBbool can_change_color(void);\fR
+.br
+\fBint color_content(short color, short *r, short *g, short *b);\fR
+.br
+\fBint pair_content(short pair, short *f, short *b);\fR
+.br
+.SH DESCRIPTION
+.SS Overview
+\fBcurses\fR support color attributes on terminals with that capability. To
+use these routines \fBstart_color\fR must be called, usually right after
+\fBinitscr\fR. 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\fR. After it
+has been initialized, \fBCOLOR_PAIR\fR(\fIn\fR), a macro defined in
+\fB<curses.h>\fR, can be used as a new video attribute.
+
+If a terminal is capable of redefining colors, the programmer can use the
+routine \fBinit_color\fR to change the definition of a color. The routines
+\fBhas_colors\fR and \fBcan_change_color\fR return \fBTRUE\fR or \fBFALSE\fR,
+depending on whether the terminal has color capabilities and whether the
+programmer can change the colors. The routine \fBcolor_content\fR allows a
+programmer to extract the amounts of red, green, and blue components in an
+initialized color. The routine \fBpair_content\fR allows a programmer to find
+out how a given color-pair is currently defined.
+.SS Routine Descriptions
+The \fBstart_color\fR 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\fR. \fBstart_color\fR initializes
+eight basic colors (black, red, green, yellow, blue, magenta, cyan,
+and white), and two global variables, \fBCOLORS\fR and
+\fBCOLOR_PAIRS\fR (respectively defining the maximum number of colors
+and color-pairs the terminal can support). It also restores the
+colors on the terminal to the values they had when the terminal was
+just turned on.
+
+The \fBinit_pair\fR 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. The value of the first argument
+must be between \fB1\fR and \fBCOLOR_PAIRS-1\fR. The value of the second and
+third arguments must be between 0 and \fBCOLORS\fR (the 0 color pair is wired
+to white on black and cannot be changed). If the color-pair was previously
+initialized, the screen is refreshed and all occurrences of that color-pair is
+changed to the new definition.
+
+The \fBinit_color\fR 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). The value of the first
+argument must be between \fB0\fR and \fBCOLORS\fR. (See the section
+\fBColors\fR for the default color index.) Each of the last three arguments
+must be a value between 0 and 1000. When \fBinit_color\fR is used, all
+occurrences of that color on the screen immediately change to the new
+definition.
+
+The \fBhas_colors\fR routine requires no arguments. It returns \fBTRUE\fR if
+the terminal can manipulate colors; otherwise, it returns \fBFALSE\fR. 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.
+
+The \fBcan_change_color\fR routine requires no arguments. It returns
+\fBTRUE\fR if the terminal supports colors and can change their definitions;
+other, it returns \fBFALSE\fR. This routine facilitates writing
+terminal-independent programs.
+
+The \fBcolor_content\fR 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. The value of the first argument must be between 0 and
+\fBCOLORS\fR. The values that are stored at the addresses pointed to by the
+last three arguments are between 0 (no component) and 1000 (maximum amount of
+component).
+
+The \fBpair_content\fR 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. The value of the first argument must be between 1
+and \fBCOLOR_PAIRS-1\fR. The values that are stored at the addresses pointed
+to by the second and third arguments are between 0 and \fBCOLORS\fR.
+.SS Colors
+In \fB<curses.h>\fR the following macros are defined. These are the default
+colors. \fBcurses\fR also assumes that \fBCOLOR_BLACK\fR is the default
+background color for all terminals.
+
+.nf
+ \fBCOLOR_BLACK\fR
+ \fBCOLOR_RED\fR
+ \fBCOLOR_GREEN\fR
+ \fBCOLOR_YELLOW\fR
+ \fBCOLOR_BLUE\fR
+ \fBCOLOR_MAGENTA\fR
+ \fBCOLOR_CYAN\fR
+ \fBCOLOR_WHITE\fR
+.fi
+.SH RETURN VALUE
+The routines \fBcan_change_color()\fR and \fBhas_colors()\fR return \fBTRUE\fR
+or \fBFALSE\fR.
+
+All other routines return the integer \fBERR\fR upon failure and an \fBOK\fR
+(SVr4 specifies only "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH NOTES
+In the \fIncurses\fR implementation, there is a separate color activation flag,
+color palette, color pairs table, and associated COLORS and COLOR_PAIRS counts
+for each screen; the \fBstart_color\fR 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.
+
+Note that 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\fR(3X).
+
+Several caveats apply on 386 and 486 machines with VGA-compatible graphics:
+
+COLOR_YELLOW is actually brown. To get yellow, use COLOR_YELLOW combined with
+the \fBA_BOLD\fR attribute.
+
+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).
+
+Color RGB values are not settable.
+.SH PORTABILITY
+This implementation satisfies XSI Curses's minimum maximums
+for \fBCOLORS\fR and \fBCOLOR_PAIRS\fR.
+.PP
+The \fBinit_pair\fP routine accepts negative values of foreground
+and background color to support the \fBuse_default_colors\fP extension,
+but only if that routine has been first invoked.
+.SH SEE ALSO
+\fBcurses\fR(3X),
+\fBcurs_initscr\fR(3X),
+\fBcurs_attr\fR(3X),
+\fBdft_fgbg\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_delch.3x b/contrib/ncurses/man/curs_delch.3x
new file mode 100644
index 000000000000..d63d6020e3a9
--- /dev/null
+++ b/contrib/ncurses/man/curs_delch.3x
@@ -0,0 +1,68 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_delch.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_delch 3X ""
+.SH NAME
+\fBdelch\fR, \fBwdelch\fR, \fBmvdelch\fR, \fBmvwdelch\fR -
+delete character under the cursor in a \fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint delch(void);\fR
+.br
+\fBint wdelch(WINDOW *win);\fR
+.br
+\fBint mvdelch(int y, int x);\fR
+.br
+\fBint mvwdelch(WINDOW *win, int y, int x);\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\fR, \fIx\fR, if specified). (This does not
+imply use of the hardware delete character feature.)
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an \fBOK\fR (SVr4
+specifies only "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH NOTES
+Note that \fBdelch\fR, \fBmvdelch\fR, and \fBmvwdelch\fR may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. The
+standard specifies that they return \fBERR\fR on failure, but specifies no
+error conditions.
+.SH SEE ALSO
+\fBcurses\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_deleteln.3x b/contrib/ncurses/man/curs_deleteln.3x
new file mode 100644
index 000000000000..54bf331ba59e
--- /dev/null
+++ b/contrib/ncurses/man/curs_deleteln.3x
@@ -0,0 +1,84 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_deleteln.3x,v 1.5 1999/02/07 03:58:20 tom Exp $
+.TH curs_deleteln 3X ""
+.SH NAME
+\fBdeleteln\fR, \fBwdeleteln\fR, \fBinsdelln\fR,
+\fBwinsdelln\fR, \fBinsertln\fR, \fBwinsertln\fR - delete and insert
+lines in a \fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint deleteln(void);\fR
+.br
+\fBint wdeleteln(WINDOW *win);\fR
+.br
+\fBint insdelln(int n);\fR
+.br
+\fBint winsdelln(WINDOW *win, int n);\fR
+.br
+\fBint insertln(void);\fR
+.br
+\fBint winsertln(WINDOW *win);\fR
+.br
+.SH DESCRIPTION
+The \fBdeleteln\fR and \fBwdeleteln\fR 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 \fBinsdelln\fR and \fBwinsdelln\fR routines, for positive \fIn\fR, insert
+\fIn\fR lines into the specified window above the current line. The \fIn\fR
+bottom lines are lost. For negative \fIn\fR, delete \fIn\fR lines (starting
+with the one under the cursor), and move the remaining lines up. The bottom
+\fIn\fR lines are cleared. The current cursor position remains the same.
+
+The \fBinsertln\fR and \fBinsertln\fR routines, insert a blank line above the
+current line and the bottom line is lost.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an \fBOK\fR (SVr4
+specifies only "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. The
+standard specifies that they return \fBERR\fR on failure, but specifies no
+error conditions.
+.SH NOTES
+Note that all but \fBwinsdelln\fR may be macros.
+
+These routines do not require a hardware line delete or insert feature in the
+terminal. In fact, they won't use hardware line delete/insert unless
+\fBidlok(..., TRUE)\fR has been set on the current window.
+.SH SEE ALSO
+\fBcurses\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_getch.3x b/contrib/ncurses/man/curs_getch.3x
new file mode 100644
index 000000000000..0e4424618bcd
--- /dev/null
+++ b/contrib/ncurses/man/curs_getch.3x
@@ -0,0 +1,274 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_getch.3x,v 1.15 1998/11/29 01:04:26 Rick.Ohnemus Exp $
+.TH curs_getch 3X ""
+.SH NAME
+\fBgetch\fR, \fBwgetch\fR, \fBmvgetch\fR,
+\fBmvwgetch\fR, \fBungetch\fR - get (or push back) characters from
+\fBcurses\fR terminal keyboard
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint getch(void);\fR
+.br
+\fBint wgetch(WINDOW *win);\fR
+.br
+\fBint mvgetch(int y, int x);\fR
+.br
+\fBint mvwgetch(WINDOW *win, int y, int x);\fR
+.br
+\fBint ungetch(int ch);\fR
+.br
+\fBint has_key(int ch);\fR
+.br
+.SH DESCRIPTION
+The \fBgetch\fR, \fBwgetch\fR, \fBmvgetch\fR and \fBmvwgetch\fR, routines read
+a character from the window. In no-delay mode, if no input is waiting, the
+value \fBERR\fR is returned. In delay mode, the program waits until the system
+passes text through to the program. Depending on the setting of \fBcbreak\fR,
+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.
+
+If \fBnoecho\fR has been set, then the character will also be echoed into the
+designated window according to the following rules:
+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\fR had been called.
+If the character value is any other \fBKEY_\fR define, the user is alerted
+with a \fBbeep\fR call.
+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 \fBwrefresh\fR, \fBwrefresh\fR will be called before another character
+is read.
+
+If \fBkeypad\fR is \fBTRUE\fR, and a function key is pressed, the token for
+that function key is returned instead of the raw characters. Possible function
+keys are defined in \fB<curses.h>\fR as macros with values outside the range
+of 8-bit characters whose names begin with \fBKEY_.\fR 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 received
+(which, on modern terminals, means an escape character), \fBcurses\fR 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.
+
+The \fBungetch\fR routine places \fIch\fR back onto the input queue to be
+returned by the next call to \fBwgetch\fR. Note that there is, in effect,
+just one input queue for all windows.
+
+.SS Function Keys
+The following function keys, defined in \fB<curses.h>\fR, might be returned by
+\fBgetch\fR if \fBkeypad\fR has been enabled. Note that not all of these are
+necessarily supported on any particular terminal.
+.sp
+.TS
+center tab(/) ;
+l l
+l l .
+\fIName\fR/\fIKey\fR \fIname\fR
+
+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\fR)/T{
+For 0 \(<= \fIn\fR \(<= 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 read
+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 input 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_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
+
+Keypad is arranged like this:
+.sp
+.TS
+center allbox tab(/) ;
+c c c .
+\fBA1\fR/\fBup\fR/\fBA3\fR
+\fBleft\fR/\fBB2\fR/\fBright\fR
+\fBC1\fR/\fBdown\fR/\fBC3\fR
+.TE
+.sp
+The \fBhas_key\fR routine takes a key value from the above list, and
+returns TRUE or FALSE according as the current terminal type recognizes
+a key with that value.
+
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR (\fBOK\fR in the case of ungetch()) upon successful
+completion.
+.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.
+
+When using \fBgetch\fR, \fBwgetch\fR, \fBmvgetch\fR, or
+\fBmvwgetch\fR, nocbreak mode (\fBnocbreak\fR) and echo mode
+(\fBecho\fR) 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 \fBgetch\fR, \fBmvgetch\fR, and \fBmvwgetch\fR may be macros.
+
+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\fR, \fBKEY_DOWN\fR,
+\fBKEY_LEFT\fR, \fBKEY_RIGHT\fR, \fBKEY_HOME\fR, \fBKEY_END\fR,
+\fBKEY_NPAGE\fR, \fBKEY_PPAGE\fR, and function keys 1 through 12. The Ins key
+is usually mapped to \fBKEY_IC\fR.
+.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\fR on failure, but specifies no error conditions.
+
+The echo behavior of these functions on input of \fBKEY_\fR or backspace
+characters was not specified in the SVr4 documentation. This description is
+adopted from the XSI Curses standard.
+
+The behavior of \fBgetch\fR 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\fR(2) call in
+progress or not, and also (in some implementations) depending on whether an
+input timeout or non-blocking mode hsd been set.
+
+Programmers concerned about portability should be prepared for either of two
+cases: (a) signal receipt does not interrupt \fBgetch\fR; (b) signal receipt
+interrupts \fBgetch\fR and causes it to return ERR with \fBerrno\fR set to
+\fBEINTR\fR. Under the \fBncurses\fR implementation, handled signals never
+interrupt \fBgetch\fR.
+
+The \fBhas_key\fR function is unique to \fBncurses\fR. We recommend that
+any code using it be conditionalized on the \fBNCURSES_VERSION\fR feature macro.
+.SH SEE ALSO
+\fBcurses\fR(3X),
+\fBcurs_inopts\fR(3X),
+\fBcurs_mouse\fR(3X),
+\fBcurs_move\fR(3X),
+\fBcurs_refresh\fR(3X).
+\fBresizeterm\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_getstr.3x b/contrib/ncurses/man/curs_getstr.3x
new file mode 100644
index 000000000000..b3678e0a2b5a
--- /dev/null
+++ b/contrib/ncurses/man/curs_getstr.3x
@@ -0,0 +1,102 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_getstr.3x,v 1.7 1998/03/11 21:12:53 juergen Exp $
+.TH curs_getstr 3X ""
+.SH NAME
+\fBgetstr\fR, \fBwgetstr\fR, \fBmvgetstr\fR,
+\fBmvwgetstr\fR, \fBwgetnstr\fR - accept character strings from
+\fBcurses\fR terminal keyboard
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint getstr(char *str);\fR
+.br
+\fBint getnstr(char *str, int n);\fR
+.br
+\fBint wgetstr(WINDOW *win, char *str);\fR
+.br
+\fBint mvgetstr(int y, int x, char *str);\fR
+.br
+\fBint mvwgetstr(WINDOW *win, int y, int x, char *str);\fR
+.br
+\fBint mvgetnstr(int y, int x, char *str, int n);\fR
+.br
+\fBint mvwgetnstr(WINDOW *, int y, int x, char *str, int n);\fR
+.br
+\fBint wgetnstr(WINDOW *win, char *str, int n);\fR
+.br
+.SH DESCRIPTION
+The function \fBgetstr\fR is equivalent to a series of calls to \fBgetch\fR,
+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 \fIstr\fR.
+
+\fBwgetnstr\fR reads at most \fIn\fR 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 \fBgetnstr\fR function reads
+from the \fIstdscr\fR default window.
+
+The user's erase and kill characters are interpreted. If keypad
+mode is on for the window, \fBKEY_LEFT\fR and \fBKEY_BACKSPACE\fR
+are both considered equivalent to the user's kill character.
+
+Characters input are echoed only if \fBecho\fR 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\fR upon failure and an \fBOK\fR (SVr4
+specifies only "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH NOTES
+Note that \fBgetstr\fR, \fBmvgetstr\fR, and \fBmvwgetstr\fR may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. They read
+single-byte characters only. The standard specifies that they return \fBERR\fR
+on failure, but the single error condition \fBEOVERFLOW\fR associated with
+extended-level conformance is not yet returned (the XSI curses support for
+multi-byte characters is not yet present).
+
+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\fR.) 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).
+
+The functions \fBgetnstr\fR, \fBmvgetnstr\fR, and \fBmvwgetnstr\fR were
+present but not documented in SVr4.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_getch\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_getyx.3x b/contrib/ncurses/man/curs_getyx.3x
new file mode 100644
index 000000000000..820bf99c5327
--- /dev/null
+++ b/contrib/ncurses/man/curs_getyx.3x
@@ -0,0 +1,72 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_getyx.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_getyx 3X ""
+.SH NAME
+\fBgetyx\fR, \fBgetparyx\fR, \fBgetbegyx\fR,
+\fBgetmaxyx\fR - get \fBcurses\fR cursor and window coordinates
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBvoid getyx(WINDOW *win, int y, int x);\fR
+.br
+\fBvoid getparyx(WINDOW *win, int y, int x);\fR
+.br
+\fBvoid getbegyx(WINDOW *win, int y, int x);\fR
+.br
+\fBvoid getmaxyx(WINDOW *win, int y, int x);\fR
+.br
+.SH DESCRIPTION
+The \fBgetyx\fR macro places the current cursor position of the given window in
+the two integer variables \fIy\fR and \fIx\fR.
+
+If \fIwin\fR is a subwindow, the \fBgetparyx\fR macro places the beginning
+coordinates of the subwindow relative to the parent window into two integer
+variables \fIy\fR and \fIx\fR. Otherwise, \fB-1\fR is placed into \fIy\fR and
+\fIx\fR.
+
+Like \fBgetyx\fR, the \fBgetbegyx\fR and \fBgetmaxyx\fR macros store
+the current beginning coordinates and size of the specified window.
+.SH RETURN VALUE
+The return values of these macros are undefined (\fIi\fR.\fIe\fR.,
+they should not be used as the right-hand side of assignment
+statements).
+.SH NOTES
+All of these interfaces are macros and that "\fB&\fR" is not
+necessary before the variables \fIy\fR and \fIx\fR.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_inch.3x b/contrib/ncurses/man/curs_inch.3x
new file mode 100644
index 000000000000..bcc8d6f85c60
--- /dev/null
+++ b/contrib/ncurses/man/curs_inch.3x
@@ -0,0 +1,73 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_inch.3x,v 1.11 1998/11/29 01:04:34 Rick.Ohnemus Exp $
+.TH curs_inch 3X ""
+.SH NAME
+\fBinch\fR, \fBwinch\fR, \fBmvinch\fR, \fBmvwinch\fR
+- get a character and attributes from a \fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBchtype inch(void);\fR
+.br
+\fBchtype winch(WINDOW *win);\fR
+.br
+\fBchtype mvinch(int y, int x);\fR
+.br
+\fBchtype mvwinch(WINDOW *win, int y, int x);\fR
+.br
+.SH DESCRIPTION
+These routines return the character, of type \fBchtype\fR, 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>\fR can be used with the \fB&\fR (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\fR.
+
+.TS
+l l .
+\fBA_CHARTEXT\fR Bit-mask to extract character
+\fBA_ATTRIBUTES\fR Bit-mask to extract attributes
+\fBA_COLOR\fR Bit-mask to extract color-pair field information
+.TE
+.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\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_inchstr.3x b/contrib/ncurses/man/curs_inchstr.3x
new file mode 100644
index 000000000000..dfe7bf48191a
--- /dev/null
+++ b/contrib/ncurses/man/curs_inchstr.3x
@@ -0,0 +1,84 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_inchstr.3x,v 1.7 1998/03/11 21:12:53 juergen Exp $
+.TH curs_inchstr 3X ""
+.SH NAME
+\fBinchstr\fR, \fBinchnstr\fR, \fBwinchstr\fR,
+\fBwinchnstr\fR, \fBmvinchstr\fR, \fBmvinchnstr\fR, \fBmvwinchstr\fR,
+\fBmvwinchnstr\fR - get a string of characters (and attributes) from a
+\fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint inchstr(chtype *chstr);\fR
+.br
+\fBint inchnstr(chtype *chstr, int n);\fR
+.br
+\fBint winchstr(WINDOW *win, chtype *chstr);\fR
+.br
+\fBint winchnstr(WINDOW *win, chtype *chstr, int n);\fR
+.br
+\fBint mvinchstr(int y, int x, chtype *chstr);\fR
+.br
+\fBint mvinchnstr(int y, int x, chtype *chstr, int n);\fR
+.br
+\fBint mvwinchstr(WINDOW *win, int y, int x, chtype *chstr);\fR
+.br
+\fBint mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n);\fR
+.br
+.SH DESCRIPTION
+These routines return a NULL-terminated array of \fBchtype\fR 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\fR as
+the last argument, return a leading substring at most \fIn\fR characters long
+(exclusive of the trailing (chtype)0).
+Constants defined in \fB<curses.h>\fR can be used with the \fB&\fR (logical
+AND) operator to extract the character or the attribute alone from any position
+in the \fIchstr\fR [see \fBcurs_inch\fR(3X)].
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion (the number of characters
+retrieved, exclusive of the trailing 0).
+.SH NOTES
+Note that all routines except \fBwinchnstr\fR may be macros. SVr4 does not
+document whether the result string is 0-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\fR.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_inch\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_initscr.3x b/contrib/ncurses/man/curs_initscr.3x
new file mode 100644
index 000000000000..a8651fde5d2e
--- /dev/null
+++ b/contrib/ncurses/man/curs_initscr.3x
@@ -0,0 +1,116 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_initscr.3x,v 1.7 1998/03/11 21:12:53 juergen Exp $
+.TH curs_initscr 3X ""
+.SH NAME
+\fBinitscr\fR, \fBnewterm\fR, \fBendwin\fR,
+\fBisendwin\fR, \fBset_term\fR, \fBdelscreen\fR - \fBcurses\fR screen
+initialization and manipulation routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBWINDOW *initscr(void);\fR
+.br
+\fBint endwin(void);\fR
+.br
+\fBint isendwin(void);\fR
+.br
+\fBSCREEN *newterm(const char *type, FILE *outfd, FILE *infd);\fR
+.br
+\fBSCREEN *set_term(SCREEN *new);\fR
+.br
+\fBvoid delscreen(SCREEN* sp);\fR
+.br
+.SH DESCRIPTION
+\fBinitscr\fR is normally the first \fBcurses\fR routine to call when
+initializing a program. A few special routines sometimes need to be
+called before it; these are \fBslk_init\fR, \fBfilter\fR, \fBripoffline\fR,
+\fBuse_env\fR. For multiple-terminal applications, \fBnewterm\fR may be
+called before \fBinitscr\fR.
+
+The initscr code determines the terminal type and initializes all \fBcurses\fR
+data structures. \fBinitscr\fR also causes the first call to \fBrefresh\fR to
+clear the screen. If errors occur, \fBinitscr\fR writes an appropriate error
+message to standard error and exits; otherwise, a pointer is returned to
+\fBstdscr\fR.
+
+A program that outputs to more than one terminal should use the \fBnewterm\fR
+routine for each terminal instead of \fBinitscr\fR. 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\fR. The routine \fBnewterm\fR should be called once for each
+terminal. It returns a variable of type \fBSCREEN *\fR which should be saved
+as a reference to that terminal. The arguments are the \fItype\fR of the
+terminal to be used in place of \fB$TERM\fR, a file pointer for output to the
+terminal, and another file pointer for input from the terminal (if \fItype\fR
+is \fBNULL\fR, \fB$TERM\fR will be used). The program must also call
+\fBendwin\fR for each terminal being used before exiting from \fBcurses\fR.
+If \fBnewterm\fR is called more than once for the same terminal, the first
+terminal referred to must be the last one for which \fBendwin\fR is called.
+
+A program should always call \fBendwin\fR before exiting or escaping from
+\fBcurses\fR mode temporarily. This routine restores tty modes, moves the
+cursor to the lower left-hand corner of the screen and resets the terminal into
+the proper non-visual mode. Calling \fBrefresh\fR or \fBdoupdate\fR after a
+temporary escape causes the program to resume visual mode.
+
+The \fBisendwin\fR routine returns \fBTRUE\fR if \fBendwin\fR has been
+called without any subsequent calls to \fBwrefresh\fR, and \fBFALSE\fR
+otherwise.
+
+The \fBset_term\fR routine is used to switch between different
+terminals. The screen reference \fBnew\fR becomes the new current
+terminal. The previous terminal is returned by the routine. This is
+the only routine which manipulates \fBSCREEN\fR pointers; all other
+routines affect only the current terminal.
+
+The \fBdelscreen\fR routine frees storage associated with the
+\fBSCREEN\fR data structure. The \fBendwin\fR routine does not do
+this, so \fBdelscreen\fR should be called after \fBendwin\fR if a
+particular \fBSCREEN\fR is no longer needed.
+.SH RETURN VALUE
+\fBendwin\fR returns the integer \fBERR\fR upon failure and \fBOK\fR
+upon successful completion.
+
+Routines that return pointers always return \fBNULL\fR on error.
+.SH NOTES
+Note that \fBinitscr\fR and \fBnewterm\fR may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. It
+specifies that portable applications must not call \fBinitscr\fR more than
+once.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_kernel\fR(3X), \fBcurs_refresh\fR(3X),
+\fBcurs_slk\fR(3X), \fBcurs_util\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_inopts.3x b/contrib/ncurses/man/curs_inopts.3x
new file mode 100644
index 000000000000..1fc6a820a603
--- /dev/null
+++ b/contrib/ncurses/man/curs_inopts.3x
@@ -0,0 +1,214 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_inopts.3x,v 1.8 1998/03/11 21:12:53 juergen Exp $
+.TH curs_inopts 3X ""
+.SH NAME
+\fBcbreak\fR, \fBnocbreak\fR, \fBecho\fR,
+\fBnoecho\fR, \fBhalfdelay\fR, \fBintrflush\fR, \fBkeypad\fR,
+\fBmeta\fR, \fBnodelay\fR, \fBnotimeout\fR, \fBraw\fR, \fBnoraw\fR,
+\fBnoqiflush\fR, \fBqiflush\fR, \fBtimeout\fR, \fBwtimeout\fR,
+\fBtypeahead\fR - \fBcurses\fR input options
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint cbreak(void);\fR
+.br
+\fBint nocbreak(void);\fR
+.br
+\fBint echo(void);\fR
+.br
+\fBint noecho(void);\fR
+.br
+\fBint halfdelay(int tenths);\fR
+.br
+\fBint intrflush(WINDOW *win, bool bf);\fR
+.br
+\fBint keypad(WINDOW *win, bool bf);\fR
+.br
+\fBint meta(WINDOW *win, bool bf);\fR
+.br
+\fBint nodelay(WINDOW *win, bool bf);\fR
+.br
+\fBint raw(void);\fR
+.br
+\fBint noraw(void);\fR
+.br
+\fBvoid noqiflush(void);\fR
+.br
+\fBvoid qiflush(void);\fR
+.br
+\fBint notimeout(WINDOW *win, bool bf);\fR
+.br
+\fBvoid timeout(int delay);\fR
+.br
+\fBvoid wtimeout(WINDOW *win, int delay);\fR
+.br
+\fBint typeahead(int fd);\fR
+.br
+.SH DESCRIPTION
+Normally, the tty driver buffers typed characters until a newline or carriage
+return is typed. The \fBcbreak\fR 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\fR routine returns the terminal to normal (cooked)
+mode.
+
+Initially the terminal may or may not be in \fBcbreak\fR mode, as the mode is
+inherited; therefore, a program should call \fBcbreak\fR or \fBnocbreak\fR
+explicitly. Most interactive programs using \fBcurses\fR set the \fBcbreak\fR
+mode. Note that \fBcbreak\fR overrides \fBraw\fR.
+[See \fBcurs_getch\fR(3X) for a
+discussion of how these routines interact with \fBecho\fR and \fBnoecho\fR.]
+
+The \fBecho\fR and \fBnoecho\fR routines control whether characters typed by
+the user are echoed by \fBgetch\fR as they are typed. Echoing by the tty
+driver is always disabled, but initially \fBgetch\fR 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\fR.
+[See \fBcurs_getch\fR(3X) for a
+discussion of how these routines interact with \fBcbreak\fR and
+\fBnocbreak\fR.]
+
+The \fBhalfdelay\fR routine is used for half-delay mode, which is similar to
+\fBcbreak\fR mode in that characters typed by the user are immediately
+available to the program. However, after blocking for \fItenths\fR tenths of
+seconds, ERR is returned if nothing has been typed. The value of \fBtenths\fR
+must be a number between 1 and 255. Use \fBnocbreak\fR to leave half-delay
+mode.
+
+If the \fBintrflush\fR option is enabled, (\fIbf\fR is \fBTRUE\fR), when 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\fR to have the wrong idea of what is on
+the screen. Disabling (\fIbf\fR is \fBFALSE\fR), the option prevents the
+flush. The default for the option is inherited from the tty driver settings.
+The window argument is ignored.
+
+The \fBkeypad\fR option enables the keypad of the user's terminal. If
+enabled (\fIbf\fR is \fBTRUE\fR), the user can press a function key
+(such as an arrow key) and \fBwgetch\fR returns a single value
+representing the function key, as in \fBKEY_LEFT\fR. If disabled
+(\fIbf\fR is \fBFALSE\fR), \fBcurses\fR 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\fR is
+called. The default value for keypad is false.
+
+Initially, whether the terminal returns 7 or 8 significant bits on
+input depends on the control mode of the tty driver [see termio(7)].
+To force 8 bits to be returned, invoke \fBmeta\fR(\fIwin\fR,
+\fBTRUE\fR); this is equivalent, under POSIX, to setting the CS8 flag
+on the terminal. To force 7 bits to be returned, invoke
+\fBmeta\fR(\fIwin\fR, \fBFALSE\fR); this is equivalent, under POSIX,
+to setting the CS8 flag on the terminal. The window argument,
+\fIwin\fR, is always ignored. If the terminfo capabilities \fBsmm\fR
+(meta_on) and \fBrmm\fR (meta_off) are defined for the terminal,
+\fBsmm\fR is sent to the terminal when \fBmeta\fR(\fIwin\fR,
+\fBTRUE\fR) is called and \fBrmm\fR is sent when \fBmeta\fR(\fIwin\fR,
+\fBFALSE\fR) is called.
+
+The \fBnodelay\fR option causes \fBgetch\fR to be a non-blocking call.
+If no input is ready, \fBgetch\fR returns \fBERR\fR. If disabled
+(\fIbf\fR is \fBFALSE\fR), \fBgetch\fR waits until a key is pressed.
+
+While interpreting an input escape sequence, \fBwgetch\fR sets a timer
+while waiting for the next character. If \fBnotimeout(\fR\fIwin\fR,
+\fBTRUE\fR) is called, then \fBwgetch\fR 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.
+
+The \fBraw\fR and \fBnoraw\fR routines place the terminal into or out of raw
+mode. Raw mode is similar to \fBcbreak\fR 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\fR.
+
+When the \fBnoqiflush\fR routine is used, normal flush of input and
+output queues associated with the \fBINTR\fR, \fBQUIT\fR and
+\fBSUSP\fR characters will not be done [see termio(7)]. When
+\fBqiflush\fR is called, the queues will be flushed when these control
+characters are read. You may want to call \fBnoqiflush()\fR in a signal
+handler if you want output to continue as though the interrupt
+had not occurred, after the handler exits.
+
+The \fBtimeout\fR and \fBwtimeout\fR routines set blocking or
+non-blocking read for a given window. If \fIdelay\fR is negative,
+blocking read is used (\fIi\fR.\fIe\fR., waits indefinitely for
+input). If \fIdelay\fR is zero, then non-blocking read is used
+(\fIi\fR.\fIe\fR., read returns \fBERR\fR if no input is waiting). If
+\fIdelay\fR is positive, then read blocks for \fIdelay\fR
+milliseconds, and returns \fBERR\fR if there is still no input.
+Hence, these routines provide the same functionality as \fBnodelay\fR,
+plus the additional capability of being able to block for only
+\fIdelay\fR milliseconds (where \fIdelay\fR is positive).
+
+The \fBcurses\fR 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\fR or \fBdoupdate\fR is called again. This allows faster
+response to commands typed in advance. Normally, the input FILE
+pointer passed to \fBnewterm\fR, or \fBstdin\fR in the case that
+\fBinitscr\fR was used, will be used to do this typeahead checking.
+The \fBtypeahead\fR routine specifies that the file descriptor
+\fIfd\fR is to be used to check for typeahead instead. If \fIfd\fR is
+-1, then no typeahead checking is done.
+.SH RETURN VALUE
+All routines that return an integer return \fBERR\fR upon failure and OK (SVr4
+specifies only "an integer value other than \fBERR\fR") upon successful
+completion, unless otherwise noted in the preceding routine descriptions.
+.SH PORTABILITY
+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&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\fR call turned it
+off as a side-effect. For best portability, set echo or noecho explicitly
+just after initialization, even if your program remains in cooked mode.
+.SH NOTES
+Note that \fBecho\fR, \fBnoecho\fR, \fBhalfdelay\fR, \fBintrflush\fR,
+\fBmeta\fR, \fBnodelay\fR, \fBnotimeout\fR, \fBnoqiflush\fR,
+\fBqiflush\fR, \fBtimeout\fR, and \fBwtimeout\fR may be macros.
+
+The \fBnoraw\fR and \fBnocbreak\fR 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\fR(3X), \fBcurs_getch\fR(3X), \fBcurs_initscr\fR(3X), \fBtermio\fR(7)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_insch.3x b/contrib/ncurses/man/curs_insch.3x
new file mode 100644
index 000000000000..5c3c3410465e
--- /dev/null
+++ b/contrib/ncurses/man/curs_insch.3x
@@ -0,0 +1,68 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_insch.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_insch 3X ""
+.SH NAME
+\fBinsch\fR, \fBwinsch\fR, \fBmvinsch\fR, \fBmvwinsch\fR -
+insert a character before cursor in a \fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint insch(chtype ch);\fR
+.br
+\fBint winsch(WINDOW *win, chtype ch);\fR
+.br
+\fBint mvinsch(int y, int x, chtype ch);\fR
+.br
+\fBint mvwinsch(WINDOW *win, int y, int x, chtype ch);\fR
+.br
+.SH DESCRIPTION
+These routines, insert the character \fIch\fR 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\fR upon failure and OK (SVr4
+specifies only "an integer value other than \fBERR\fR") upon successful
+completion, unless otherwise noted in the preceding routine descriptions.
+.SH NOTES
+These routines do not necessarily imply use of a hardware insert character
+feature.
+
+Note that \fBinsch\fR, \fBmvinsch\fR, and \fBmvwinsch\fR may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+.SH SEE ALSO
+\fBcurses\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_insstr.3x b/contrib/ncurses/man/curs_insstr.3x
new file mode 100644
index 000000000000..955ac8df6397
--- /dev/null
+++ b/contrib/ncurses/man/curs_insstr.3x
@@ -0,0 +1,90 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_insstr.3x,v 1.10 1998/07/25 20:32:57 Todd.Miller Exp $
+.TH curs_insstr 3X ""
+.SH NAME
+\fBinsstr\fR, \fBinsnstr\fR, \fBwinsstr\fR, \fBwinsnstr\fR,
+\fBmvinsstr\fR, \fBmvinsnstr\fR, \fBmvwinsstr\fR, \fBmvwinsnstr\fR - insert
+string before cursor in a \fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+.br
+\fBint insstr(const char *str);\fR
+.br
+\fBint insnstr(const char *str, int n);\fR
+.br
+\fBint winsstr(WINDOW *win, const char *str);\fR
+.br
+\fBint winsnstr(WINDOW *win, const char *str, int n);\fR
+.br
+\fBint mvinsstr(int y, int x, const char *str);\fR
+.br
+\fBint mvinsnstr(int y, int x, const char *str, int n);\fR
+.br
+\fBint mvwinsstr(WINDOW *win, int y, int x, const char *str);\fR
+.br
+\fBint mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n);\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\fR, \fIx\fR, if specified). The four routines with \fIn\fR as the last
+argument insert a leading substring of at most \fIn\fR characters. If
+\fIn\fR<=0, then the entire string is inserted.
+
+If a character in \fIstr\fR is a tab, newline, carriage return or
+backspace, the cursor is moved appropriately within the window. A
+newline also does a \fBclrtoeol\fR before moving. Tabs are considered
+to be at every eighth column. If a character in \fIstr\fR is another
+control character, it is drawn in the \fB^\fR\fIX\fR notation.
+Calling \fBwinch\fR 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 RETURN VALUE
+All routines that return an integer return \fBERR\fR upon failure and OK (SVr4
+specifies only "an integer value other than \fBERR\fR") upon successful
+completion, unless otherwise noted in the preceding routine descriptions.
+.SH NOTES
+Note that all but \fBwinsnstr\fR may be macros.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4, which adds
+const qualifiers to the arguments. The XSI Curses error conditions
+\fBEILSEQ\fR and \fBEILOVERFLOW\fR associated with extended-level conformance
+are not yet detected (this implementation does not yet support XPG4 multi-byte
+characters).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_clear\fR(3X), \fBcurs_inch\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_instr.3x b/contrib/ncurses/man/curs_instr.3x
new file mode 100644
index 000000000000..d3a7e6f7d085
--- /dev/null
+++ b/contrib/ncurses/man/curs_instr.3x
@@ -0,0 +1,84 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_instr.3x,v 1.8 1998/03/11 21:12:53 juergen Exp $
+.TH curs_instr 3X ""
+.SH NAME
+\fBinstr\fR, \fBinnstr\fR, \fBwinstr\fR, \fBwinnstr\fR,
+\fBmvinstr\fR, \fBmvinnstr\fR, \fBmvwinstr\fR, \fBmvwinnstr\fR - get a string
+of characters from a \fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint instr(char *str);\fR
+.br
+\fBint innstr(char *str, int n);\fR
+.br
+\fBint winstr(WINDOW *win, char *str);\fR
+.br
+\fBint winnstr(WINDOW *win, char *str, int n);\fR
+.br
+\fBint mvinstr(int y, int x, char *str);\fR
+.br
+\fBint mvinnstr(int y, int x, char *str, int n);\fR
+.br
+\fBint mvwinstr(WINDOW *win, int y, int x, char *str);\fR
+.br
+\fBint mvwinnstr(WINDOW *win, int y, int x, char *str, int n);\fR
+.br
+.SH DESCRIPTION
+These routines return a string of characters in \fIstr\fR, extracted starting
+at the current cursor position in the named window.
+Attributes are stripped from the characters. The four
+functions with \fIn\fR as the last argument return a leading substring at most
+\fIn\fR characters long (exclusive of the trailing NUL).
+.SH RETURN VALUE
+All of the functions return \fBERR\fR upon failure,
+or the number of characters actually read into the string.
+.SH NOTES
+Note that all routines except \fBwinnstr\fR may be macros.
+.SH PORTABILITY
+The XSI Curses
+error conditions \fBEILSEQ\fR and \fBEILOVERFLOW\fR associated with
+extended-level conformance are not yet detected (this implementation does not
+yet support XPG4 multi-byte characters).
+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\fR.
+In this case, the functions return the string ending at the right margin.
+.SH SEE ALSO
+\fBcurses\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
+
diff --git a/contrib/ncurses/man/curs_kernel.3x b/contrib/ncurses/man/curs_kernel.3x
new file mode 100644
index 000000000000..62a775e7cbed
--- /dev/null
+++ b/contrib/ncurses/man/curs_kernel.3x
@@ -0,0 +1,152 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_kernel.3x,v 1.11 1998/06/27 21:56:38 tom Exp $
+.TH curs_kernel 3X ""
+.SH NAME
+\fBdef_prog_mode\fR, \fBdef_shell_mode\fR,
+\fBreset_prog_mode\fR, \fBreset_shell_mode\fR, \fBresetty\fR,
+\fBsavetty\fR, \fBgetsyx\fR, \fBsetsyx\fR, \fBripoffline\fR,
+\fBcurs_set\fR, \fBnapms\fR - low-level \fBcurses\fR routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint def_prog_mode(void);\fR
+.br
+\fBint def_shell_mode(void);\fR
+.br
+\fBint reset_prog_mode(void);\fR
+.br
+\fBint reset_shell_mode(void);\fR
+.br
+\fBint resetty(void);\fR
+.br
+\fBint savetty(void);\fR
+.br
+\fBvoid getsyx(int y, int x);\fR
+.br
+\fBvoid setsyx(int y, int x);\fR
+.br
+\fBint ripoffline(int line, int (*init)(WINDOW *, int));\fR
+.br
+\fBint curs_set(int visibility);\fR
+.br
+\fBint napms(int ms);\fR
+.br
+.SH DESCRIPTION
+The following routines give low-level access to various \fBcurses\fR
+capabilities. Theses routines typically are used inside library
+routines.
+
+The \fBdef_prog_mode\fR and \fBdef_shell_mode\fR routines save the
+current terminal modes as the "program" (in \fBcurses\fR) or "shell"
+(not in \fBcurses\fR) state for use by the \fBreset_prog_mode\fR and
+\fBreset_shell_mode\fR routines. This is done automatically by
+\fBinitscr\fR. There is one such save area for each screen context
+allocated by \fBnewterm()\fR.
+
+The \fBreset_prog_mode\fR and \fBreset_shell_mode\fR routines restore
+the terminal to "program" (in \fBcurses\fR) or "shell" (out of
+\fBcurses\fR) state. These are done automatically by \fBendwin\fR
+and, after an \fBendwin\fR, by \fBdoupdate\fR, so they normally are
+not called.
+
+The \fBresetty\fR and \fBsavetty\fR routines save and restore the
+state of the terminal modes. \fBsavetty\fR saves the current state in
+a buffer and \fBresetty\fR restores the state to what it was at the
+last call to \fBsavetty\fR.
+
+The \fBgetsyx\fR routine returns the current coordinates of the virtual screen
+cursor in \fIy\fR and \fIx\fR. If \fBleaveok\fR is currently \fBTRUE\fR, then
+\fB-1\fR,\fB-1\fR is returned. If lines have been removed from the top of the
+screen, using \fBripoffline\fR, \fIy\fR and \fIx\fR include these lines;
+therefore, \fIy\fR and \fIx\fR should be used only as arguments for
+\fBsetsyx\fR.
+
+The \fBsetsyx\fR routine sets the virtual screen cursor to
+\fIy\fR, \fIx\fR. If \fIy\fR and \fIx\fR are both \fB-1\fR, then
+\fBleaveok\fR is set. The two routines \fBgetsyx\fR and \fBsetsyx\fR
+are designed to be used by a library routine, which manipulates
+\fBcurses\fR windows but does not want to change the current position
+of the program's cursor. The library routine would call \fBgetsyx\fR
+at the beginning, do its manipulation of its own windows, do a
+\fBwnoutrefresh\fR on its windows, call \fBsetsyx\fR, and then call
+\fBdoupdate\fR.
+
+The \fBripoffline\fR routine provides access to the same facility that
+\fBslk_init\fR [see \fBcurs_slk\fR(3X)] uses to reduce the size of the
+screen. \fBripoffline\fR must be called before \fBinitscr\fR or
+\fBnewterm\fR is called. If \fIline\fR is positive, a line is removed
+from the top of \fBstdscr\fR; if \fIline\fR is negative, a line is
+removed from the bottom. When this is done inside \fBinitscr\fR, the
+routine \fBinit\fR (supplied by the user) is called with two
+arguments: a window pointer to the one-line window that has been
+allocated and an integer with the number of columns in the window.
+Inside this initialization routine, the integer variables \fBLINES\fR
+and \fBCOLS\fR (defined in \fB<curses.h>\fR) are not guaranteed to be
+accurate and \fBwrefresh\fR or \fBdoupdate\fR must not be called. It
+is allowable to call \fBwnoutrefresh\fR during the initialization
+routine.
+
+\fBripoffline\fR can be called up to five times before calling \fBinitscr\fR or
+\fBnewterm\fR.
+
+The \fBcurs_set\fR routine sets the cursor state is set to invisible,
+normal, or very visible for \fBvisibility\fR equal to \fB0\fR,
+\fB1\fR, or \fB2\fR respectively. If the terminal supports the
+\fIvisibility\fR requested, the previous \fIcursor\fR state is
+returned; otherwise, \fBERR\fR is returned.
+
+The \fBnapms\fR routine is used to sleep for \fIms\fR milliseconds.
+.SH RETURN VALUE
+Except for \fBcurs_set\fR, these routines always return \fBOK\fR.
+\fBcurs_set\fR returns the previous cursor state, or \fBERR\fR if the
+requested \fIvisibility\fR is not supported.
+.SH NOTES
+Note that \fBgetsyx\fR is a macro, so \fB&\fR is not necessary before
+the variables \fIy\fR and \fIx\fR.
+
+Older SVr4 man pages warn that the return value of \fBcurs_set\fR "is currently
+incorrect". This implementation gets it right, but it may be unwise to count
+on the correctness of the return value anywhere else.
+.SH PORTABILITY
+The functions \fBsetsyx\fR and \fBgetsyx\fR are not described in the XSI
+Curses standard, Issue 4. All other functions are as described in XSI Curses.
+
+The SVr4 documentation describes \fBsetsyx\fR and \fBgetsyx\fR as having return
+type int. This is misleading, as they are macros with no documented semantics
+for the return value.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_outopts\fR(3X), \fBcurs_refresh\fR(3X),
+\fBcurs_scr_dump\fR(3X), \fBcurs_slk\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_mouse.3x b/contrib/ncurses/man/curs_mouse.3x
new file mode 100644
index 000000000000..e995260473f9
--- /dev/null
+++ b/contrib/ncurses/man/curs_mouse.3x
@@ -0,0 +1,206 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: curs_mouse.3x,v 1.12 1999/01/09 22:53:22 tom Exp $
+.TH curs_mouse 3X ""
+.SH NAME
+\fBgetmouse\fR, \fBungetmouse\fR,
+\fBmousemask\fR, \fBwenclose\fR,
+\fBwmouse_trafo\fR, \fBmouseinterval\fR - mouse interface through curses
+.SH SYNOPSIS
+.nf
+\fB#include <curses.h>\fR
+
+\fBtypedef unsigned long mmask_t;
+
+typedef struct
+{
+ short id; \fI/* ID to distinguish multiple devices */\fB
+ int x, y, z; \fI/* event coordinates */\fB
+ mmask_t bstate; \fI/* button state bits */\fB
+}
+MEVENT;\fR
+.fi
+.br
+\fBint getmouse(MEVENT *event);\fR
+.br
+\fBint ungetmouse(MEVENT *event);\fR
+.br
+\fBmmask_t mousemask(mmask_t newmask, mmask_t *oldmask);\fR
+.br
+\fBbool wenclose(WINDOW *win, int y, int x);\fR
+.br
+\fBbool wmouse_trafo(const WINDOW* win, int* pY, int* pX, bool to_screen);\fR
+.br
+\fBint mouseinterval(int erval);\fR
+.br
+.SH DESCRIPTION
+These functions provide an interface to mouse events from
+\fBncurses\fR(3X). Mouse events are represented by \fBKEY_MOUSE\fR
+pseudo-key values in the \fBwgetch\fR input stream.
+
+To make mouse events visible, use the \fBmousemask\fR function. This will set
+the mouse events to be reported. By default, no mouse events are reported.
+The function will return a mask to indicate which of the specified mouse events
+can be reported; on complete failure it returns 0. If oldmask is non-NULL,
+this function fills the indicated location with the previous value of the given
+window'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.
+
+Here are the mouse event type masks:
+
+.TS
+l l
+_ _
+l l.
+\fIName\fR \fIDescription\fR
+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
+.TE
+
+Once a class of mouse events have been made visible in a window,
+calling the \fBwgetch\fR function on that window may return
+\fBKEY_MOUSE\fR as an indicator that a mouse event has been queued.
+To read the event data and pop the event off the queue, call
+\fBgetmouse\fR. This function will return \fBOK\fR if a mouse event
+is actually visible in the given window, \fBERR\fR otherwise.
+When \fBgetmouse\fR returns \fBOK\fR, 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 \fBungetmouse\fR function behaves analogously to \fBungetch\fR. It pushes
+a \fBKEY_MOUSE\fR event onto the input queue, and associates with that event
+the given state data and screen-relative character-cell coordinates.
+
+The \fBwenclose\fR function tests whether a given pair of screen-relative
+character-cell coordinates is enclosed by a given window, returning TRUE
+if it is and FALSE otherwise. It is useful for determining what subset of
+the screen windows enclose the location of a mouse event.
+
+The \fBwmouse_trafo\fR function transforms a given pair of coordinates from
+stdscr-relative coordinates to screen-relative coordinates or vice versa.
+Please remember, that stdscr-relative coordinates are not always identical
+to screen-relative coordinates due to the mechanism to reserve lines on top
+or bottom of the screen for other purposes (ripoff() call, see also slk_...
+functions). If the parameter \fBto_screen\fR is \fBTRUE\fR, the pointers
+\fBpY, pX\fR must reference the coordinates of a location inside the window
+\fBwin\fR. They are converted to screen-relative coordinates and returned
+through the pointers. If the conversion was successful, the function
+returns \fBTRUE\fR. If one of the parameters was NULL or the location is
+not inside the window, \fBFALSE\fR is returned. If \fBto_screen\fR is
+\fBFALSE\fR, the pointers \fBpY, pX\fR must reference screen-relative
+coordinates. They are converted to stdscr-relative coordinates if the
+window \fBwin\fR encloses this point. In this case the function returns
+\fBTRUE\fR. If one of the parameters is NULL or the point is not inside the
+window, \fBFALSE\fR is returned. Please notice, that the referenced coordinates
+are only replaced by the converted coordinates if the transformation was
+successful.
+
+The \fBmouseinterval\fR 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.
+
+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\fR that expects a linefeed for input-loop
+termination.
+
+.SH RETURN VALUE
+\fBgetmouse\fR, \fBungetmouse\fR and \fBmouseinterval\fR
+return the integer \fBERR\fR upon failure or \fBOK\fR
+upon successful completion. \fBmousemask\fR returns the
+mask of reportable events. \fBwenclose\fR and \fBwmouse_trafo\fR
+are boolean functions returning \fBTRUE\fR or \fBFALSE\fR depending
+on their test result.
+.SH PORTABILITY
+These calls were designed for \fBncurses\fR(3X), and are not found in SVr4
+curses, 4.4BSD curses, or any other previous version of curses.
+
+The feature macro \fBNCURSES_MOUSE_VERSION\fR is provided so the preprocessor
+can be used to test whether these features are present (its value is 1). NOTE:
+THIS INTERFACE IS EXPERIMENTAL AND IS SUBJECT TO CHANGE WITHOUT NOTICE! If the
+interface is changed, the value of \fBNCURSES_MOUSE_VERSION\fR will be
+incremented.
+
+The order of the \fBMEVENT\fR structure members is not guaranteed.
+Additional fields may be added to the structure in the future.
+
+Under \fBncurses\fR(3X), these calls are implemented using either
+xterm's built-in mouse-tracking API or Alessandro Rubini's gpm server.
+If you are using something other than xterm there is no gpm daemon
+running on your machine, mouse events will not be visible to
+\fBncurses\fR(3X) (and the \fBwmousemask\fR function will always
+return \fB0\fR).
+
+The z 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.
+.SH BUGS
+Mouse events under xterm will not in fact be ignored during cooked mode,
+if they have been enabled by \fBwmousemask\fR. 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.
+.SH SEE ALSO
+\fBcurses\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_move.3x b/contrib/ncurses/man/curs_move.3x
new file mode 100644
index 000000000000..25c47feb482b
--- /dev/null
+++ b/contrib/ncurses/man/curs_move.3x
@@ -0,0 +1,63 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_move.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_move 3X ""
+.SH NAME
+\fBmove\fR, \fBwmove\fR - move \fBcurses\fR window cursor
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint move(int y, int x);\fR
+.br
+\fBint wmove(WINDOW *win, int y, int x);\fR
+.br
+.SH DESCRIPTION
+These routines move the cursor associated with the window to line \fIy\fR and
+column \fIx\fR. This routine does not move the physical cursor of the terminal
+until \fBrefresh\fR 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\fR upon failure and OK (SVr4
+specifies only "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH NOTES
+Note that \fBmove\fR may be a macro.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4. The
+standard specifies that if (y,x) is within a multi-column character, the cursor
+is moved to the first column of that character; however, this implementation
+does not yet support the extended-level XSI multi-byte characters.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_refresh\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_outopts.3x b/contrib/ncurses/man/curs_outopts.3x
new file mode 100644
index 000000000000..2946562d4e06
--- /dev/null
+++ b/contrib/ncurses/man/curs_outopts.3x
@@ -0,0 +1,168 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_outopts.3x,v 1.13 1998/12/26 20:02:04 tom Exp $
+.TH curs_outopts 3X ""
+.SH NAME
+\fBclearok\fR, \fBidlok\fR, \fBidcok immedok\fR,
+\fBleaveok\fR, \fBsetscrreg\fR, \fBwsetscrreg\fR, \fBscrollok\fR,
+\fBnl\fR, \fBnonl\fR - \fBcurses\fR output options
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint clearok(WINDOW *win, bool bf);\fR
+.br
+\fBint idlok(WINDOW *win, bool bf);\fR
+.br
+\fBvoid idcok(WINDOW *win, bool bf);\fR
+.br
+\fBvoid immedok(WINDOW *win, bool bf);\fR
+.br
+\fBint leaveok(WINDOW *win, bool bf);\fR
+.br
+\fBint setscrreg(int top, int bot);\fR
+.br
+\fBint wsetscrreg(WINDOW *win, int top, int bot);\fR
+.br
+\fBint scrollok(WINDOW *win, bool bf);\fR
+.br
+\fBint nl(void);\fR
+.br
+\fBint nonl(void);\fR
+.br
+.SH DESCRIPTION
+These routines set options that change the style of output within
+\fBcurses\fR. All options are initially \fBFALSE\fR, unless otherwise stated.
+It is not necessary to turn these options off before calling \fBendwin\fR.
+
+If \fBclearok\fR is called with \fBTRUE\fR as argument, the next
+call to \fBwrefresh\fR 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\fR argument to \fBclearok\fR is the global variable \fBcurscr\fR,
+the next call to \fBwrefresh\fR with any window causes the screen to be cleared
+and repainted from scratch.
+
+If \fBidlok\fR is called with \fBTRUE\fR as second argument, \fBcurses\fR
+considers using the hardware insert/delete line feature of terminals so
+equipped. Calling \fBidlok\fR with \fBFALSE\fR 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 isn't really needed. If insert/delete line
+cannot be used, \fBcurses\fR redraws the changed portions of all lines.
+
+If \fBidcok\fR is called with \fBFALSE\fR as second argument, \fBcurses\fR
+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\fR with \fBTRUE\fR as second argument re-enables use
+of character insertion and deletion.
+
+If \fBimmedok\fR is called with \fBTRUE as argument\fR, any change
+in the window image, such as the ones caused by \fBwaddch, wclrtobot, wscrl\fR,
+\fIetc\fR., automatically cause a call to \fBwrefresh\fR. However, it may
+degrade performance considerably, due to repeated calls to \fBwrefresh\fR.
+It is disabled by default.
+
+Normally, the hardware cursor is left at the location of the window cursor
+being refreshed. The \fBleaveok\fR 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. If
+possible, the cursor is made invisible when this option is enabled.
+
+The \fBsetscrreg\fR and \fBwsetscrreg\fR routines allow the application
+programmer to set a software scrolling region in a window. \fItop\fR and
+\fIbot\fR 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\fR 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\fR is enabled and the terminal
+has either a scrolling region or insert/delete line capability, they will
+probably be used by the output routines.)
+
+The \fBscrollok\fR 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\fR is \fBFALSE\fR), the cursor is left on the bottom
+line. If enabled, (\fIbf\fR is \fBTRUE\fR), the window is scrolled up one line
+(Note that in order to get the physical scrolling effect on the terminal, it is
+also necessary to call \fBidlok\fR).
+
+The \fBnl\fR and \fBnonl\fR routines control whether the underlying display
+device translates the return key into newline on input, and whether it
+translates newline into return and line-feed on output (in either case, the
+call \fBaddch('\\n')\fR does the equivalent of return and line feed on the
+virtual screen). Initially, these translations do occur. If you disable them
+using \fBnonl\fR, \fBcurses\fR will be able to make better use of the line-feed
+capability, resulting in faster cursor motion. Also, \fBcurses\fR will then be
+able to detect the return key.
+.SH RETURN VALUE
+The functions \fBsetscrreg\fR and \fBwsetscrreg\fR return \fBOK\fR upon success
+and \fBERR\fR upon failure. All other routines that return an integer always
+return \fBOK\fR.
+.SH PORTABILITY
+These functions are described in the XSI Curses standard, Issue 4.
+
+The XSI Curses standard is ambiguous on the question of whether \fBraw\fR()
+should disable the CRLF translations controlled by \fBnl\fR() and \fBnonl\fR().
+BSD curses did turn off these translations; AT&T curses (at least as late as
+SVr1) did not. We choose to do so, on the theory that a programmer requesting
+raw input wants a clean (ideally 8-bit clean) connection that the operating
+system does not mess with.
+
+Some historic curses implementations had, as an undocumented feature, the
+ability to do the equivalent of \fBclearok(..., 1)\fR by saying
+\fBtouchwin(stdscr)\fR or \fBclear(stdscr)\fR. This will not work under
+ncurses.
+
+Earlier System V curses implementations specified that with \fBscrollok\fR
+enabled, any window modification triggering a scroll also forced a physical
+refresh. XSI Curses does not require this, and \fBncurses\fR avoids doing
+it in order to perform better vertical-motion optimization at \fBwrefresh\fR
+time.
+
+The XSI Curses standard does not mention that the cursor should be
+made invisible as a side-effect of \fBleaveok\fR.
+SVr4 curses documentation does this, but the code does not.
+.SH NOTES
+Note that \fBclearok\fR, \fBleaveok\fR, \fBscrollok\fR, \fBidcok\fR, \fBnl\fR,
+\fBnonl\fR and \fBsetscrreg\fR may be macros.
+
+The \fBimmedok\fR routine is useful for windows that are used as terminal
+emulators.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_addch\fR(3X), \fBcurs_clear\fR(3X),
+\fBcurs_initscr\fR(3X), \fBcurs_scroll\fR(3X), \fBcurs_refresh\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_overlay.3x b/contrib/ncurses/man/curs_overlay.3x
new file mode 100644
index 000000000000..b6a026059d44
--- /dev/null
+++ b/contrib/ncurses/man/curs_overlay.3x
@@ -0,0 +1,75 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_overlay.3x,v 1.8 1998/12/26 20:08:30 tom Exp $
+.TH curs_overlay 3X ""
+.SH NAME
+\fBoverlay\fR, \fBoverwrite\fR, \fBcopywin\fR - overlay and
+manipulate overlapped \fBcurses\fR windows
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint overlay(const WINDOW *srcwin, WINDOW *dstwin);\fR
+.br
+\fBint overwrite(const WINDOW *srcwin, WINDOW *dstwin);\fR
+.br
+\fBint copywin(WINDOW *srcwin, WINDOW *dstwin, int sminrow,\fR
+ \fBint smincol, int dminrow, int dmincol, int dmaxrow,\fR
+ \fBint dmaxcol, int overlay);\fR
+.SH DESCRIPTION
+The \fBoverlay\fR and \fBoverwrite\fR routines overlay \fIsrcwin\fR on
+top of \fIdstwin\fR. \fIscrwin\fR and \fIdstwin\fR are not required
+to be the same size; only text where the two windows overlap is
+copied. The difference is that \fBoverlay\fR is non-destructive
+(blanks are not copied) whereas \fBoverwrite\fR is destructive.
+
+The \fBcopywin\fR routine provides a finer granularity of control over the
+\fBoverlay\fR and \fBoverwrite\fR routines. Like in the \fBprefresh\fR
+routine, a rectangle is specified in the destination window, (\fIdminrow\fR,
+\fIdmincol\fR) and (\fIdmaxrow\fR, \fIdmaxcol\fR), and the upper-left-corner
+coordinates of the source window, (\fIsminrow\fR, \fIsmincol\fR). If the
+argument \fIoverlay\fR is \fBtrue\fR, then copying is non-destructive, as in
+\fBoverlay\fR.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fR upon failure, and \fBOK\fR
+(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH NOTES
+Note that \fBoverlay\fR and \fBoverwrite\fR 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 multi-byte renditions (not yet supported in this implementation).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_pad\fR(3X), \fBcurs_refresh\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_pad.3x b/contrib/ncurses/man/curs_pad.3x
new file mode 100644
index 000000000000..35138f120336
--- /dev/null
+++ b/contrib/ncurses/man/curs_pad.3x
@@ -0,0 +1,111 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_pad.3x,v 1.8 1998/12/26 20:09:03 tom Exp $
+.TH curs_pad 3X ""
+.SH NAME
+\fBnewpad\fR, \fBsubpad\fR, \fBprefresh\fR,
+\fBpnoutrefresh\fR, \fBpechochar\fR - create and display \fBcurses\fR
+pads
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBWINDOW *newpad(int nlines, int ncols);\fR
+.br
+\fBWINDOW *subpad(WINDOW *orig, int nlines, int ncols,\fR
+ \fBint begin_y, int begin_x);\fR
+.br
+\fBint prefresh(WINDOW *pad, int pminrow, int pmincol,\fR
+ \fBint sminrow, int smincol, int smaxrow, int smaxcol);\fR
+.br
+\fBint pnoutrefresh(WINDOW *pad, int pminrow, int pmincol,\fR
+ \fBint sminrow, int smincol, int smaxrow, int smaxcol);\fR
+.br
+\fBint pechochar(WINDOW *pad, chtype ch);\fR
+.SH DESCRIPTION
+The \fBnewpad\fR routine creates and returns a pointer to a new pad data
+structure with the given number of lines, \fInlines\fR, and columns,
+\fIncols\fR. 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
+(\fIe\fR.\fIg\fR., from scrolling or echoing of input) do not occur. It is not
+legal to call \fBwrefresh\fR with a \fIpad\fR as an argument; the routines
+\fBprefresh\fR or \fBpnoutrefresh\fR 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.
+
+The \fBsubpad\fR routine creates and returns a pointer to a subwindow within a
+pad with the given number of lines, \fInlines\fR, and columns, \fIncols\fR.
+Unlike \fBsubwin\fR, which uses screen coordinates, the window is at position
+(\fIbegin\fR_\fIx\fR\fB,\fR \fIbegin\fR_\fIy\fR) on the pad. The window is
+made in the middle of the window \fIorig\fR, so that changes made to one window
+affect both windows. During the use of this routine, it will often be
+necessary to call \fBtouchwin\fR or \fBtouchline\fR on \fIorig\fR before
+calling \fBprefresh\fR.
+
+The \fBprefresh\fR and \fBpnoutrefresh\fR routines are analogous to
+\fBwrefresh\fR and \fBwnoutrefresh\fR 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. \fIpminrow\fR and \fIpmincol\fR specify the upper
+left-hand corner of the rectangle to be displayed in the pad. \fIsminrow\fR,
+\fIsmincol\fR, \fIsmaxrow\fR, and \fIsmaxcol\fR 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
+\fIpminrow\fR, \fIpmincol\fR, \fIsminrow\fR, or \fIsmincol\fR are treated as if
+they were zero.
+
+The \fBpechochar\fR routine is functionally equivalent to a call to \fBaddch\fR
+followed by a call to \fBrefresh\fR, a call to \fBwaddch\fR followed by a call
+to \fBwrefresh\fR, or a call to \fBwaddch\fR followed by a call to
+\fBprefresh.\fR 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\fR, the last location of the pad on
+the screen is reused for the arguments to \fBprefresh\fR.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR
+(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
+completion.
+
+Routines that return pointers return \fBNULL\fR on error, and set \fBerrno\fR
+to \fBENOMEM\fR.
+.SH NOTES
+Note that \fBpechochar\fR may be a macro.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_refresh\fR(3X), \fBcurs_touch\fR(3X), \fBcurs_addch\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_print.3x b/contrib/ncurses/man/curs_print.3x
new file mode 100644
index 000000000000..7b781988fddb
--- /dev/null
+++ b/contrib/ncurses/man/curs_print.3x
@@ -0,0 +1,74 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: curs_print.3x,v 1.3 1998/03/11 21:12:53 juergen Exp $
+.TH curs_print 3X ""
+.SH NAME
+\fBmcprint\fR - ship binary data to printer
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint mcprint(char *data, int len);\fR
+.SH DESCRIPTION
+This function uses the \fBmc5p\fR or \fBmc4\fR and \fBmc5\fR capabilities,
+if they are present, to ship given data to a printer attached to the terminal.
+
+Note that the \fBmcprint\fR 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\fR function returns \fBERR\fR if the write operation aborted
+for some reason. In this case, errno will contain either an error associated
+with \fBwrite(2)\fR or one of the following:
+.TP 5
+ENODEV
+Capabilities for printer redirection don't exist.
+.TP 5
+ENOMEM
+Couldn't allocate sufficient memory to buffer the printer write.
+
+When \fBmcprint\fR succeeds, it returns the number of characters actually
+sent to the printer.
+.SH PORTABILITY
+The \fBmcprint\fR call was designed for \fBncurses\fR(3X), and is not found
+in SVr4 curses, 4.4BSD curses, or any other previous version of curses.
+.SH BUGS
+Padding in the \fBmc5p\fR, \fBmc4\fR and \fBmc5\fR capabilities will not be
+interpreted.
+.SH SEE ALSO
+\fBcurses\fR(3X)\fR
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_printw.3x b/contrib/ncurses/man/curs_printw.3x
new file mode 100644
index 000000000000..2f0152f3a77b
--- /dev/null
+++ b/contrib/ncurses/man/curs_printw.3x
@@ -0,0 +1,76 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_printw.3x,v 1.8 1998/12/26 20:09:36 tom Exp $
+.TH curs_printw 3X ""
+.SH NAME
+\fBprintw\fR, \fBwprintw\fR, \fBmvprintw\fR,
+\fBmvwprintw\fR, \fBvwprintw\fR - print formatted output in
+\fBcurses\fR windows
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint printw(char *fmt\fR [\fB, arg\fR] \fB...);\fR
+.br
+\fBint wprintw(WINDOW *win, char *fmt\fR [\fB, arg\fR] \fB...);\fR
+.br
+\fBint mvprintw(int y, int x, char *fmt\fR [\fB, arg\fR] \fB...);\fR
+.br
+\fBint mvwprintw(WINDOW *win, int y, int x,\fR
+ \fBchar *fmt\fR [\fB, arg]\fR ...);
+
+\fB#include <varargs.h>\fR
+.br
+\fBint vwprintw(WINDOW *win, char *fmt, varglist);\fR
+.br
+.SH DESCRIPTION
+The \fBprintw\fR, \fBwprintw\fR, \fBmvprintw\fR and \fBmvwprintw\fR
+routines are analogous to \fBprintf\fR [see \fBprintf\fR(3S)]. In
+effect, the string that would be output by \fBprintf\fR is output
+instead as though \fBwaddstr\fR were used on the given window.
+
+The \fBvwprintw\fR routine is analogous to \fBvprintf\fR [see
+\fBprintf\fR(3S)] and performs a \fBwprintw\fR using a variable
+argument list. The third argument is a \fBva_list\fR, a pointer to a
+list of arguments, as defined in \fB<varargs.h>\fR.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR
+(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions. The function
+\fBvwprintw\fR is marked TO BE WITHDRAWN, and is to be replaced by a function
+\fBvw_printw\fR using the \fB<stdarg.h>\fR interface.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBprintf\fR(3S), \fBvprintf(3S)\fR
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_refresh.3x b/contrib/ncurses/man/curs_refresh.3x
new file mode 100644
index 000000000000..4572b4c9f0ee
--- /dev/null
+++ b/contrib/ncurses/man/curs_refresh.3x
@@ -0,0 +1,112 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_refresh.3x,v 1.7 1998/03/11 21:12:53 juergen Exp $
+.TH curs_refresh 3X ""
+.SH NAME
+\fBrefresh\fR, \fBwrefresh\fR, \fBwnoutrefresh\fR,
+\fBdoupdate\fR, \fBredrawwin\fR, \fBwredrawln\fR - refresh
+\fBcurses\fR windows and lines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint refresh(void);\fR
+.br
+\fBint wrefresh(WINDOW *win);\fR
+.br
+\fBint wnoutrefresh(WINDOW *win);\fR
+.br
+\fBint doupdate(void);\fR
+.br
+\fBint redrawwin(WINDOW *win);\fR
+.br
+\fBint wredrawln(WINDOW *win, int beg_line, int num_lines);\fR
+.br
+.SH DESCRIPTION
+The \fBrefresh\fR and \fBwrefresh\fR routines (or \fBwnoutrefresh\fR and
+\fBdoupdate\fR) must be called to get actual output to the terminal, as other
+routines merely manipulate data structures. The routine \fBwrefresh\fR copies
+the named window to the physical terminal screen, taking into account what is
+already there in order to do optimizations. The \fBrefresh\fR routine is the
+same, using \fBstdscr\fR as the default window. Unless \fBleaveok\fR has been
+enabled, the physical cursor of the terminal is left at the location of the
+cursor for that window.
+
+The \fBwnoutrefresh\fR and \fBdoupdate\fR routines allow multiple updates with
+more efficiency than \fBwrefresh\fR alone. In addition to all the window
+structures, \fBcurses\fR 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.
+
+The routine \fBwrefresh\fR works by first calling \fBwnoutrefresh\fR, which
+copies the named window to the virtual screen, and then calling \fBdoupdate\fR,
+which compares the virtual screen to the physical screen and does the actual
+update. If the programmer wishes to output several windows at once, a series
+of calls to \fBwrefresh\fR results in alternating calls to \fBwnoutrefresh\fR
+and \fBdoupdate\fR, causing several bursts of output to the screen. By first
+calling \fBwnoutrefresh\fR for each window, it is then possible to call
+\fBdoupdate\fR once, resulting in only one burst of output, with fewer total
+characters transmitted and less CPU time used. If the \fIwin\fR argument to
+\fBwrefresh\fR is the global variable \fBcurscr\fR, the screen is immediately
+cleared and repainted from scratch.
+
+The phrase "copies the named window to the virtual screen" above is ambiguous.
+What actually happens is that all \fItouched\fR (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\fR below for a warning about
+exploiting this behavior.)
+
+The \fBwredrawln\fR routine indicates to \fBcurses\fR 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\fR() touches the entire window.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fR upon failure, and \fBOK\fR
+(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH NOTES
+Note that \fBrefresh\fR and \fBredrawwin\fR may be macros.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+
+Whether \fBwnoutrefresh()\fR 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()\fR before the
+\fBwnoutrefresh()\fR call to guarantee an entire-contents copy anywhere.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_outopts\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_scanw.3x b/contrib/ncurses/man/curs_scanw.3x
new file mode 100644
index 000000000000..f0c64f1fcf2c
--- /dev/null
+++ b/contrib/ncurses/man/curs_scanw.3x
@@ -0,0 +1,77 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_scanw.3x,v 1.8 1998/12/26 20:10:12 tom Exp $
+.TH curs_scanw 3X ""
+.SH NAME
+\fBscanw\fR, \fBwscanw\fR, \fBmvscanw\fR,
+\fBmvwscanw\fR, \fBvwscanw\fR - convert formatted input from a
+\fBcurses\fR widow
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint scanw(char *fmt\fR [\fB, arg\fR] \fB...);\fR
+.br
+\fBint wscanw(WINDOW *win, char *fmt\fR [\fB, arg\fR] \fB...);\fR
+.br
+\fBint mvscanw(int y, int x, char *fmt\fR [\fB, arg\fR] \fB...);\fR
+.br
+\fBint mvwscanw(WINDOW *win, int y, int x,\fR
+ \fBchar *fmt\fR [\fB, arg]\fR \fB...);\fR
+.br
+\fBint vwscanw(WINDOW *win, char *fmt, va_list varglist);\fR
+.SH DESCRIPTION
+The \fBscanw\fR, \fBwscanw\fR and \fBmvscanw\fR routines are analogous to
+\fBscanf\fR [see \fBscanf\fR(3S)]. The effect of these routines is as though
+\fBwgetstr\fR were called on the window, and the resulting line used as input
+for \fBsscanf\fR(3). Fields which do not map to a variable in the \fIfmt\fR
+field are lost.
+
+The \fBvwscanw\fR routine is similar to \fBvwprintw\fR in that it performs a
+\fBwscanw\fR using a variable argument list. The third argument is a
+\fIva\fR_\fIlist\fR, a pointer to a list of arguments, as defined in
+\fB<varargs.h>\fR.
+.SH RETURN VALUE
+\fBvwscanw\fR returns \fBERR\fR on failure and an integer equal to the
+number of fields scanned on success.
+
+Applications may use the return value from the \fBscanw\fR, \fBwscanw\fR,
+\fBmvscanw\fR and \fBmvwscanw\fR routines to determine the number of fields
+which were mapped in the call.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions. The function
+\fBvwscanw\fR is marked TO BE WITHDRAWN, and is to be replaced by a function
+\fBvw_scanw\fR using the \fB<stdarg.h>\fR interface.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_getstr\fR(3X), \fBcurs_printw\fR(3X), \fBscanf\fR(3S)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_scr_dump.3x b/contrib/ncurses/man/curs_scr_dump.3x
new file mode 100644
index 000000000000..67a224899b2d
--- /dev/null
+++ b/contrib/ncurses/man/curs_scr_dump.3x
@@ -0,0 +1,93 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_scr_dump.3x,v 1.1 1998/03/11 21:12:53 tom Exp $
+.TH curs_scr_dump 3X ""
+.SH NAME
+\fBscr_dump\fR, \fBscr_restore\fR,
+\fBscr_init\fR, \fBscr_set\fR - read (write) a \fBcurses\fR screen
+from (to) a file
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint scr_dump(const char *filename);\fR
+.br
+\fBint scr_restore(const char *filename);\fR
+.br
+\fBint scr_init(const char *filename);\fR
+.br
+\fBint scr_set(const char *filename);\fR
+.br
+.SH DESCRIPTION
+The \fBscr_dump\fR routine dumps the current contents of the virtual screen
+to the file \fIfilename\fR.
+
+The \fBscr_restore\fR routine sets the virtual screen to the contents
+of \fIfilename\fR, which must have been written using \fBscr_dump\fR. The next
+call to \fBdoupdate\fR restores the screen to the way it looked in the dump
+file.
+
+The \fBscr_init\fR routine reads in the contents of \fIfilename\fR and uses
+them to initialize the \fBcurses\fR data structures about what the terminal
+currently has on its screen. If the data is determined to be valid,
+\fBcurses\fR bases its next update of the screen on this information rather
+than clearing the screen and starting from scratch. \fBscr_init\fR is used
+after \fBinitscr\fR or a \fBsystem\fR [see \fBsystem\fR(BA_LIB)] call to share
+the screen with another process which has done a \fBscr_dump\fR after its
+\fBendwin\fR call. The data is declared invalid if the terminfo capabilities
+\fBrmcup\fR and \fBnrrmc\fR exist; also if the terminal has been written to
+since the preceding \fBscr_dump\fR call.
+
+The \fBscr_set\fR routine is a combination of \fBscr_restore\fR and
+\fBscr_init\fR. It tells the program that the information in \fIfilename\fR 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 \fBgetwin\fR and
+\fBputwin\fR routines [see \fBcurs_util\fR(3X)].
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and \fBOK\fR
+upon success.
+.SH NOTES
+Note that \fBscr_init\fR, \fBscr_set\fR, and \fBscr_restore\fR may be macros.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4, describes these functions (adding the const
+qualifiers).
+
+The SVr4 docs merely say under \fBscr_init\fR that the dump data is also
+considered invalid "if the time-stamp of the tty is old" but don't define
+"old".
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_refresh\fR(3X),
+\fBcurs_util\fR(3X), \fBsystem\fR(3S)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_scroll.3x b/contrib/ncurses/man/curs_scroll.3x
new file mode 100644
index 000000000000..5429685fab2e
--- /dev/null
+++ b/contrib/ncurses/man/curs_scroll.3x
@@ -0,0 +1,78 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_scroll.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_scroll 3X ""
+.SH NAME
+\fBscroll\fR, \fBsrcl\fR, \fBwscrl\fR - scroll a \fBcurses\fR window
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint scroll(WINDOW *win);\fR
+.br
+\fBint scrl(int n);\fR
+.br
+\fBint wscrl(WINDOW *win, int n);\fR
+.br
+.SH DESCRIPTION
+The \fBscroll\fR 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 physical screen may be scrolled
+at the same time.
+
+For positive \fIn\fR, the \fBscrl\fR and \fBwscrl\fR routines scroll the
+window up \fIn\fR lines (line \fIi\fR+\fIn\fR becomes \fIi\fR); otherwise
+scroll the window down \fIn\fR 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 \fBscrollok\fR.
+.SH RETURN VALUE
+These routines return \fBERR\fR upon failure, and \fBOK\fR (SVr4 only specifies
+"an integer value other than \fBERR\fR") upon successful completion.
+.SH NOTES
+Note that \fBscrl\fR and \fBscroll\fR 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, in order to leave open the possibility of smarter
+optimization of multiple scroll actions on the next update.
+
+Neither the SVr4 documentation specifies 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\fR(3X), \fBcurs_outopts\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_slk.3x b/contrib/ncurses/man/curs_slk.3x
new file mode 100644
index 000000000000..86209d7964c1
--- /dev/null
+++ b/contrib/ncurses/man/curs_slk.3x
@@ -0,0 +1,139 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_slk.3x,v 1.9 1998/03/11 21:12:53 juergen Exp $
+.TH curs_slk 3X ""
+.SH NAME
+\fBslk_init\fR, \fBslk_set\fR, \fBslk_refresh\fR,
+\fBslk_noutrefresh\fR, \fBslk_label\fR, \fBslk_clear\fR, \fBslk_restore\fR,
+\fBslk_touch\fR, \fBslk_attron\fR, \fBslk_attrset\fR, \fBslk_attroff\fR, \fBslk_color\fR -
+\fBcurses\fR soft label routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint slk_init(int fmt);\fR
+.br
+\fBint slk_set(int labnum, const char *label, int fmt);\fR
+.br
+\fBint slk_refresh(void);\fR
+.br
+\fBint slk_noutrefresh(void);\fR
+.br
+\fBchar *slk_label(int labnum);\fR
+.br
+\fBint slk_clear(void);\fR
+.br
+\fBint slk_restore(void);\fR
+.br
+\fBint slk_touch(void);\fR
+.br
+\fBint slk_attron(const chtype attrs);\fR
+.br
+\fBint slk_attrset(const chtype attrs);\fR
+.br
+\fBattr_t slk_attr(void);\fR
+.br
+\fBint slk_attroff(const chtype attrs);\fR
+.br
+\fBint slk_color(short color_pair_number);\fR
+.br
+.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\fR takes over the bottom line of \fBstdscr\fR, reducing the size of
+\fBstdscr\fR and the variable \fBLINES\fR. \fBcurses\fR 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 most common for todays PC like enduser devices.
+Please note that ncurses simulates this mode by taking over up to two lines at
+the bottom of the screen, it doesn't try to use any hardware support for this
+mode.
+
+The \fBslk_init\fR routine must be called before \fBinitscr\fR or \fBnewterm\fR
+is called. If \fBinitscr\fR eventually uses a line from \fBstdscr\fR to
+emulate the soft labels, then \fIfmt\fR determines how the labels are arranged
+on the screen. Setting \fIfmt\fR to \fB0\fR indicates a 3-2-3 arrangement of
+the labels, \fB1\fR indicates a 4-4 arrangement and \fB2\fR indicates the
+PC like 4-4-4 mode. If \fBfmt\fR is set to \fB3\fR, it 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.
+
+The \fBslk_set\fR routine requires \fIlabnum\fR to be a label number,
+from \fB1\fR to \fB8\fR (resp. \fB12\fR); \fIlabel\fR must be the string
+to be put on the label, up to eight (resp. five) characters in length.
+A null string or a null pointer sets up a blank label. \fIfmt\fR is either
+\fB0\fR, \fB1\fR, or \fB2\fR, indicating whether the label is to be
+left-justified, centered, or right-justified, respectively, within the
+label.
+
+The \fBslk_refresh\fR and \fBslk_noutrefresh\fR routines correspond to
+the \fBwrefresh\fR and \fBwnoutrefresh\fR routines.
+
+The \fBslk_label\fR routine returns the current label for label number
+\fIlabnum\fR, with leading and trailing blanks stripped.
+
+The \fBslk_clear\fR routine clears the soft labels from the screen.
+
+The \fBslk_restore\fR routine, restores the soft labels to the screen
+after a \fBslk_clear\fR has been performed.
+
+The \fBslk_touch\fR routine forces all the soft labels to be output
+the next time a \fBslk_noutrefresh\fR is performed.
+
+The \fBslk_attron\fR, \fBslk_attrset\fR, \fBslk_attroff\fR and \fBslk_attr\fR
+routines correspond to \fBattron\fR, \fBattrset\fR, \fBattroff\fR and \fBattr_get\fR.
+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).
+
+The \fBslk_color\fR routine corresponds to \fBcolor_set\fR. It has an effect only
+if soft labels are simulated on the bottom line of the screen.
+
+.SH RETURN VALUE
+These routines return \fBERR\fR upon failure and OK (SVr4 specifies only "an
+integer value other than \fBERR\fR") upon successful completion. \fBslk_attr\fR
+returns the attribute used for the soft keys.
+
+\fBslk_label\fR returns \fBNULL\fR on error.
+.SH NOTES
+Most applications would use \fBslk_noutrefresh\fR because a
+\fBwrefresh\fR is likely to follow soon.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4, describes these functions. It changes the
+argument type of the attribute-manipulation functions \fBslk_attron\fR,
+\fBslk_attroff\fR, \fBslk_attrset\fR to be \fBattr_t\fR, and adds \fBconst\fR
+qualifiers. The format codes \fB2\fR and \fB3\fR for \fBslk_init()\fR and the
+function \fBslk_attr\fR are specific to ncurses.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_attr\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_refresh\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_termattrs.3x b/contrib/ncurses/man/curs_termattrs.3x
new file mode 100644
index 000000000000..2ece5a3587df
--- /dev/null
+++ b/contrib/ncurses/man/curs_termattrs.3x
@@ -0,0 +1,107 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_termattrs.3x,v 1.4 1998/03/11 21:12:53 juergen Exp $
+.TH curs_termattrs 3X ""
+.SH NAME
+\fBbaudrate\fR, \fBerasechar\fR, \fBhas_ic\fR,
+\fBhas_il\fR, \fBkillchar\fR, \fBlongname\fR, \fBtermattrs\fR,
+\fBtermname\fR - \fBcurses\fR environment query routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint baudrate(void);\fR
+.br
+\fBchar erasechar(void);\fR
+.br
+\fBint has_ic(void);\fR
+.br
+\fBint has_il(void);\fR
+.br
+\fBchar killchar(void);\fR
+.br
+\fBchar *longname(void);\fR
+.br
+\fBattr_t termattrs(void);\fR
+.br
+\fBchar *termname(void);\fR
+.br
+.SH DESCRIPTION
+The \fBbaudrate\fR routine returns the output speed of the terminal. The
+number returned is in bits per second, for example \fB9600\fR, and is an
+integer.
+
+The \fBerasechar\fR routine returns the user's current erase character.
+
+The \fBhas_ic\fR routine is true if the terminal has insert- and delete-
+character capabilities.
+
+The \fBhas_il\fR 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\fR.
+
+The \fBkillchar\fR routine returns the user's current line kill character.
+
+The \fBlongname\fR 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\fR or \fBnewterm\fR. The area is
+overwritten by each call to \fBnewterm\fR and is not restored by
+\fBset_term\fR, so the value should be saved between calls to
+\fBnewterm\fR if \fBlongname\fR is going to be used with multiple
+terminals.
+
+If a given terminal doesn't support a video attribute that an
+application program is trying to use, \fBcurses\fR may substitute a
+different video attribute for it. The \fBtermattrs\fR function
+returns a logical \fBOR\fR of all video attributes supported by the
+terminal. This information is useful when a \fBcurses\fR program
+needs complete control over the appearance of the screen.
+
+The \fBtermname\fR routine returns the value of the environmental
+variable \fBTERM\fR (truncated to 14 characters).
+.SH RETURN VALUE
+\fBlongname\fR and \fBtermname\fR return \fBNULL\fR on error.
+
+Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR
+(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
+completion.
+.SH NOTES
+Note that \fBtermattrs\fR may be a macro.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions. It changes the
+return type of \fBtermattrs\fR to the new type \fBattr_t\fR.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_outopts\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_termcap.3x b/contrib/ncurses/man/curs_termcap.3x
new file mode 100644
index 000000000000..b290beae1350
--- /dev/null
+++ b/contrib/ncurses/man/curs_termcap.3x
@@ -0,0 +1,112 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_termcap.3x,v 1.11 1998/07/18 02:45:56 tom Exp $
+.TH curs_termcap 3X ""
+.ds n 5
+.SH NAME
+\fBtgetent\fR, \fBtgetflag\fR, \fBtgetnum\fR,
+\fBtgetstr\fR, \fBtgoto\fR, \fBtputs\fR - direct \fBcurses\fR
+interface to the terminfo capability database
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+.br
+\fB#include <term.h>\fR
+.br
+\fBint tgetent(const char *bp, char *name);\fR
+.br
+\fBint tgetflag(const char *id);\fR
+.br
+\fBint tgetnum(const char *id);\fR
+.br
+\fBchar *tgetstr(const char *id, char **area);\fR
+.br
+\fBchar *tgoto(const char *cap, int col, int row);\fR
+.br
+\fBint tputs(const char *str, int affcnt, int (*putc)(int));\fR
+.br
+.SH DESCRIPTION
+These routines are included as a conversion aid for programs that use
+the \fItermcap\fR library. Their parameters are the same and the
+routines are emulated using the \fIterminfo\fR database. Thus, they
+can only be used to query the capabilities of entries for which a
+terminfo entry has been compiled.
+
+The \fBtgetent\fR routine loads the entry for \fIname\fR.
+It returns 1 on success, 0 if there is no such entry, and -1 if the
+terminfo database could not be found.
+The emulation ignores the buffer pointer \fIbp\fR.
+
+The \fBtgetflag\fR routine gets the boolean entry for \fIid\fR,
+or zero if it is not available.
+
+The \fBtgetnum\fR routine gets the numeric entry for \fIid\fR,
+or -1 if it is not available.
+
+The \fBtgetstr\fR routine returns the string entry for \fIid\fR,
+or zero if it is not available.
+Use \fBtputs\fR to output the returned string.
+
+The \fBtgoto\fR routine instantiates the parameters into the given capability.
+The output from this routine is to be passed to \fBtputs\fR.
+
+The \fBtputs\fR routine is described on the \fBcurs_terminfo\fR(3X) manual
+page. It can retrieve capabilities by either termcap or terminfo name.
+
+.SH RETURN VALUE
+Except where explicitly noted,
+routines that return an integer return \fBERR\fR upon failure and \fBOK\fR
+(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
+completion.
+
+Routines that return pointers return \fBNULL\fR on error.
+.SH BUGS
+If you call \fBtgetstr\fR to fetch \fBca\fR 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 won't cause problems if all
+you do with it is call \fBtgoto\fR or \fBtparm\fR, which both expand
+terminfo-style.
+
+Because terminfo conventions for representing padding in string capabilities
+differ from termcap's, \fBtputs("50");\fR will put out a literal "50" rather
+than busy-waiting for 50 milliseconds. Cope with it.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions. However, they
+are marked TO BE WITHDRAWN and may be removed in future versions.
+
+Neither the XSI Curses standard nor the SVr4 man pages documented the return
+values of \fBtgetent\fR correctly, though all three were in fact returned ever
+since SVr1.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBterminfo\fR(\*n), \fBputc\fR(3S).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_terminfo.3x b/contrib/ncurses/man/curs_terminfo.3x
new file mode 100644
index 000000000000..5120fc38726d
--- /dev/null
+++ b/contrib/ncurses/man/curs_terminfo.3x
@@ -0,0 +1,255 @@
+.\"***************************************************************************
+.\" Copyright (c) 1999 Free Software Foundation, Inc. *
+.\" *
+.\" Permission is hereby granted, free of charge, to any person obtaining a *
+.\" copy of this software and associated documentation files (the *
+.\" "Software"), to deal in the Software without restriction, including *
+.\" without limitation the rights to use, copy, modify, merge, publish, *
+.\" distribute, distribute with modifications, sublicense, and/or sell *
+.\" copies of the Software, and to permit persons to whom the Software is *
+.\" furnished to do so, subject to the following conditions: *
+.\" *
+.\" The above copyright notice and this permission notice shall be included *
+.\" in all copies or substantial portions of the Software. *
+.\" *
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+.\" *
+.\" Except as contained in this notice, the name(s) of the above copyright *
+.\" holders 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.11 1999/07/31 21:41:29 tom Exp $
+.TH curs_terminfo 3X ""
+.ds n 5
+.SH NAME
+\fBsetupterm\fR, \fBsetterm\fR,
+\fBset_curterm\fR, \fBdel_curterm\fR, \fBrestartterm\fR, \fBtparm\fR,
+\fBtputs\fR, \fBputp\fR, \fBvidputs\fR, \fBvidattr\fR, \fBmvcur\fR,
+\fBtigetflag\fR, \fBtigetnum\fR, \fBtigetstr\fR - \fBcurses\fR
+interfaces to terminfo database
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+.br
+\fB#include <term.h>\fR
+
+\fBint setupterm(const char *term, int fildes, int *errret);\fR
+.br
+\fBint setterm(const char *term);\fR
+.br
+\fBTERMINAL *set_curterm(TERMINAL *nterm);\fR
+.br
+\fBint del_curterm(TERMINAL *oterm);\fR
+.br
+\fBint restartterm(const char *term, int fildes, int *errret);\fR
+.br
+\fBchar *tparm(const char *str, ...);\fR
+.br
+\fBint tputs(const char *str, int affcnt, int (*putc)(int));\fR
+.br
+\fBint putp(const char *str);\fR
+.br
+\fBint vidputs(chtype attrs, int (*putc)(char));\fR
+.br
+\fBint vidattr(chtype attrs);\fR
+.br
+\fBint mvcur(int oldrow, int oldcol, int newrow, int newcol);\fR
+.br
+\fBint tigetflag(const char *capname);\fR
+.br
+\fBint tigetnum(const char *capname);\fR
+.br
+\fBchar *tigetstr(const char *capname);\fR
+.br
+.SH DESCRIPTION
+These low-level routines must be called by programs that have to deal
+directly with the \fBterminfo\fR database to handle certain terminal
+capabilities, such as programming function keys. For all other
+functionality, \fBcurses\fR routines are more suitable and their use is
+recommended.
+
+Initially, \fBsetupterm\fR should be called. Note that
+\fBsetupterm\fR is automatically called by \fBinitscr\fR and
+\fBnewterm\fR. This defines the set of terminal-dependent variables
+[listed in \fBterminfo\fR(\*n)]. The \fBterminfo\fR variables
+\fBlines\fR and \fBcolumns\fR are initialized by \fBsetupterm\fR as
+follows: If \fBuse_env(FALSE)\fR has been called, values for
+\fBlines\fR and \fBcolumns\fR specified in \fBterminfo\fR are used.
+Otherwise, if the environment variables \fBLINES\fR and \fBCOLUMNS\fR
+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\fR and \fBcolumns\fR specified in the
+\fBterminfo\fR database are used.
+
+The header files \fBcurses.h\fR and \fBterm.h\fR should be included (in this
+order) to get the definitions for these strings, numbers, and flags.
+Parameterized strings should be passed through \fBtparm\fR to instantiate them.
+All \fBterminfo\fR strings [including the output of \fBtparm\fR] should be printed
+with \fBtputs\fR or \fBputp\fR. Call the \fBreset_shell_mode\fR to restore the
+tty modes before exiting [see \fBcurs_kernel\fR(3X)]. Programs which use
+cursor addressing should output \fBenter_ca_mode\fR upon startup and should
+output \fBexit_ca_mode\fR before exiting. Programs desiring shell escapes
+should call
+
+\fBreset_shell_mode\fR and output \fBexit_ca_mode\fR before the shell
+is called and should output \fBenter_ca_mode\fR and call
+\fBreset_prog_mode\fR after returning from the shell.
+
+The \fBsetupterm\fR routine reads in the \fBterminfo\fR database,
+initializing the \fBterminfo\fR structures, but does not set up the
+output virtualization structures used by \fBcurses\fR. The terminal
+type is the character string \fIterm\fR; if \fIterm\fR is null, the
+environment variable \fBTERM\fR is used.
+All output is to file descriptor \fBfildes\fR which is initialized for output.
+If \fIerrret\fR is not null,
+then \fBsetupterm\fR returns \fBOK\fR or
+\fBERR\fR and stores a status value in the integer pointed to by
+\fIerrret\fR.
+A return value of \fBOK\fR combined with status of \fB1\fR in \fIerrret\fR
+is normal.
+If \fBERR\fR is returned, examine \fIerrret\fR:
+.RS
+.TP 5
+.B 1
+means that the terminal is hardcopy, cannot be used for curses applications.
+.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.
+.TP 5
+.B -1
+means that the \fBterminfo\fR database could not be found.
+.RE
+.PP
+If \fIerrret\fR is
+null, \fBsetupterm\fR prints an error message upon finding an error
+and exits. Thus, the simplest call is:
+
+ \fBsetupterm((char *)0, 1, (int *)0);\fR,
+
+which uses all the defaults and sends the output to \fBstdout\fR.
+
+The \fBsetterm\fR routine is being replaced by \fBsetupterm\fR. The call:
+
+ \fBsetupterm(\fR\fIterm\fR\fB, 1, (int *)0)\fR
+
+provides the same functionality as \fBsetterm(\fR\fIterm\fR\fB)\fR.
+The \fBsetterm\fR routine is included here for BSD compatibility, and
+is not recommended for new programs.
+
+The \fBset_curterm\fR routine sets the variable \fBcur_term\fR to
+\fInterm\fR, and makes all of the \fBterminfo\fR boolean, numeric, and
+string variables use the values from \fInterm\fR. It returns the old value
+of \fBcur_term\fR.
+
+The \fBdel_curterm\fR routine frees the space pointed to by
+\fIoterm\fR and makes it available for further use. If \fIoterm\fR is
+the same as \fBcur_term\fR, references to any of the \fBterminfo\fR
+boolean, numeric, and string variables thereafter may refer to invalid
+memory locations until another \fBsetupterm\fR has been called.
+
+The \fBrestartterm\fR routine is similar to \fBsetupterm\fR and \fBinitscr\fR,
+except that it is called after restoring memory to a previous state (for
+example, when reloading a game saved as a core image dump). It 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,
+it saves various tty state bits, does a setupterm, and then restores the bits.
+
+The \fBtparm\fR routine instantiates the string \fIstr\fR with
+parameters \fIpi\fR. A pointer is returned to the result of \fIstr\fR
+with the parameters applied.
+
+The \fBtputs\fR routine applies padding information to the string
+\fIstr\fR and outputs it. The \fIstr\fR must be a terminfo string
+variable or the return value from \fBtparm\fR, \fBtgetstr\fR, or
+\fBtgoto\fR. \fIaffcnt\fR is the number of lines affected, or 1 if
+not applicable. \fIputc\fR is a \fBputchar\fR-like routine to which
+the characters are passed, one at a time.
+
+The \fBputp\fR routine calls \fBtputs(\fR\fIstr\fR\fB, 1, putchar)\fR.
+Note that the output of \fBputp\fR always goes to \fBstdout\fR, not to
+the \fIfildes\fR specified in \fBsetupterm\fR.
+
+The \fBvidputs\fR routine displays the string on the terminal in the
+video attribute mode \fIattrs\fR, which is any combination of the
+attributes listed in \fBcurses\fR(3X). The characters are passed to
+the \fBputchar\fR-like routine \fIputc\fR.
+
+The \fBvidattr\fR routine is like the \fBvidputs\fR routine, except
+that it outputs through \fBputchar\fR.
+
+The \fBmvcur\fR routine provides low-level cursor motion. It takes
+effect immediately (rather than at the next refresh).
+
+The \fBtigetflag\fR, \fBtigetnum\fR and \fBtigetstr\fR routines return
+the value of the capability corresponding to the \fBterminfo\fR
+\fIcapname\fR passed to them, such as \fBxenl\fR.
+
+The \fBtigetflag\fR routine returns the value \fB-1\fR if
+\fIcapname\fR is not a boolean capability,
+or \fB0\fR if it is canceled or absent from the terminal description.
+
+The \fBtigetnum\fR routine returns the value \fB-2\fR if
+\fIcapname\fR is not a numeric capability,
+or \fB-1\fR if it is canceled or absent from the terminal description.
+
+The \fBtigetstr\fR routine returns the value \fB(char *)-1\fR
+if \fIcapname\fR is not a string capability,
+or \fB0\fR if it is canceled or absent from the terminal description.
+
+The \fIcapname\fR for each capability is given in the table column entitled
+\fIcapname\fR code in the capabilities section of \fBterminfo\fR(\*n).
+
+\fBchar *boolnames\fR, \fB*boolcodes\fR, \fB*boolfnames\fR
+
+\fBchar *numnames\fR, \fB*numcodes\fR, \fB*numfnames\fR
+
+\fBchar *strnames\fR, \fB*strcodes\fR, \fB*strfnames\fR
+
+These null-terminated arrays contain the \fIcapnames\fR, the
+\fBtermcap\fR codes, and the full C names, for each of the
+\fBterminfo\fR variables.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fR upon failure and \fBOK\fR
+(SVr4 only specifies "an integer value other than \fBERR\fR") upon successful
+completion, unless otherwise noted in the preceding routine descriptions.
+
+Routines that return pointers always return \fBNULL\fR on error.
+.SH NOTES
+The \fBsetupterm\fR routine should be used in place of \fBsetterm\fR.
+It may be useful when you want to test for terminal capabilities without
+committing to the allocation of storage involved in \fBinitscr\fR.
+
+Note that \fBvidattr\fR and \fBvidputs\fR may be macros.
+.SH PORTABILITY
+The function \fBsetterm\fR is not described in the XSI Curses standard and must
+be considered non-portable. All other functions are as described in the XSI
+curses standard.
+
+In System V Release 4, \fBset_curterm\fR has an \fBint\fR return type and
+returns \fBOK\fR or \fBERR\fR. We have chosen to implement the XSI Curses
+semantics.
+
+In System V Release 4, the third argument of \fBtputs\fR has the type
+\fBint (*putc)(char)\fR.
+
+The XSI Curses standard prototypes \fBtparm\fR with a fixed number of parameters,
+rather than a variable argument list.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_kernel\fR(3X), \fBcurs_termcap\fR(3X),
+\fBputc\fR(3S), \fBterminfo\fR(\*n)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_touch.3x b/contrib/ncurses/man/curs_touch.3x
new file mode 100644
index 000000000000..e1d130d30368
--- /dev/null
+++ b/contrib/ncurses/man/curs_touch.3x
@@ -0,0 +1,93 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_touch.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_touch 3X ""
+.SH NAME
+\fBtouchwin\fR, \fBtouchline\fR, \fBuntouchwin\fR,
+\fBwtouchln\fR, \fBis_linetouched\fR, \fBis_wintouched\fR -
+\fBcurses\fR refresh control routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+.br
+\fBint touchwin(WINDOW *win);\fR
+.br
+\fBint touchline(WINDOW *win, int start, int count);\fR
+.br
+\fBint untouchwin(WINDOW *win);\fR
+.br
+\fBint wtouchln(WINDOW *win, int y, int n, int changed);\fR
+.br
+\fBint is_linetouched(WINDOW *win, int line);\fR
+.br
+\fBint is_wintouched(WINDOW *win);\fR
+.br
+.SH DESCRIPTION
+The \fBtouchwin\fR and \fBtouchline\fR 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\fR only pretends that \fIcount\fR lines have been
+changed, beginning with line \fIstart\fR.
+
+The \fBuntouchwin\fR routine marks all lines in the window as unchanged since
+the last call to \fBwrefresh\fR.
+
+The \fBwtouchln\fR routine makes \fIn\fR lines in the window, starting
+at line \fIy\fR, look as if they have (\fIchanged\fR\fB=1\fR) or have
+not (\fIchanged\fR\fB=0\fR) been changed since the last call to
+\fBwrefresh\fR.
+
+The \fBis_linetouched\fR and \fBis_wintouched\fR routines return
+\fBTRUE\fR if the specified line/window was modified since the last
+call to \fBwrefresh\fR; otherwise they return \fBFALSE\fR. In
+addition, \fBis_linetouched\fR returns \fBERR\fR if \fIline\fR is not
+valid for the given window.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion, unless otherwise noted in the
+preceding routine descriptions.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+
+Some historic curses implementations had, as an undocumented feature, the
+ability to do the equivalent of \fBclearok(..., 1)\fR by saying
+\fBtouchwin(stdscr)\fR or \fBclear(stdscr)\fR. This will not work under
+ncurses.
+.SH NOTES
+Note that all routines except \fBwtouchln\fR may be macros.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_refresh\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_util.3x b/contrib/ncurses/man/curs_util.3x
new file mode 100644
index 000000000000..8f85cf4ef66c
--- /dev/null
+++ b/contrib/ncurses/man/curs_util.3x
@@ -0,0 +1,114 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_util.3x,v 1.6 1998/03/11 21:12:53 juergen Exp $
+.TH curs_util 3X ""
+.SH NAME
+\fBunctrl\fR, \fBkeyname\fR, \fBfilter\fR,
+\fBuse_env\fR, \fBputwin\fR, \fBgetwin\fR, \fBdelay_output\fR,
+\fBflushinp\fR - miscellaneous \fBcurses\fR utility routines
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBchar *unctrl(chtype c);\fR
+.br
+\fBchar *keyname(int c);\fR
+.br
+\fBvoid filter(void);\fR
+.br
+\fBvoid use_env(char bool);\fR
+.br
+\fBint putwin(WINDOW *win, FILE *filep);\fR
+.br
+\fBWINDOW *getwin(FILE *filep);\fR
+.br
+\fBint delay_output(int ms);\fR
+.br
+\fBint flushinp(void);\fR
+.br
+.SH DESCRIPTION
+The \fBunctrl\fR macro expands to a character string which is a printable
+representation of the character \fIc\fR. Control characters are displayed in
+the \fB^\fR\fIX\fR notation. Printing characters are displayed as is.
+
+The \fBkeyname\fR routine returns a character string corresponding to
+the key \fIc\fR.
+
+The \fBfilter\fR routine, if used, must be called before \fBinitscr\fR or
+\fBnewterm\fR are called. The effect is that, during those calls, \fBLINES\fR
+is set to 1; the capabilities \fBclear\fR, \fBcup\fR, \fBcud\fR, \fBcud1\fR,
+\fBcuu1\fR, \fBcuu\fR, \fBvpa\fR are disabled; and the \fBhome\fR string is
+set to the value of \fBcr\fR.
+
+The \fBuse_env\fR routine, if used, is called before \fBinitscr\fR or
+\fBnewterm\fR are called. When called with \fBFALSE\fR as an
+argument, the values of \fBlines\fR and \fBcolumns\fR specified in the
+\fIterminfo\fR database will be used, even if environment variables
+\fBLINES\fR and \fBCOLUMNS\fR (used by default) are set, or if
+\fBcurses\fR is running in a window (in which case default behavior
+would be to use the window size if \fBLINES\fR and \fBCOLUMNS\fR are
+not set).
+
+The \fBputwin\fR routine writes all data associated with window \fIwin\fR into
+the file to which \fIfilep\fR points. This information can be later retrieved
+using the \fBgetwin\fR function.
+
+The \fBgetwin\fR routine reads window related data stored in the file by
+\fBputwin\fR. The routine then creates and initializes a new window using that
+data. It returns a pointer to the new window.
+
+The \fBdelay_output\fR routine inserts an \fIms\fR millisecond pause
+in output. This routine should not be used extensively because
+padding characters are used rather than a CPU pause.
+
+The \fBflushinp\fR 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\fR, routines that return an integer return \fBERR\fR
+upon failure and \fBOK\fR (SVr4 specifies only "an integer value other than
+\fBERR\fR") upon successful completion.
+
+\fBflushinp\fR always returns \fBOK\fR.
+
+Routines that return pointers return \fBNULL\fR on error.
+.SH PORTABILITY
+The XSI Curses standard, Issue 4 describes these functions.
+
+The SVr4 documentation describes the action of \fBfilter\fR only in the vaguest
+terms. The description here is adapted from the XSI Curses standard (which
+erroneously fails to describe the disabling of \fBcuu\fR).
+.SH NOTES
+Note that \fBunctrl\fR is a macro, which is defined in <\fBunctrl.h\fR>.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_initscr\fR(3X), \fBcurs_scr_dump\fR(3X).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/curs_window.3x b/contrib/ncurses/man/curs_window.3x
new file mode 100644
index 000000000000..623514e908ca
--- /dev/null
+++ b/contrib/ncurses/man/curs_window.3x
@@ -0,0 +1,152 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: curs_window.3x,v 1.8 1999/03/20 22:38:46 tom Exp $
+.TH curs_window 3X ""
+.SH NAME
+\fBnewwin\fR, \fBdelwin\fR, \fBmvwin\fR,
+\fBsubwin\fR, \fBderwin\fR, \fBmvderwin\fR, \fBdupwin\fR,
+\fBwsyncup\fR, \fBsyncok\fR, \fBwcursyncup\fR, \fBwsyncdown\fR -
+create \fBcurses\fR windows
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBWINDOW *newwin(int nlines, int ncols, int begin_y,\fR
+ \fBint begin_x);\fR
+.br
+\fBint delwin(WINDOW *win);\fR
+.br
+\fBint mvwin(WINDOW *win, int y, int x);\fR
+.br
+\fBWINDOW *subwin(WINDOW *orig, int nlines, int ncols,\fR
+ \fBint begin_y, int begin_x);\fR
+.br
+\fBWINDOW *derwin(WINDOW *orig, int nlines, int ncols,\fR
+ \fBint begin_y, int begin_x);\fR
+.br
+\fBint mvderwin(WINDOW *win, int par_y, int par_x);\fR
+.br
+\fBWINDOW *dupwin(WINDOW *win);\fR
+.br
+\fBvoid wsyncup(WINDOW *win);\fR
+.br
+\fBint syncok(WINDOW *win, bool bf);\fR
+.br
+\fBvoid wcursyncup(WINDOW *win);\fR
+.br
+\fBvoid wsyncdown(WINDOW *win);\fR
+.br
+.SH DESCRIPTION
+Calling \fBnewwin\fR 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 \fIbegin\fR_\fIy\fR, column \fIbegin\fR_\fIx\fR. If either
+\fInlines\fR or \fIncols\fR is zero, they default to \fBLINES -\fR
+\fIbegin\fR_\fIy\fR and \fBCOLS -\fR \fIbegin\fR_\fIx\fR. A new full-screen
+window is created by calling \fBnewwin(0,0,0,0)\fR.
+
+Calling \fBdelwin\fR 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.
+
+Calling \fBmvwin\fR moves the window so that the upper left-hand
+corner is at position (\fIx\fR, \fIy\fR). 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.
+
+Calling \fBsubwin\fR creates and returns a pointer to a new window
+with the given number of lines, \fInlines\fR, and columns,
+\fIncols\fR. The window is at position (\fIbegin\fR_\fIy\fR,
+\fIbegin\fR_\fIx\fR) on the screen. (This position is relative to the
+screen, and not to the window \fIorig\fR.) The window is made in the
+middle of the window \fIorig\fR, so that changes made to one window
+will affect both windows. The subwindow shares memory with the window
+\fIorig\fR. When using this routine, it is necessary to call
+\fBtouchwin\fR or \fBtouchline\fR on \fIorig\fR before calling
+\fBwrefresh\fR on the subwindow.
+
+Calling \fBderwin\fR is the same as calling \fBsubwin,\fR except that
+\fIbegin\fR_\fIy\fR and \fIbegin\fR_\fIx\fR are relative to the origin
+of the window \fIorig\fR rather than the screen. There is no
+difference between the subwindows and the derived windows.
+
+Calling \fBmvderwin\fR 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.
+
+Calling \fBdupwin\fR creates an exact duplicate of the window \fIwin\fR.
+
+Calling \fBwsyncup\fR touches all locations in ancestors of \fIwin\fR that are
+changed in \fIwin\fR. If \fBsyncok\fR is called with second argument
+\fBTRUE\fR then \fBwsyncup\fR is called automatically whenever there is a
+change in the window.
+
+The \fBwsyncdown\fR routine touches each location in \fIwin\fR that has been
+touched in any of its ancestor windows. This routine is called by
+\fBwrefresh\fR, so it should almost never be necessary to call it manually.
+
+The routine \fBwcursyncup\fR 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\fR upon failure and
+\fBOK\fR (SVr4 only specifies "an integer value other than \fBERR\fR") upon
+successful completion.
+
+\fBdelwin\fR returns the integer \fBERR\fR upon failure and \fBOK\fR
+upon successful completion.
+
+Routines that return pointers return \fBNULL\fR on error.
+.SH NOTES
+If many small changes are made to the window, the \fBwsyncup\fR option could
+degrade performance.
+
+Note that \fBsyncok\fR may be a macro.
+.SH BUGS
+The subwindow functions (\fIsubwin\fR, \fIderwin\fR, \fImvderwin\fR,
+\fBwsyncup\fR, \fBwsyncdown\fR, \fBwcursyncup\fR, \fBsyncok\fR) are flaky,
+incompletely implemented, and not well tested.
+
+The System V curses documentation is very unclear about what \fBwsyncup\fR
+and \fBwsyncdown\fR 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\fR 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.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBcurs_refresh\fR(3X), \fBcurs_touch\fR(3X)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/define_key.3x b/contrib/ncurses/man/define_key.3x
new file mode 100644
index 000000000000..047d78f8b82a
--- /dev/null
+++ b/contrib/ncurses/man/define_key.3x
@@ -0,0 +1,70 @@
+.\"***************************************************************************
+.\" Copyright (c) 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> 1997
+.\"
+.\" $Id: define_key.3x,v 1.6 1999/02/19 11:43:17 tom Exp $
+.TH define_key 3X ""
+.SH NAME
+\fBdefine_key\fP \- define a keycode
+..
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+
+\fBint define_key(char *definition, int keycode);\fP
+..
+.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, else ERR 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\fR(3X).
+..
+.SH AUTHOR
+Thomas Dickey.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/dft_fgbg.3x b/contrib/ncurses/man/dft_fgbg.3x
new file mode 100644
index 000000000000..2461256857b8
--- /dev/null
+++ b/contrib/ncurses/man/dft_fgbg.3x
@@ -0,0 +1,84 @@
+.\"***************************************************************************
+.\" Copyright (c) 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> 1997
+.\"
+.\" $Id: dft_fgbg.3x,v 1.6 1998/03/14 23:43:15 tom Exp $
+.TH use_default_colors 3X ""
+.SH NAME
+\fBdft_fgbg\fR \- use terminal's default colors
+..
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+
+\fBint use_default_colors(void);\fP
+..
+.SH DESCRIPTION
+This is an extension to the curses library.
+It is 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).
+Because they are designed to support this, their design usually includes
+features to change the default foreground or background colors so that
+they do not match the assumption in XSI curses of white on black.
+.PP
+Applications that paint a colored background over the whole screen
+are not adversely impacted by this type of terminal design.
+However, there are applications that are designed to work with
+the default background.
+..
+.SH RETURN VALUE
+The function returns the integer \fBERR\fP upon failure and \fBOK\fP on success.
+It will fail if either the terminal does not support
+the \fIorig_pair\fP or \fIorig_colors\fP capability.
+If the \fIinitialize_pair\fP capability is found, this causes an
+error as well.
+..
+.SH NOTES
+Associated with this extension, the \fBinit_pair\fR(3X) function accepts
+negative arguments to specify default foreground or background
+colors.
+..
+.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\fR(3X),
+\fBded\fP(1).
+..
+.SH AUTHOR
+Thomas Dickey (from an analysis of the requirements for color xterm
+for XFree86 3.1.2C, February 1996).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form.3x b/contrib/ncurses/man/form.3x
new file mode 100644
index 000000000000..51c1e8c15d5a
--- /dev/null
+++ b/contrib/ncurses/man/form.3x
@@ -0,0 +1,200 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form.3x,v 1.13 1999/07/10 21:53:03 tom Exp $
+.TH form 3X ""
+.SH NAME
+\fBform\fR - curses extension for programming forms
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+.SH DESCRIPTION
+The \fBform\fR 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 \fBform\fR library uses the \fBcurses\fR libraries, and a curses
+initialization routine such as \fBinitscr\fR must be called before using any of
+these functions. To use the \fBform\fR library, link with the options
+\fB-lform -lcurses\fR.
+
+.SS Current Default Values for Field Attributes
+
+The \fBform\fR library maintains a default value for field attributes. You
+can get or set this default by calling the appropriate \fBset_\fR
+or retrieval
+routine with a \fBNULL\fR field pointer. Changing this default with a
+\fBset_\fR 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\fR routine and the name of
+the manual page on which it is described.
+
+.TS
+l l
+l l .
+\fBcurses\fR Routine Name Manual Page Name
+=
+current_field \fBform_page\fR(3X)
+data_ahead \fBform_data\fR(3X)
+data_behind \fBform_data\fR(3X)
+dup_field \fBform_field_new\fR(3X)
+dynamic_fieldinfo \fBform_field_info\fR(3X)
+field_arg \fBform_field_validation\fR(3X)
+field_back \fBform_field_attributes\fR(3X)
+field_buffer \fBform_field_buffer\fR(3X)
+field_count \fBform_field\fR(3X)
+field_fore \fBform_field_attributes\fR(3X)
+field_index \fBform_page\fR(3X)
+field_info \fBform_field_info\fR(3X)
+field_init \fBform_hook\fR(3X)
+field_just \fBform_field_just\fR(3X)
+field_opts \fBform_field_opts\fR(3X)
+field_opts_off \fBform_field_opts\fR(3X)
+field_opts_on \fBform_field_opts\fR(3X)
+field_pad \fBform_field_attributes\fR(3X)
+field_status \fBform_field_buffer\fR(3X)
+field_term \fBform_hook\fR(3X)
+field_type \fBform_field_validation\fR(3X)
+field_userptr \fBform_field_userptr\fR(3X)
+form_driver \fBform_driver\fR(3X)
+form_fields \fBform_field\fR(3X)
+form_init \fBform_hook\fR(3X)
+form_opts \fBform_opts\fR(3X)
+form_opts_off \fBform_opts\fR(3X)
+form_opts_on \fBform_opts\fR(3X)
+form_page \fBform_page\fR(3X)
+form_request_by_name \fBform_requestname\fR(3X)
+form_request_name \fBform_requestname\fR(3X)
+form_sub \fBform_win\fR(3X)
+form_term \fBform_hook\fR(3X)
+form_userptr \fBform_userptr\fR(3X)
+form_win \fBform_win\fR(3X)
+free_field \fBform_field_new\fR(3X)
+free_form \fBform_new\fR(3X)
+link_field \fBform_field_new\fR(3X)
+link_fieldtype \fBform_fieldtype\fR(3X)
+move_field \fBform_field\fR(3X)
+new_field \fBform_field_new\fR(3X)
+new_form \fBform_new\fR(3X)
+new_page \fBform_new_page\fR(3X)
+pos_form_cursor \fBform_cursor\fR(3X)
+post_form \fBform_post\fR(3X)
+scale_form \fBform_win\fR(3X)
+set_current_field \fBform_page\fR(3X)
+set_field_back \fBform_field_attributes\fR(3X)
+set_field_buffer \fBform_field_buffer\fR(3X)
+set_field_fore \fBform_field_attributes\fR(3X)
+set_field_init \fBform_hook\fR(3X)
+set_field_just \fBform_field_just\fR(3X)
+set_field_opts \fBform_field_opts\fR(3X)
+set_field_pad \fBform_field_attributes\fR(3X)
+set_field_status \fBform_field_buffer\fR(3X)
+set_field_term \fBform_hook\fR(3X)
+set_field_type \fBform_field_validation\fR(3X)
+set_field_userptr \fBform_field_userptr\fR(3X)
+set_fieldtype_arg \fBform_fieldtype\fR(3X)
+set_fieldtype_choice \fBform_fieldtype\fR(3X)
+set_form_fields \fBform_field\fR(3X)
+set_form_init \fBform_hook\fR(3X)
+set_form_opts \fBform_field_opts\fR(3X)
+set_form_page \fBform_page\fR(3X)
+set_form_sub \fBform_win\fR(3X)
+set_form_term \fBform_hook\fR(3X)
+set_form_userptr \fBform_userptr\fR(3X)
+set_form_win \fBform_win\fR(3X)
+set_max_field \fBform_field_buffer\fR(3X)
+set_new_page \fBform_new_page\fR(3X)
+unpost_form \fBform_post\fR(3X)
+.TE
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fR on error. Routines that return
+an integer return one of the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_CONNECTED\fR
+The field is already connected to a form.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The form is already posted.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_NO_ROOM\fR
+Form is too large for its window.
+.TP 5
+\fBE_NOT_POSTED\fR
+The form has not been posted.
+.TP 5
+\fBE_UNKNOWN_COMMAND\fR
+The form driver code saw an unknown request code.
+.TP 5
+\fBE_INVALID_FIELD\fR
+Contents of a field are not valid.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No fields are connected to the form.
+.TP 5
+\fBE_REQUEST_DENIED\fR
+The form driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "form_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header files
+\fB<curses.h>\fR and \fB<eti.h>\fR.
+
+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 using GNU \fBld\fR(1) and many other linkers).
+.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 ncurses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_cursor.3x b/contrib/ncurses/man/form_cursor.3x
new file mode 100644
index 000000000000..ab37c99e7fae
--- /dev/null
+++ b/contrib/ncurses/man/form_cursor.3x
@@ -0,0 +1,74 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_cursor.3x,v 1.4 1998/11/29 01:05:43 Rick.Ohnemus Exp $
+.TH form_cursor 3X ""
+.SH NAME
+\fBform_cursor\fR - position a form window cursor
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int pos_form_cursor(FORM *form);
+.br
+.SH DESCRIPTION
+The function \fBpos_form_cursor\fR restores the cursor to the position required
+for the forms driver to continue processing requests. This is useful after
+\fBcurses\fR 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
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_NOT_POSTED\fR
+The form has not been posted.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_data.3x b/contrib/ncurses/man/form_data.3x
new file mode 100644
index 000000000000..3767e954590c
--- /dev/null
+++ b/contrib/ncurses/man/form_data.3x
@@ -0,0 +1,63 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_data.3x,v 1.7 1998/11/29 01:13:22 Rick.Ohnemus Exp $
+.TH form_data 3X ""
+.SH NAME
+\fBform_data\fR - test for off-screen data in given forms
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+bool data_ahead(const FORM *form);
+.br
+bool data_behind(const FORM *form);
+.br
+.SH DESCRIPTION
+The function \fBdata_ahead\fR tests whether there is off-screen data
+ahead in the given form. It returns TRUE (1) or FALSE (0).
+
+The function \fBdata_behind\fR tests whether there is off-screen data
+behind in the given form. It returns TRUE (1) or FALSE (0).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_driver.3x b/contrib/ncurses/man/form_driver.3x
new file mode 100644
index 000000000000..408aecd9ea42
--- /dev/null
+++ b/contrib/ncurses/man/form_driver.3x
@@ -0,0 +1,272 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: form_driver.3x,v 1.7 1999/07/10 23:13:18 tom Exp $
+.TH form_driver 3X ""
+.SH NAME
+\fBform_driver\fR - command-processing loop of the form system
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int form_driver(FORM *form, int c);
+.br
+.SH DESCRIPTION
+Once a form has been posted (displayed), you should funnel input events to it
+through \fBform_driver\fR. This routine has two major input cases; either
+the input is a form navigation request or it's a printable ASCII character.
+The form driver requests are as follows:
+.TP 5
+REQ_NEXT_PAGE
+Move to the next page.
+.TP 5
+REQ_PREV_PAGE
+Move to the previous page.
+.TP 5
+REQ_FIRST_PAGE
+Move to the first page.
+.TP 5
+REQ_LAST_PAGE
+Move to the last field.
+
+.TP 5
+REQ_NEXT_FIELD
+Move to the next field.
+.TP 5
+REQ_PREV_FIELD
+Move to the previous field.
+.TP 5
+REQ_FIRST_FIELD
+Move to the first field.
+.TP 5
+REQ_LAST_FIELD
+Move to the last field.
+.TP 5
+REQ_SNEXT_FIELD
+Move to the sorted next field.
+.TP 5
+REQ_SPREV_FIELD
+Move to the sorted previous field.
+.TP 5
+REQ_SFIRST_FIELD
+Move to the sorted first field.
+.TP 5
+REQ_SLAST_FIELD
+Move to the sorted last field.
+.TP 5
+REQ_LEFT_FIELD
+Move left to a field.
+.TP 5
+REQ_RIGHT_FIELD
+Move right to a field.
+.TP 5
+REQ_UP_FIELD
+Move up to a field.
+.TP 5
+REQ_DOWN_FIELD
+Move down to a field.
+
+.TP 5
+REQ_NEXT_CHAR
+Move to the next char.
+.TP 5
+REQ_PREV_CHAR
+Move to the previous char.
+.TP 5
+REQ_NEXT_LINE
+Move to the next line.
+.TP 5
+REQ_PREV_LINE
+Move to the previous line.
+.TP 5
+REQ_NEXT_WORD
+Move to the next word.
+.TP 5
+REQ_PREV_WORD
+Move to the previous word.
+.TP 5
+REQ_BEG_FIELD
+Move to the beginning of the field.
+.TP 5
+REQ_END_FIELD
+Move to the end of the field.
+.TP 5
+REQ_BEG_LINE
+Move to the beginning of the line.
+.TP 5
+REQ_END_LINE
+Move to the end of the line.
+.TP 5
+REQ_LEFT_CHAR
+Move left in the field.
+.TP 5
+REQ_RIGHT_CHAR
+Move right in the field.
+.TP 5
+REQ_UP_CHAR
+Move up in the field.
+.TP 5
+REQ_DOWN_CHAR
+Move down in the field.
+
+.TP 5
+REQ_NEW_LINE
+Insert or overlay a new line.
+.TP 5
+REQ_INS_CHAR
+Insert a blank at the cursor.
+.TP 5
+REQ_INS_LINE
+Insert a blank line at the cursor.
+.TP 5
+REQ_DEL_CHAR
+Delete character at the cursor.
+.TP 5
+REQ_DEL_PREV
+Delete character before the cursor.
+.TP 5
+REQ_DEL_LINE
+Delete line at the cursor.
+.TP 5
+REQ_DEL_WORD
+Delete blank-delimited word at the cursor.
+.TP 5
+REQ_CLR_EOL
+Clear to end of line from cursor.
+.TP 5
+REQ_CLR_EOF
+Clear to end of field from cursor.
+.TP 5
+REQ_CLR_FIELD
+Clear the entire field.
+.TP 5
+REQ_OVL_MODE
+Enter overlay mode.
+.TP 5
+REQ_INS_MODE
+Enter insert mode.
+
+.TP 5
+REQ_SCR_FLINE
+Scroll the field forward a line.
+.TP 5
+REQ_SCR_BLINE
+Scroll the field backward a line.
+.TP 5
+REQ_SCR_FPAGE
+Scroll the field forward a page.
+.TP 5
+REQ_SCR_BPAGE
+Scroll the field backward a page.
+.TP 5
+REQ_SCR_FHPAGE
+Scroll the field forward half a page.
+.TP 5
+REQ_SCR_BHPAGE
+Scroll the field backward half a page.
+
+.TP 5
+REQ_SCR_FCHAR
+Scroll the field forward a character.
+.TP 5
+REQ_SCR_BCHAR
+Scroll the field backward a character.
+.TP 5
+REQ_SCR_HFLINE
+Horizontal scroll the field forward a line.
+.TP 5
+REQ_SCR_HBLINE
+Horizontal scroll the field backward a line.
+.TP 5
+REQ_SCR_HFHALF
+Horizontal scroll the field forward half a line.
+.TP 5
+REQ_SCR_HBHALF
+Horizontal scroll the field backward half a line.
+
+.TP
+REQ_VALIDATION
+Validate field.
+.TP
+REQ_NEXT_CHOICE
+Display next field choice.
+.TP
+REQ_PREV_CHOICE
+Display previous field choice.
+.PP
+If the second argument is a printable ASCII 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.
+.PP
+If the second argument is neither printable ASCII nor one of the above
+pre-defined form requests, the driver assumes it is an application-specific
+command and returns \fBE_UNKNOWN_COMMAND\fR. Application-defined commands
+should be defined relative to \fBMAX_COMMAND\fR, the maximum value of these
+pre-defined requests.
+.SH RETURN VALUE
+\fBform_driver\fR return one of the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_NOT_POSTED\fR
+The form has not been posted.
+.TP 5
+\fBE_UNKNOWN_COMMAND\fR
+The form driver code saw an unknown request code.
+.TP 5
+\fBE_INVALID_FIELD\fR
+Contents of field is invalid.
+.TP 5
+\fBE_REQUEST_DENIED\fR
+The form driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header files
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field.3x b/contrib/ncurses/man/form_field.3x
new file mode 100644
index 000000000000..f452036baeab
--- /dev/null
+++ b/contrib/ncurses/man/form_field.3x
@@ -0,0 +1,97 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_field.3x,v 1.5 1998/11/29 01:05:52 Rick.Ohnemus Exp $
+.TH form_field 3X ""
+.SH NAME
+\fBform_field\fR - make and break connections between fields and forms
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_form_fields(FORM *form, FIELD **fields);
+.br
+FIELD **form_fields(const FORM *form);
+.br
+int field_count(const FORM *form);
+.br
+int move_field(FIELD *field, int frow, int fcol);
+.br
+.SH DESCRIPTION
+The function \fBset_form_fields\fR changes the field pointer array of
+the given \fIform\fR. The array must be terminated by a \fBNULL\fR.
+
+The function \fBform_fields\fR returns the field array of the given form.
+
+The function \fBfield_count\fR returns the count of fields in \fIform\fR.
+
+The function \fBmove_field\fR move the given field (which must be disconnected)
+to a specified location on the screen.
+.SH RETURN VALUES
+The function \fBform_fields\fR returns \fBNULL\fR on error.
+
+The function \fBfield_count\fR returns \fBERR\fR (the general
+\fBcurses\fR error return value) on error.
+
+The functions \fBset_form_fields\fR and \fBmove_field\fR return one of
+the following codes on error:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The form is already posted.
+.TP 5
+\fBE_CONNECTED\fR
+The field is already connected to a form.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+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 \fBfield_count\fR error value
+as -1 (which is the value of \fBERR\fR).
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_attributes.3x b/contrib/ncurses/man/form_field_attributes.3x
new file mode 100644
index 000000000000..7f6293dcef73
--- /dev/null
+++ b/contrib/ncurses/man/form_field_attributes.3x
@@ -0,0 +1,91 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_field_attributes.3x,v 1.5 1998/11/29 01:06:02 Rick.Ohnemus Exp $
+.TH form_field_attributes 3X ""
+.SH NAME
+\fBform_field_attributes\fR - color and attribute control for form fields
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_field_fore(FIELD *field, chtype attr);
+.br
+chtype field_fore(const FIELD *field);
+.br
+int set_field_back(FIELD *field, chtype attr);
+.br
+chtype field_back(const FIELD *field);
+.br
+int set_field_pad(FIELD *field, int pad);
+.br
+chtype field_pad(const FIELD *field);
+.br
+.SH DESCRIPTION
+The function \fBset_field_fore\fR sets the foreground attribute of
+\fIfield\fR. This is the highlight used to display the field contents. The
+function \fBfield_fore\fR returns the foreground attribute. The default is
+\fBA_STANDOUT\fR.
+
+The function \fBset_field_back\fR sets the background attribute of
+\fIform\fR. This is the highlight used to display the extent fields in the
+form. The function \fBfield_back\fR returns the background attribute. The
+default is \fBA_NORMAL\fR.
+
+The function \fBset_field_pad\fR sets the character used to fill the field.
+The function \fBfield_pad\fR returns the given form's pad character. The
+default is a blank.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "form_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_buffer.3x b/contrib/ncurses/man/form_field_buffer.3x
new file mode 100644
index 000000000000..202d4e7e0da5
--- /dev/null
+++ b/contrib/ncurses/man/form_field_buffer.3x
@@ -0,0 +1,99 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_field_buffer.3x,v 1.8 1999/06/16 00:37:09 juergen Exp $
+.TH form_field_buffer 3X ""
+.SH NAME
+\fBform_field_buffer\fR - field buffer control
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_field_buffer(FIELD *field, int buf, const char *value);
+.br
+char *field_buffer(const FIELD *field, int buffer);
+.br
+int set_field_status(FIELD *field, bool status);
+.br
+bool field_status(const FIELD *field);
+.br
+int set_max_field(FIELD *field, int max);
+.br
+.SH DESCRIPTION
+The function \fBset_field_buffer\fR sets the numbered buffer of the given field
+to contain a given string. Buffer 0 is the displayed value of the field; other
+numbered buffers may be allocated by applications through the \fBnbuf\fR
+argument of (see \fBform_field_new\fR(3X)) but are not manipulated by the forms
+library. The function \fBfield_buffer\fR returns the address of the buffer.
+Please note that this buffer has always the length of the buffer, that means
+that it may typically contain trailing spaces. If you entered leading spaces
+the buffer may also contain them. 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. Please note also, that subsequent operations on the form
+will probably change the content of the buffer. So don't use it for long term
+storage of the entered form data.
+
+The function \fBset_field_status\fR sets the associated status flag of
+\fIfield\fR; \fBfield_status\fR gets the current value. The status flag
+is set to a nonzero value whenever the field changes.
+
+The function \fBset_max_field\fR 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\fR function returns NULL on error.
+
+The \fBfield_status\fR function returns \fBTRUE\fR or \fBFALSE\fR.
+
+The remaining routines return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "form_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_info.3x b/contrib/ncurses/man/form_field_info.3x
new file mode 100644
index 000000000000..f64c662e6059
--- /dev/null
+++ b/contrib/ncurses/man/form_field_info.3x
@@ -0,0 +1,80 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_field_info.3x,v 1.5 1998/11/29 01:06:24 Rick.Ohnemus Exp $
+.TH form_field_info 3X ""
+.SH NAME
+\fBform_field_info\fR - retrieve field characteristics
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int field_info(const FIELD *field, int *rows, int *cols,
+ int *frow, int *fcol, int *nrow, int *nbuf);
+.br
+int dynamic_field_info(const FIELD *field, int *rows, int *cols, *max);
+.br
+.SH DESCRIPTION
+The function \fBfield_info\fR 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 \fBdynamic_field_info\fR 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\fR).
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "form_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_just.3x b/contrib/ncurses/man/form_field_just.3x
new file mode 100644
index 000000000000..dcb46768d96c
--- /dev/null
+++ b/contrib/ncurses/man/form_field_just.3x
@@ -0,0 +1,78 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_field_just.3x,v 1.5 1998/11/29 01:06:32 Rick.Ohnemus Exp $
+.TH form_field_just 3X ""
+.SH NAME
+\fBform_field_just\fR - retrieve field characteristics
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_field_just(FIELD *field, int justification);
+.br
+int field_just(const FIELD *field);
+.br
+.SH DESCRIPTION
+The function \fBset_field_just\fR sets the justification attribute of
+a field; \fBfield_just\fR 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\fR returns one of: NO_JUSTIFICATION,
+JUSTIFY_RIGHT, JUSTIFY_LEFT, or JUSTIFY_CENTER.
+
+The function \fBset_field_just\fR return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "form_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_new.3x b/contrib/ncurses/man/form_field_new.3x
new file mode 100644
index 000000000000..b798b5bb3e95
--- /dev/null
+++ b/contrib/ncurses/man/form_field_new.3x
@@ -0,0 +1,96 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: form_field_new.3x,v 1.9 1998/11/29 01:06:44 Rick.Ohnemus Exp $
+.TH form_field_new 3X ""
+.SH NAME
+\fBform_field_new\fR - create and destroy form fields
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+FIELD *new_field(int height, int width,
+ int toprow, int leftcol,
+ int offscreen, int nbuffers);
+.br
+FIELD *dup_field(FIELD *field, int toprow, int leftcol);
+.br
+FIELD *link_field(FIELD *field, int toprow, int leftcol);
+.br
+int free_field(FIELD *field);
+.br
+.SH DESCRIPTION
+The function \fBnew_field\fR 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 \fBdup_field\fR 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 \fBlink_field\fR acts like \fBdup_field\fR, but the new field
+shares buffers with its parent. Attribute data is separate.
+
+The function \fBfree_field\fR de-allocates storage associated with a field.
+.SH RETURN VALUE
+The function, \fBnew_field\fR, \fBdup_field\fR, \fBlink_field\fR return
+\fBNULL\fR on error.
+
+The function \fBfree_field\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+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
+\fBdup_field\fR(3X) being portable; the System V forms library documents are
+not very explicit on what gets copied and was not.
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_opts.3x b/contrib/ncurses/man/form_field_opts.3x
new file mode 100644
index 000000000000..8f5e2def4315
--- /dev/null
+++ b/contrib/ncurses/man/form_field_opts.3x
@@ -0,0 +1,120 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_field_opts.3x,v 1.7 1998/11/29 01:06:54 Rick.Ohnemus Exp $
+.TH form_field_opts 3X ""
+.SH NAME
+\fBform_field_opts\fR - set and get field options
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_field_opts(FIELD *field, OPTIONS opts);
+.br
+int field_opts_on(FIELD *field, OPTIONS opts);
+.br
+int field_opts_off(FIELD *field, OPTIONS opts);
+.br
+OPTIONS field_opts(const FIELD *field);
+.br
+.SH DESCRIPTION
+The function \fBset_field_opts\fR sets all the given field's option bits (field
+option bits may be logically-OR'ed together).
+
+The function \fBfield_opts_on\fR turns on the given option bits, and leaves
+others alone.
+
+The function \fBfield_opts_off\fR turns off the given option bits, and leaves
+others alone.
+
+The function \fBfield_opts\fR returns the field's current option bits.
+
+The following options are defined (all are on by default):
+.TP 5
+O_VISIBLE
+The field is displayed. If this option is off, display of the field is
+suppressed,
+.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_PUBLIC
+The field contents are displayed as data is entered.
+.TP 5
+O_EDIT
+The field can be edited.
+.TP 5
+O_WRAP
+Words that don't fit on a line are wrapped to the next line. Words are
+blank-separated.
+.TP 5
+O_BLANK
+The field is cleared whenever a character is entered at the first position.
+.TP 5
+O_AUTOSKIP
+Skip to the next field when this one fills
+.TP 5
+O_NULLOK
+Allow a blank field.
+.TP 5
+O_STATIC
+Field buffers are fixed to field's original size.
+.TP 5
+O_PASSOK
+Validate field only if modified by user.
+.SH RETURN VALUE
+Except for \fBfield_opts\fR, each routine returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_CURRENT\fR
+The field is the current field.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.TP 5
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_userptr.3x b/contrib/ncurses/man/form_field_userptr.3x
new file mode 100644
index 000000000000..2aba2083bc01
--- /dev/null
+++ b/contrib/ncurses/man/form_field_userptr.3x
@@ -0,0 +1,73 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_field_userptr.3x,v 1.6 1998/11/29 01:07:05 Rick.Ohnemus Exp $
+.TH form_field_userptr 3X ""
+.SH NAME
+\fBform_field_userptr\fR - associate application data with a form field
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_field_userptr(FIELD *field, void*userptr);
+.br
+void *field_userptr(const FIELD *field);
+.br
+.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\fR returns \fBNULL\fR on error. The function
+\fBset_field_userptr\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+These routines emulate the System V forms library. They were not supported on
+Version 7 or BSD versions.
+
+The user pointer should be a void pointer. We leave it as a char pointer for
+SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_field_validation.3x b/contrib/ncurses/man/form_field_validation.3x
new file mode 100644
index 000000000000..c3f90ba5cb4e
--- /dev/null
+++ b/contrib/ncurses/man/form_field_validation.3x
@@ -0,0 +1,127 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: form_field_validation.3x,v 1.10 1998/03/11 21:12:53 juergen Exp $
+.TH form_field_validation 3X ""
+.SH NAME
+\fBform_field_validation\fR - data type validation for fields
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_field_type(FIELD *field, FIELDTYPE *type, ...);
+.br
+FIELDTYPE *field_type(const FIELD *field);
+.br
+void *field_arg(const FIELD *field);
+.br
+.SH DESCRIPTION
+The function \fBset_field_type\fR declares a data type for a given form field.
+This is the type checked by validation functions. The types are as follows:
+.TP 5
+TYPE_ALNUM
+Alphanumeric data. Requires a third \fBint\fR argument, a minimum field width.
+.TP 5
+TYPE_ALPHA
+Character data. Requires a third \fBint\fR argument, a minimum field width.
+.TP 5
+TYPE_ENUM
+Accept one of a specified set of strings. Requires a third \fB(char **)\fR
+argument pointing to a string list; a fourth \fBint\fR flag argument to enable
+case-sensitivity; and a fifth \fBint\fR 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). Please notice
+that the string list is not copied, only a reference to it is stored in the
+field. So you should avoid to use a list that lives in automatic variables
+on the stack.
+.TP 5
+TYPE_INTEGER
+Integer data, parsable to an integer by \fBatoi(3)\fR. Requires a third
+\fBint\fR argument controlling the precision, a fourth \fBlong\fR argument
+constraining minimum value, and a fifth \fBlong\fR constraining maximum value.
+If the maximum value is less or equal the minimum value, the range is simply
+ignored. On return the field buffer is formatted according to the \fBprintf\fR
+format specification ".*ld", where the '*' is replaced by the precision argument.
+For details of the precision handling see \fBprintf's\fR man-page.
+.TP 5
+TYPE_NUMERIC
+Numeric data (may have a decimal-point part). Requires a third
+\fBint\fR argument controlling the precision, a fourth \fBdouble\fR
+argument constraining minimum value, and a fifth \fBdouble\fR constraining
+maximum value. If your system supports locale's, the decimal point character
+to be used must be the one specified by your locale.
+If the maximum value is less or equal the minimum value, the range is simply
+ignored. On return the field buffer is formatted according to the \fBprintf\fR
+format specification ".*f", where the '*' is replaced by the precision argument.
+For details of the precision handling see \fBprintf's\fR man-page.
+.TP 5
+TYPE_REGEXP
+Regular expression data. Requires a regular expression \fB(char *)\fR third argument;
+the data is valid if the regular expression matches it. Regular expressions
+are in the format of \fBregcomp\fR(3X) and \fBregexec\fR(3X). Please notice
+that 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. This requires no additional argument. It
+is checked whether or not the buffer has the form a.b.c.d, where a,b,c and d are
+numbers between 0 and 255. Trailing blanks in the buffer are ignored. The address
+itself is not validated. Please note that this is an ncurses extension. This
+field type may not be available in other curses implementations.
+
+It is possible to set up new programmer-defined field types. See the
+\fBform_fieldtype\fR(3X) manual page.
+.SH RETURN VALUE
+The functions \fBfield_type\fR and \fBfield_arg\fR return \fBNULL\fR on
+error. The function \fBset_field_type\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_fieldtype.3x b/contrib/ncurses/man/form_fieldtype.3x
new file mode 100644
index 000000000000..4c5dcb6616f8
--- /dev/null
+++ b/contrib/ncurses/man/form_fieldtype.3x
@@ -0,0 +1,126 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_fieldtype.3x,v 1.7 1998/11/29 01:07:16 Rick.Ohnemus Exp $
+.TH form_field 3X ""
+.SH NAME
+\fBform_fieldtype\fR - define validation-field types
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+FIELDTYPE *new_fieldtype(
+ bool (* const field_check)(FIELD *, const void *),
+ bool (* const char_check)(int, const void *));
+.br
+int free_fieldtype(FIELDTYPE *fieldtype);
+.br
+int set_fieldtype_arg(
+ FIELDTYPE *fieldtype,
+ void *(* const make_arg)(va_list *),
+ void *(* const copy_arg)(const void *),
+ void (* const free_arg)(void *));
+.br
+int set_fieldtype_choice(
+ FIELDTYPE *fieldtype
+ bool (* const next_choice)(FIELD *, const void *),
+ bool (* const prev_choice)(FIELD *, const void *));
+.br
+FIELDTYPE *link_fieldtype(FIELDTYPE *type1,
+ FIELDTYPE *type2);
+.br
+.SH DESCRIPTION
+The function \fBnew_fieldtype\fR creates a new field type usable for data
+validation. You supply it with \fIfield_check\fR, a predicate to check the
+validity of an entered data string whenever the user attempt to leave a field.
+The (FIELD *) argument is passed in so the validation predicate can see the
+field's buffer, sizes and other attributes; the second argument is an
+argument-block structure, about which more below.
+
+You also supply \fBnew_fieldtype\fR with \fIchar_check\fR,
+a function to validate input characters as they are entered; it will be passed
+the character to be checked and a pointer to an argument-block structure.
+
+The function \fBfree_fieldtype\fR frees the space allocated for a given
+validation type.
+
+The function \fBset_fieldtype\fR associates three storage-management functions
+with a field type. The \fImak_arg\fR function is automatically applied to the
+list of arguments you give \fBset_field_type\fR when attaching validation
+to a field; its job is to bundle these into an allocated argument-block
+object which can later be passed to validation predicated. The other two
+hook arguments should copy and free argument-block structures. They will
+be used by the forms-driver code. You must supply the \fImak_arg\fR function,
+the other two are optional, you may supply NULL for them. In this case it
+is assumed, that \fImak_arg\fR doesn't allocate memory but simply loads the
+argument into a single scalar value.
+
+The form driver requests \fBREQ_NEXT_CHOICE\fR and \fBREQ_PREV_CHOICE\fR 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 \fBset_fieldtype_choice\fR
+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.
+.SH RETURN VALUE
+The pointer-valued routines return NULL on error.
+
+The integer-valued routines return one of the following codes on
+error:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_CONNECTED\fR
+The field is already connected to a form.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+
+All of the \fB(char *)\fR arguments of these functions should actually be
+\fB(void *)\fR. The type has been left uncorrected for strict compatibility
+with System V.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_hook.3x b/contrib/ncurses/man/form_hook.3x
new file mode 100644
index 000000000000..19c1b9fbd7a0
--- /dev/null
+++ b/contrib/ncurses/man/form_hook.3x
@@ -0,0 +1,100 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_hook.3x,v 1.6 1999/03/20 22:37:15 Todd.Miller Exp $
+.TH form_hook 3X ""
+.SH NAME
+\fBform_hook\fR - set hooks for automatic invocation by applications
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_field_init(FORM *form, void (*func)(FORM *));
+.br
+void (*)(FORM *) field_init(const FORM *form);
+.br
+int set_field_term(FORM *form, void (*func)(FORM *));
+.br
+void (*)(FORM *) field_term(const FORM *form);
+.br
+int set_form_init(FORM *form, void (*func)(FORM *));
+.br
+void (*)(FORM *) form_init(const FORM *form);
+.br
+int set_form_term(FORM *form, void (*func)(FORM *));
+.br
+void (*)(FORM *) form_term(const FORM *form);
+.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\fR.
+
+The function \fBset_field_init\fR sets a hook to be called at form-post time
+and each time the selected field changes (after the change). \fBfield_init\fR
+returns the current field init hook, if any (\fBNULL\fR if there is no such
+hook).
+
+The function \fBset_field_term\fR sets a hook to be called at form-unpost time
+and each time the selected field changes (before the change). \fBfield_term\fR
+returns the current field term hook, if any (\fBNULL\fR if there is no such
+hook).
+
+The function \fBset_form_init\fR sets a hook to be called at form-post time and
+just after a page change once it is posted. \fBform_init\fR returns the
+current form init hook, if any (\fBNULL\fR if there is no such hook).
+
+The function \fBset_form_term\fR sets a hook to be called at form-unpost time
+and just before a page change once it is posted. \fBform_init\fR
+returns the current form term hook, if any (\fBNULL\fR if there is no such
+hook).
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fR on error. Other routines
+return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_new.3x b/contrib/ncurses/man/form_new.3x
new file mode 100644
index 000000000000..0f4c5015d11b
--- /dev/null
+++ b/contrib/ncurses/man/form_new.3x
@@ -0,0 +1,79 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_new.3x,v 1.5 1998/11/29 01:07:37 Rick.Ohnemus Exp $
+.TH form_new 3X ""
+.SH NAME
+\fBform_new\fR - create and destroy forms
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+FORM *new_form(FIELD **fields);
+.br
+int free_form(FORM *form);
+.br
+.SH DESCRIPTION
+The function \fBnew_form\fR creates a new form connected to a specified field
+pointer array (which must be \fBNULL\fR-terminated).
+
+The function \fBfree_form\fR disconnects \fIform\fR from its field array
+and frees the storage allocated for the form.
+.SH RETURN VALUE
+The function \fBnew_form\fR returns \fBNULL\fR on error.
+
+The function \fBfree_form\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The form has already been posted.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_new_page.3x b/contrib/ncurses/man/form_new_page.3x
new file mode 100644
index 000000000000..b93b48c18c88
--- /dev/null
+++ b/contrib/ncurses/man/form_new_page.3x
@@ -0,0 +1,77 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_new_page.3x,v 1.5 1998/11/29 01:07:45 Rick.Ohnemus Exp $
+.TH form_new_page 3X ""
+.SH NAME
+\fBform_new_page\fR - form pagination functions
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_new_page(FIELD *field, bool new_page_flag);
+.br
+bool new_page(const FIELD *field);
+.br
+.SH DESCRIPTION
+The function \fBset_new_page\fR sets or resets a flag marking the given field
+as the beginning of a new page on its form.
+
+The function \fBnew_page\fR is a predicate which tests if a given field marks
+a page beginning on its form.
+.SH RETURN VALUE
+The function \fBnew_page\fR returns \fBTRUE\fR or \fBFALSE\fR.
+
+The function \fBset_new_page\fR return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_CONNECTED\fR
+The given field is already connected to a form.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "form_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_opts.3x b/contrib/ncurses/man/form_opts.3x
new file mode 100644
index 000000000000..7921b3772563
--- /dev/null
+++ b/contrib/ncurses/man/form_opts.3x
@@ -0,0 +1,90 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_opts.3x,v 1.6 1998/11/29 01:07:53 Rick.Ohnemus Exp $
+.TH form_opts 3X ""
+.SH NAME
+\fBform_opts\fR - set and get form options
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_form_opts(FORM *form, OPTIONS opts);
+.br
+int form_opts_on(FORM *form, OPTIONS opts);
+.br
+int form_opts_off(FORM *form, OPTIONS opts);
+.br
+OPTIONS form_opts(const FORM *form);
+.br
+.SH DESCRIPTION
+The function \fBset_form_opts\fR sets all the given form's option bits (form
+option bits may be logically-OR'ed together).
+
+The function \fBform_opts_on\fR turns on the given option bits, and leaves
+others alone.
+
+The function \fBform_opts_off\fR turns off the given option bits, and leaves
+others alone.
+
+The function \fBform_opts\fR returns the form's current option bits.
+
+The following options are defined (all are on by default):
+.TP 5
+O_NL_OVERLOAD
+Overload the \fBREQ_NEW_LINE\fR 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\fR 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\fR, each routine returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_page.3x b/contrib/ncurses/man/form_page.3x
new file mode 100644
index 000000000000..4b5d15aec18e
--- /dev/null
+++ b/contrib/ncurses/man/form_page.3x
@@ -0,0 +1,95 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_page.3x,v 1.8 1998/11/29 01:08:02 Rick.Ohnemus Exp $
+.TH form_page 3X ""
+.SH NAME
+\fBform_page\fR - set and get form page number
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_current_field(FORM *form, FIELD *field);
+.br
+FIELD *current_field(const FORM *);
+.br
+int set_form_page(FORM *form, int n);
+.br
+int form_page(const FORM *form);
+.br
+int field_index(const FIELD *field);
+.br
+.SH DESCRIPTION
+The function \fBset_current field\fR sets the current field of the given
+form; \fBcurrent_field\fR returns the current field of the given form.
+.PP
+The function \fBset_form_page\fR sets the form's page number (goes to page
+\fIn\fR of the form).
+.PP
+The function \fBform_page\fR returns the form's current page number.
+.PP
+The function \fBfield_index\fR returns the index of the field in the
+field array of the form it is connected to. It returns \fBERR\fR if
+the argument is the null pointer or the field is not connected.
+.SH RETURN VALUE
+Except for \fBform_page\fR, each routine returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_INVALID_FIELD\fR
+Contents of a field are not valid.
+.TP 5
+\fBE_REQUEST_DENIED\fR
+The form driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_post.3x b/contrib/ncurses/man/form_post.3x
new file mode 100644
index 000000000000..56e86ab94692
--- /dev/null
+++ b/contrib/ncurses/man/form_post.3x
@@ -0,0 +1,90 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_post.3x,v 1.4 1998/11/29 01:08:10 Rick.Ohnemus Exp $
+.TH form_post 3X ""
+.SH NAME
+\fBform_post\fR - write or erase forms from associated subwindows
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int post_form(FORM *form);
+.br
+int unpost_form(FORM *form);
+.br
+.SH DESCRIPTION
+The function \fBpost_form\fR displays a form to its associated subwindow. To
+trigger physical display of the subwindow, use \fBrefresh\fR or some equivalent
+\fBcurses\fR routine (the implicit \fBdoupdate\fR triggered by an \fBcurses\fR
+input request will do).
+
+The function \fBunpost_form\fR erases form from its associated subwindow.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The form has already been posted.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_NO_ROOM\fR
+Form is too large for its window.
+.TP 5
+\fBE_NOT_POSTED\fR
+The form has not been posted.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No items are connected to the form.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_requestname.3x b/contrib/ncurses/man/form_requestname.3x
new file mode 100644
index 000000000000..df1f701b382e
--- /dev/null
+++ b/contrib/ncurses/man/form_requestname.3x
@@ -0,0 +1,69 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_requestname.3x,v 1.6 1998/11/29 01:08:18 Rick.Ohnemus Exp $
+.TH form_requestname 3X ""
+.SH NAME
+\fBform_requestname\fR - handle printable form request names
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+const char *form_request_name(int request);
+.br
+int form_request_by_name(const char *name);
+.br
+.SH DESCRIPTION
+The function \fBform_request_name\fR returns the printable name of a form
+request code.
+.br
+The function \fBform_request_by_name\fR 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\fR returns \fBNULL\fR on error and sets errno
+to \fBE_BAD_ARGUMENT\fR.
+.br
+\fBform_request_by_name\fR returns \fBE_NO_MATCH\fR on error.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_userptr.3x b/contrib/ncurses/man/form_userptr.3x
new file mode 100644
index 000000000000..00e3d71aa40e
--- /dev/null
+++ b/contrib/ncurses/man/form_userptr.3x
@@ -0,0 +1,73 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_userptr.3x,v 1.9 1998/11/29 01:08:39 Rick.Ohnemus Exp $
+.TH form_userptr 3X ""
+.SH NAME
+\fBform_userptr\fR - associate application data with a form item
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_form_userptr(FORM *form, void *userptr);
+.br
+void* form_userptr(const FORM *form);
+.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\fR returns \fBNULL\fR on error.
+The function \fBset_form_userptr\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+These routines emulate the System V forms library. They were not supported on
+Version 7 or BSD versions.
+
+The user pointer should be a void pointer. We leave it as a char pointer for
+SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/form_win.3x b/contrib/ncurses/man/form_win.3x
new file mode 100644
index 000000000000..e56597028868
--- /dev/null
+++ b/contrib/ncurses/man/form_win.3x
@@ -0,0 +1,95 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: form_win.3x,v 1.8 1999/04/10 23:36:08 tom Exp $
+.TH form_win 3X ""
+.SH NAME
+\fBform_win\fR - make and break form window and subwindow associations
+.SH SYNOPSIS
+\fB#include <form.h>\fR
+.br
+int set_form_win(FORM *form, WINDOW *win);
+.br
+WINDOW *form_win(const FORM *form);
+.br
+int set_form_sub(FORM *form, WINDOW *sub);
+.br
+WINDOW *form_sub(const FORM *form);
+.br
+int scale_form(const FORM *form, int *rows, int *columns);
+.br
+.SH DESCRIPTION
+Every form has an associated pair of \fBcurses\fR 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 \fBstdscr\fR for both.
+
+In the \fBset_\fR functions, window argument of \fBNULL\fR is treated as though
+it were \fBstsdcr\fR. A form argument of \fBNULL\fR is treated as a request
+to change the system default form window or subwindow.
+
+The function \fBscale_form\fR returns the minimum size required for the
+subwindow of \fIform\fR.
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fR on error. Routines that return
+an integer return one of the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The form has already been posted.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No items are connected to the form.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBform\fR(3X).
+.SH NOTES
+The header file \fB<form.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/infocmp.1m b/contrib/ncurses/man/infocmp.1m
new file mode 100644
index 000000000000..11fa217243fe
--- /dev/null
+++ b/contrib/ncurses/man/infocmp.1m
@@ -0,0 +1,364 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: infocmp.1m,v 1.21 1999/06/15 23:12:25 tom Exp $
+.TH infocmp 1M ""
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+\fBinfocmp\fR - compare or print out \fIterminfo\fR descriptions
+.SH SYNOPSIS
+\fBinfocmp\fR [\fB-dceEGgnpILCuV1\fR] [\fB-v\fR \fIn\fR] [\fB-s d\fR| \fBi\fR| \fBl\fR| \fBc\fR]
+.br
+ [\fB-w\fR\ \fIwidth\fR] [\fB-A\fR\ \fIdirectory\fR] [\fB-B\fR\ \fIdirectory\fR]
+.br
+ [\fItermname\fR...]
+.SH DESCRIPTION
+\fBinfocmp\fR can be used to compare a binary \fBterminfo\fR entry with other
+terminfo entries, rewrite a \fBterminfo\fR description to take advantage of the
+\fBuse=\fR terminfo field, or print out a \fBterminfo\fR description from the
+binary file (\fBterm\fR) 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\fR are specified, the
+\fB-I\fR option will be assumed. If more than one \fItermname\fR is specified,
+the \fB-d\fR option will be assumed.
+..
+.SS Comparison Options [-d] [-c] [-n]
+\fBinfocmp\fR compares the \fBterminfo\fR description of the first terminal
+\fItermname\fR with each of the descriptions given by the entries for the other
+terminal's \fItermnames\fR. If a capability is defined for only one of the
+terminals, the value returned will depend on the type of the capability:
+\fBF\fR for boolean variables, \fB-1\fR for integer variables, and \fBNULL\fR
+for string variables.
+
+The \fB-d\fR option produces a list of each capability that is different
+between two entries. This option is useful to show the difference between two
+entries, created by different people, for the same or similar terminals.
+
+The \fB-c\fR option produces a list of each capability that is common between
+two entries. Capabilities that are not set are ignored. This option can be
+used as a quick check to see if the \fB-u\fR option is worth using.
+
+The \fB-n\fR option produces a list of each capability that is in neither
+entry. If no \fItermnames\fR are given, the environment variable \fBTERM\fR
+will be used for both of the \fItermnames\fR. This can be used as a quick
+check to see if anything was left out of a description.
+..
+.SS Source Listing Options [-I] [-L] [-C] [-r]
+The \fB-I\fR, \fB-L\fR, and \fB-C\fR options will produce a source listing for
+each terminal named.
+
+.TS
+center tab(/) ;
+l l .
+\fB-I\fR/use the \fBterminfo\fR names
+\fB-L\fR/use the long C variable name listed in <\fBterm.h\fR>
+\fB-C\fR/use the \fBtermcap\fR names
+\fB-r\fR/when using \fB-C\fR, put out all capabilities in \fBtermcap\fR form
+.TE
+
+If no \fItermnames\fR are given, the environment variable \fBTERM\fR will be
+used for the terminal name.
+
+The source produced by the \fB-C\fR option may be used directly as a
+\fBtermcap\fR entry, but not all parameterized strings can be changed to
+the \fBtermcap\fR format. \fBinfocmp\fR 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.
+
+All padding information for strings will be collected together and placed
+at the beginning of the string where \fBtermcap\fR expects it. Mandatory
+padding (padding information with a trailing '/') will become optional.
+
+All \fBtermcap\fR variables no longer supported by \fBterminfo\fR, but which
+are derivable from other \fBterminfo\fR variables, will be output. Not all
+\fBterminfo\fR capabilities will be translated; only those variables which were
+part of \fBtermcap\fR will normally be output. Specifying the \fB-r\fR option
+will take off this restriction, allowing all capabilities to be output in
+\fItermcap\fR form.
+
+Note that because padding is collected to the beginning of the capability, not
+all capabilities are output. Mandatory padding is not supported. Because
+\fBtermcap\fR strings are not as flexible, it is not always possible to convert
+a \fBterminfo\fR string capability into an equivalent \fBtermcap\fR format. A
+subsequent conversion of the \fBtermcap\fR file back into \fBterminfo\fR format
+will not necessarily reproduce the original \fBterminfo\fR
+source.
+
+Some common \fBterminfo\fR parameter sequences, their \fBtermcap\fR
+equivalents, and some terminal types which commonly have such sequences, are:
+
+.TS
+center tab(/) ;
+l c l
+l l l.
+\fBterminfo/termcap\fR/Representative Terminals
+=
+\fB%p1%c/%.\fR/adm
+\fB%p1%d/%d\fR/hp, ANSI standard, vt100
+\fB%p1%'x'%+%c/%+x\fR/concept
+\fB%i/%i\fRq/ANSI standard, vt100
+\fB%p1%?%'x'%>%t%p1%'y'%+%;/%>xy\fR/concept
+\fB%p2\fR is printed before \fB%p1/%r\fR/hp
+.TE
+.SS Use= Option [-u]
+The \fB-u\fR option produces a \fBterminfo\fR source description of the first
+terminal \fItermname\fR which is relative to the sum of the descriptions given
+by the entries for the other terminals \fItermnames\fR. It does this by
+analyzing the differences between the first \fItermname\fR and the other
+\fItermnames\fR and producing a description with \fBuse=\fR 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 \fBinfocmp\fR will show what can be done to change
+one description to be relative to the other.
+
+A capability will get printed with an at-sign (@) if it no longer exists in the
+first \fItermname\fR, but one of the other \fItermname\fR entries contains a
+value for it. A capability's value gets printed if the value in the first
+\fItermname\fR is not found in any of the other \fItermname\fR entries, or if
+the first of the other \fItermname\fR entries that has this capability gives a
+different value for the capability than that in the first \fItermname\fR.
+
+The order of the other \fItermname\fR entries is significant. Since the
+terminfo compiler \fBtic\fR does a left-to-right scan of the capabilities,
+specifying two \fBuse=\fR entries that contain differing entries for the same
+capabilities will produce different results depending on the order that the
+entries are given in. \fBinfocmp\fR will flag any such inconsistencies between
+the other \fItermname\fR entries as they are found.
+
+Alternatively, specifying a capability \fIafter\fR a \fBuse=\fR entry that
+contains that capability will cause the second specification to be ignored.
+Using \fBinfocmp\fR 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 \fBuse=\fR fields that are
+superfluous. \fBinfocmp\fR will flag any other \fItermname use=\fR fields that
+were not needed.
+..
+.SS Changing Databases [-A \fIdirectory\fR] [-B \fIdirectory\fR]
+The location of the compiled \fBterminfo\fR database is taken from the
+environment variable \fBTERMINFO\fR . If the variable is not defined, or the
+terminal is not found in that location, the system \fBterminfo\fR database,
+in \fB@DATADIR@/terminfo\fR, will be used. The options \fB-A\fR
+and \fB-B\fR may be used to override this location. The \fB-A\fR option will
+set \fBTERMINFO\fR for the first \fItermname\fR and the \fB-B\fR option will
+set \fBTERMINFO\fR for the other \fItermnames\fR. With this, it is possible to
+compare descriptions for a terminal with the same name located in two different
+databases. This is useful for comparing descriptions for the same terminal
+created by different people.
+..
+.SS Other Options [-s d|i|l|c] [-1FTVefip] [-Rsubset] [-v \fIn\fR] [-w \fIwidth\fR]
+The \fB-s\fR option sorts the fields within each type according to the argument
+below:
+..
+.TP 5
+\fBd\fR
+leave fields in the order that they are stored in the \fIterminfo\fR database.
+.TP 5
+\fBi\fR
+sort by \fIterminfo\fR name.
+.TP 5
+\fBl\fR
+sort by the long C variable name.
+.TP 5
+\fBc\fR
+sort by the \fItermcap\fR name.
+
+If the \fB-s\fR option is not given, the fields printed out will be
+sorted alphabetically by the \fBterminfo\fR name within each type,
+except in the case of the \fB-C\fR or the \fB-L\fR options, which cause the
+sorting to be done by the \fBtermcap\fR name or the long C variable
+name, respectively.
+.TP 5
+\fB-1\fR
+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 5
+\fB-F\fR
+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.
+.TP
+\fB-G\fR
+Display constant literals in decimal form
+rather than their character equivalents.
+.TP 5
+\fB-R\fR\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 don't support
+the full set of SVR4/XSI Curses terminfo; and outright broken ports like AIX
+that have their own extensions incompatible with SVr4/XSI. Available terminfo
+subsets are "SVr1", "Ultrix", "HP", and "AIX"; see \fBterminfo\fR(\*n) for
+details. You can also choose the subset "BSD" which selects only capabilities
+with termcap equivalents recognized by 4.4BSD.
+.TP 5
+\fB-T\fR
+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 5
+\fB-V\fR
+prints out the version of the program in use on standard error and exits.
+.TP 5
+\fB-e\fR
+Dump the capabilities of the given terminal as a C initializer for a
+TERMTYPE structure (the terminal capability structure in the \fB<term.h>\fR).
+This option is useful for preparing versions of the curses library hardwired
+for a given terminal type.
+.TP 5
+\fB-E\fR
+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>\fR).
+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
+\fB-f\fR
+Display complex terminfo strings which contain if/then/else/endif expressions
+indented for readability.
+.TP
+\fB-g\fR
+Display constant character literals in quoted form
+rather than their decimal equivalents.
+.TP 5
+\fB-i\fR
+Analyze the initialization (\fBis1\fR, \fBis2\fR, \fBis3\fR), and reset
+(\fBrs1\fR, \fBrs2\fR, \fBrs3\fR), strings in the entry. 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:
+
+.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
+
+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
+
+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 `+' (turn on) or `-' (turn off).
+
+An SGR0 designates an empty highlight sequence (equivalent to {SGR:NORMAL}).
+.TP 5
+\fB-p\fR
+Ignore padding specifications when comparing strings.
+.TP 5
+\fB-v\fR \fIn\fR
+prints out tracing information on standard error as the program runs.
+Higher values of n induce greater verbosity.
+.TP 5
+\fB-w\fR \fIwidth\fR
+changes the output to \fIwidth\fR characters.
+..
+.SH FILES
+.TP 20
+\*d
+Compiled terminal description database.
+..
+.SH EXTENSIONS
+The
+\fB-E\fR,
+\fB-F\fR,
+\fB-G\fR,
+\fB-R\fR,
+\fB-T\fR,
+\fB-e\fR,
+\fB-f\fR,
+\fB-g\fR,
+\fB-i\fR, and
+\fB-p\fR
+options are not supported in SVr4 curses.
+
+The \fB-r\fR 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 -r -RBSD.
+.SH BUGS
+The -F option of \fBinfocmp\fR(1M) should be a \fBtoe\fR(1M) mode.
+.SH SEE ALSO
+\fBinfocmp\fR(1M), \fBcaptoinfo\fR(1M), \fBinfotocap\fR(1M),
+\fBtic\fR(1M), \fBtoe\fR(1M),
+\fBcurses\fR(3X), \fBterminfo\fR(\*n).
+.SH AUTHOR
+Eric S. Raymond <esr@snark.thyrsus.com>
+and
+Thomas E. Dickey <dickey@clark.net>
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/keybound.3x b/contrib/ncurses/man/keybound.3x
new file mode 100644
index 000000000000..e6bf5e4e731a
--- /dev/null
+++ b/contrib/ncurses/man/keybound.3x
@@ -0,0 +1,67 @@
+.\"***************************************************************************
+.\" Copyright (c) 1999 Free Software Foundation, Inc. *
+.\" *
+.\" Permission is hereby granted, free of charge, to any person obtaining a *
+.\" copy of this software and associated documentation files (the *
+.\" "Software"), to deal in the Software without restriction, including *
+.\" without limitation the rights to use, copy, modify, merge, publish, *
+.\" distribute, distribute with modifications, sublicense, and/or sell *
+.\" copies of the Software, and to permit persons to whom the Software is *
+.\" furnished to do so, subject to the following conditions: *
+.\" *
+.\" The above copyright notice and this permission notice shall be included *
+.\" in all copies or substantial portions of the Software. *
+.\" *
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+.\" *
+.\" Except as contained in this notice, the name(s) of the above copyright *
+.\" holders 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: keybound.3x,v 1.1 1999/02/19 11:59:24 tom Exp $
+.TH keyok 3X ""
+.SH NAME
+\fBkeybound\fP \- return definition of keycode
+..
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+
+\fBint keybound(int keycode, int count);\fP
+..
+.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 keycode must be greater than zero, else NULL is returned.
+If it does not correspond to a defined key, then NULL is returned.
+Otherwise, 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\fR(3X),
+\fBkeyok\fR(3X).
+..
+.SH AUTHOR
+Thomas Dickey.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/keyok.3x b/contrib/ncurses/man/keyok.3x
new file mode 100644
index 000000000000..21befe83ca4b
--- /dev/null
+++ b/contrib/ncurses/man/keyok.3x
@@ -0,0 +1,69 @@
+.\"***************************************************************************
+.\" Copyright (c) 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> 1997
+.\"
+.\" $Id: keyok.3x,v 1.5 1998/03/14 23:43:07 tom Exp $
+.TH keyok 3X ""
+.SH NAME
+\fBkeyok\fP \- enable or disable a keycode
+..
+.SH SYNOPSIS
+\fB#include <curses.h>\fP
+
+\fBint keyok(int keycode, bool enable);\fP
+..
+.SH DESCRIPTION
+This is an extension to the curses library.
+It permits an application to disable specific keycodes, rather than
+use the \fIkeypad\fP function to disable all keycodes.
+Keys that have been disabled can be reenabled.
+..
+.SH RETURN VALUE
+The keycode must be greater than zero, else ERR is returned.
+If it does not correspond to a defined key, then ERR is returned.
+If the \fIenable\fP parameter is true, then the key must have been disabled,
+and vice versa.
+Otherwise, the function returns OK.
+..
+.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\fR(3X).
+..
+.SH AUTHOR
+Thomas Dickey.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/make_sed.sh b/contrib/ncurses/man/make_sed.sh
new file mode 100755
index 000000000000..c6c37c25b0d5
--- /dev/null
+++ b/contrib/ncurses/man/make_sed.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+# $Id: make_sed.sh,v 1.5 1998/02/11 12:13:48 tom Exp $
+##############################################################################
+# Copyright (c) 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> 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" 0 1 2 5 15
+fgrep -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
+
+# Do the TH lines
+sed -e 's/\//\/TH /' \
+ -e 's/ / /' \
+ -e 's/ / ""\/TH /' \
+ -e 's/ / /' \
+ -e 's/\/$/ ""\//' \
+ $UPPER >>$RESULT
+
+# Do the embedded references
+sed -e 's/</<fB/' \
+ -e 's/ /\\\\fR(/' \
+ -e 's/ /)\/fB/' \
+ -e 's/ /\\\\fR(/' \
+ -e 's/\/$/)\//' \
+ $UPPER >>$RESULT
+
+# Finally, send the result to standard output
+cat $RESULT
diff --git a/contrib/ncurses/man/man_db.renames b/contrib/ncurses/man/man_db.renames
new file mode 100644
index 000000000000..b1ae37c1f22d
--- /dev/null
+++ b/contrib/ncurses/man/man_db.renames
@@ -0,0 +1,113 @@
+# $Id: man_db.renames,v 0.14 1999/02/20 12:43:56 tom Exp $
+# Manual-page renamings for the man_db program
+#
+captoinfo.1m captoinfo.1
+clear.1 clear.1
+curs_addch.3x addch.3ncurses
+curs_addchstr.3x addchstr.3ncurses
+curs_addstr.3x addstr.3ncurses
+curs_attr.3x attr.3ncurses
+curs_beep.3x beep.3ncurses
+curs_bkgd.3x bkgd.3ncurses
+curs_border.3x border.3ncurses
+curs_clear.3x clear.3ncurses
+curs_color.3x color.3ncurses
+curs_delch.3x delch.3ncurses
+curs_deleteln.3x deleteln.3ncurses
+curs_getch.3x getch.3ncurses
+curs_getstr.3x getstr.3ncurses
+curs_getyx.3x getyx.3ncurses
+curs_inch.3x inch.3ncurses
+curs_inchstr.3x inchstr.3ncurses
+curs_initscr.3x initscr.3ncurses
+curs_inopts.3x inopts.3ncurses
+curs_insch.3x insch.3ncurses
+curs_insstr.3x insstr.3ncurses
+curs_instr.3x instr.3ncurses
+curs_kernel.3x kernel.3ncurses
+curs_mouse.3x mouse.3ncurses
+curs_move.3x move.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_termattrs.3x termattrs.3ncurses
+curs_termcap.3x termcap.3ncurses
+curs_terminfo.3x terminfo.3ncurses
+curs_touch.3x touch.3ncurses
+curs_util.3x util.3ncurses
+curs_window.3x window.3ncurses
+curses.3x ncurses.3ncurses
+define_key.3x define_key.3ncurses
+dft_fgbg.3x dft_fgbg.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_win.3x win.3form
+infocmp.1m infocmp.1
+keybound.3x keybound.3ncurses
+keyok.3x keyok.3ncurses
+menu.3x menu.3menu
+menu_attribs.3x attribs.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
+panel.3x panel.3curses
+printf.3s printf.3
+putc.3s putc.3
+resizeterm.3x resizeterm.3ncurses
+scanf.3s scanf.3
+system.3s system.3
+term.5 term.5
+term.7 term.7
+terminfo.5 terminfo.5
+tic.1m tic.1
+toe.1m toe.1
+tput.1 tput.1
+tset.1 tset.1
+vprintf.3s vprintf.3
+wresize.3x wresize.3ncurses
diff --git a/contrib/ncurses/man/menu.3x b/contrib/ncurses/man/menu.3x
new file mode 100644
index 000000000000..adbfffd92c74
--- /dev/null
+++ b/contrib/ncurses/man/menu.3x
@@ -0,0 +1,190 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu.3x,v 1.13 1998/11/29 01:09:07 Rick.Ohnemus Exp $
+.TH menu 3X ""
+.SH NAME
+\fBmenu\fR - curses extension for programming menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+.SH DESCRIPTION
+The \fBmenu\fR 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 \fBmenu\fR library uses the \fBcurses\fR libraries, and a curses
+initialization routine such as \fBinitscr\fR must be called before using any of
+these functions. To use the \fBmenu\fR library, link with the options
+\fB-lmenu -lcurses\fR.
+
+.SS Current Default Values for Item Attributes
+
+The \fBmenu\fR library maintains a default value for item attributes. You can
+get or set this default by calling the appropriate \fBget_\fR or \fBset_\fR
+routine with a \fBNULL\fR item pointer. Changing this default with a
+\fBset_\fR 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\fR routine and the name of
+the manual page on which it is described.
+
+.TS
+l l .
+\fBcurses\fR Routine Name Manual Page Name
+=
+current_item \fBmitem_current\fR(3X)
+free_item \fBmitem_new\fR(3X)
+free_menu \fBmenu_new\fR(3X)
+item_count \fBmenu_items\fR(3X)
+item_description \fBmitem_name\fR(3X)
+item_index \fBmitem_current\fR(3X)
+item_init \fBmenu_hook\fR(3X)
+item_name \fBmitem_name\fR(3X)
+item_opts \fBmitem_opts\fR(3X)
+item_opts_off \fBmitem_opts\fR(3X)
+item_opts_on \fBmitem_opts\fR(3X)
+item_term \fBmenu_hook\fR(3X)
+item_userptr \fBmitem_userptr\fR(3X)
+item_value \fBmitem_value\fR(3X)
+item_visible \fBmitem_visible\fR(3X)
+menu_back \fBmenu_attribs\fR(3X)
+menu_driver \fBmenu_driver\fR(3X)
+menu_fore \fBmenu_attribs\fR(3X)
+menu_format \fBmenu_format\fR(3X)
+menu_grey \fBmenu_attribs\fR(3X)
+menu_init \fBmenu_hook\fR(3X)
+menu_items \fBmenu_items\fR(3X)
+menu_mark \fBmenu_mark\fR(3X)
+menu_opts \fBmenu_opts\fR(3X)
+menu_opts_off \fBmenu_opts\fR(3X)
+menu_opts_on \fBmenu_opts\fR(3X)
+menu_pad \fBmenu_attribs\fR(3X)
+menu_pattern \fBmenu_pattern\fR(3X)
+menu_request_by_name \fBmenu_requestname\fR(3X)
+menu_request_name \fBmenu_requestname\fR(3X)
+menu_spacing \fBmenu_spacing\fR(3X)
+menu_sub \fBmenu_win\fR(3X)
+menu_term \fBmenu_hook\fR(3X)
+menu_userptr \fBmenu_userptr\fR(3X)
+menu_win \fBmenu_win\fR(3X)
+new_item \fBmitem_new\fR(3X)
+new_menu \fBmenu_new\fR(3X)
+pos_menu_cursor \fBmenu_cursor\fR(3X)
+post_menu \fBmenu_post\fR(3X)
+scale_menu \fBmenu_win\fR(3X)
+set_current_item \fBmitem_current\fR(3X)
+set_item_init \fBmenu_hook\fR(3X)
+set_item_opts \fBmitem_opts\fR(3X)
+set_item_term \fBmenu_hook\fR(3X)
+set_item_userptr \fBmitem_userptr\fR(3X)
+set_item_value \fBmitem_value\fR(3X)
+set_menu_back \fBmenu_attribs\fR(3X)
+set_menu_fore \fBmenu_attribs\fR(3X)
+set_menu_format \fBmenu_format\fR(3X)
+set_menu_grey \fBmenu_attribs\fR(3X)
+set_menu_init \fBmenu_hook\fR(3X)
+set_menu_items \fBmenu_items\fR(3X)
+set_menu_mark \fBmenu_mark\fR(3X)
+set_menu_opts \fBmitem_opts\fR(3X)
+set_menu_pad \fBmenu_attribs\fR(3X)
+set_menu_pattern \fBmenu_pattern\fR(3X)
+set_menu_spacing \fBmenu_spacing\fR(3X)
+set_menu_sub \fBmenu_win\fR(3X)
+set_menu_term \fBmenu_hook\fR(3X)
+set_menu_userptr \fBmenu_userptr\fR(3X)
+set_menu_win \fBmenu_win\fR(3X)
+set_top_row \fBmitem_current\fR(3X)
+top_row \fBmitem_current\fR(3X)
+unpost_menu \fBmenu_post\fR(3X)
+.TE
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fR on error. Routines that return
+an integer return one of the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The menu is already posted.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_NO_ROOM\fR
+Menu is too large for its window.
+.TP 5
+\fBE_NOT_POSTED\fR
+The menu has not been posted.
+.TP 5
+\fBE_UNKNOWN_COMMAND\fR
+The menu driver code saw an unknown request code.
+.TP 5
+\fBE_NO_MATCH\fR
+Character failed to match.
+.TP 5
+\fBE_NOT_SELECTABLE\fR
+The designated item cannot be selected.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No items are connected to the menu.
+.TP 5
+\fBE_REQUEST_DENIED\fR
+The menu driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "menu_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header files
+\fB<curses.h>\fR and \fB<eti.h>\fR.
+
+In your library list, libmenu.a should be before libncurses.a; that is,
+you want to say `-lmenu -lncurses', not the other way around (which would
+give you a link error using GNU \fBld\fR(1) and many other linkers).
+.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 ncurses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_attribs.3x b/contrib/ncurses/man/menu_attribs.3x
new file mode 100644
index 000000000000..3577db53d6aa
--- /dev/null
+++ b/contrib/ncurses/man/menu_attribs.3x
@@ -0,0 +1,100 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_attribs.3x,v 1.6 1998/11/29 01:09:20 Rick.Ohnemus Exp $
+.TH menu_attributes 3X ""
+.SH NAME
+\fBmenu_attributes\fR - color and attribute control for menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_fore(MENU *menu, chtype attr);
+.br
+chtype menu_fore(const MENU *menu);
+.br
+int set_menu_back(MENU *menu, chtype attr);
+.br
+chtype menu_back(const MENU *menu);
+.br
+int set_menu_grey(MENU *menu, chtype attr);
+.br
+chtype menu_grey(const MENU *menu);
+.br
+int set_menu_pad(MENU *menu, int pad);
+.br
+int menu_pad(const MENU *menu);
+.br
+.SH DESCRIPTION
+The function \fBset_menu_fore\fR sets the foreground attribute of
+\fImenu\fR. This is the highlight used for selected menu items.
+\fBmenu_fore\fR returns the foreground attribute. The default
+is \fBA_STANDOUT\fR.
+
+The function \fBset_menu_back\fR sets the background attribute of
+\fImenu\fR. This is the highlight used for selectable (but not currently
+selected) menu items. The function \fBmenu_back\fR returns the background
+attribute. The default is \fBA_NORMAL\fR.
+
+The function \fBset_menu_grey\fR sets the grey attribute of \fImenu\fR. This is
+the highlight used for un-selectable menu items in menus that permit more than
+one selection. The function \fBmenu_grey\fR returns the grey attribute.
+The default is \fBA_UNDERLINE\fR.
+
+The function \fBset_menu_pad\fR sets the character used to fill the space
+between the name and description parts of a menu item. \fBmenu_pad\fR returns
+the given menu's pad character. The default is a blank.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fR(3X) and 3X pages whose names begin "menu_" for detailed
+descriptions of the entry points.
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_cursor.3x b/contrib/ncurses/man/menu_cursor.3x
new file mode 100644
index 000000000000..2cc58507de66
--- /dev/null
+++ b/contrib/ncurses/man/menu_cursor.3x
@@ -0,0 +1,73 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_cursor.3x,v 1.5 1998/11/29 01:09:30 Rick.Ohnemus Exp $
+.TH menu_cursor 3X ""
+.SH NAME
+\fBmenu_cursor\fR - position a menu's cursor
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int pos_menu_cursor(const MENU *menu);
+.br
+.SH DESCRIPTION
+The function \fBpos_menu_cursor\fR restores the cursor to the current position
+associated with the menu's selected item. This is useful after \fBcurses\fR
+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
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_NOT_POSTED\fR
+The menu has not been posted.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_driver.3x b/contrib/ncurses/man/menu_driver.3x
new file mode 100644
index 000000000000..cffd08d850ee
--- /dev/null
+++ b/contrib/ncurses/man/menu_driver.3x
@@ -0,0 +1,170 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: menu_driver.3x,v 1.8 1999/01/09 22:55:18 tom Exp $
+.TH menu_driver 3X ""
+.SH NAME
+\fBmenu_driver\fR - command-processing loop of the menu system
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int menu_driver(MENU *menu, int c);
+.br
+.SH DESCRIPTION
+Once a menu has been posted (displayed), you should funnel input events to it
+through \fBmenu_driver\fR. This routine has three major input cases; either
+the input is a menu navigation request, it's a printable ASCII character or it
+is the KEY_MOUSE special key associated with an mouse event.
+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 ASCII 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\fR returns
+\fBE_NO_MATCH\fR 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.
+.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. 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. If you double-click at an item a REQ_TOGGLE_ITEM
+is generated and \fBE_UNKNOWN_COMMAND\fR is returned. This return value makes
+sense, because a double click usually means that an item-specific action should
+be returned. It's exactly the purpose of this return value to signal that an
+application specific command should be executed. If a translation
+into a request was done, \fBmenu_driver\fR returns the result of this request.
+If you clicked outside the user window or the mouse event couldn't be translated
+into a menu request an \fBE_REQUEST_DENIED\fR is returned.
+.PP
+If the second argument is neither printable ASCII 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\fR. Application-defined commands
+should be defined relative to \fBMAX_COMMAND\fR, the maximum value of these
+pre-defined requests.
+.SH RETURN VALUE
+\fBmenu_driver\fR return one of the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_NOT_POSTED\fR
+The menu has not been posted.
+.TP 5
+\fBE_UNKNOWN_COMMAND\fR
+The menu driver code saw an unknown request code.
+.TP 5
+\fBE_NO_MATCH\fR
+Character failed to match.
+.TP 5
+\fBE_REQUEST_DENIED\fR
+The menu driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header files
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_format.3x b/contrib/ncurses/man/menu_format.3x
new file mode 100644
index 000000000000..57c77a390ede
--- /dev/null
+++ b/contrib/ncurses/man/menu_format.3x
@@ -0,0 +1,84 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_format.3x,v 1.7 1998/11/29 01:09:39 Rick.Ohnemus Exp $
+.TH menu_format 3X ""
+.SH NAME
+\fBmenu_format\fR - set and get menu sizes
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_format(MENU *menu, int rows, int cols);
+.br
+int menu_format(const MENU *menu, int *rows, int *cols);
+.br
+.SH DESCRIPTION
+The function \fBset_menu_format\fR 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()\fR will fail.
+
+The default format is 16 rows, 1 column. Calling \fBset_menu_format\fR with a
+null menu pointer will change this default. A zero row or column argument to
+\fBset_menu_format\fR is interpreted as a request not to change the current
+value.
+
+The function \fBmenu_format\fR returns the maximum-size constraints for the
+given menu into the storage addressed by \fBrows\fR and \fBcols\fR.
+.SH RETURN VALUE
+These routines returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The menu is already posted.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_hook.3x b/contrib/ncurses/man/menu_hook.3x
new file mode 100644
index 000000000000..531528a60783
--- /dev/null
+++ b/contrib/ncurses/man/menu_hook.3x
@@ -0,0 +1,101 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_hook.3x,v 1.6 1998/11/29 01:09:47 Rick.Ohnemus Exp $
+.TH menu_hook 3X ""
+.SH NAME
+\fBmenu_hook\fR - set hooks for automatic invocation by applications
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_item_init(MENU *menu, void (*func)(MENU *));
+.br
+void (*)(MENU *) item_init(const MENU *menu);
+.br
+int set_item_term(MENU *menu, void (*func)(MENU *));
+.br
+void (*)(MENU *) item_term(const MENU *menu);
+.br
+int set_menu_init(MENU *menu, void (*func)(MENU *));
+.br
+void (*)(MENU *) menu_init(const MENU *menu);
+.br
+int set_menu_term(MENU *menu, void (*func)(MENU *));
+.br
+void (*)(MENU *) menu_term(const MENU *menu);
+.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\fR.
+
+The function \fBset_item_init\fR sets a hook to be called at menu-post time and
+each time the selected item changes (after the change). \fBitem_init\fR
+returns the current item init hook, if any (\fBNULL\fR if there is no such
+hook).
+
+The function \fBset_item_term\fR sets a hook to be called at menu-unpost time
+and each time the selected item changes (before the change). \fBitem_term\fR
+returns the current item term hook, if any (\fBNULL\fR if there is no such
+hook).
+
+The function \fBset_menu_init\fR 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\fR
+returns the current menu init hook, if any (\fBNULL\fR if there is no such
+hook).
+
+The function \fBset_menu_term\fR 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\fR returns the current menu term hook, if any (\fBNULL\fR if there
+is no such hook).
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fR on error. Other routines
+return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_items.3x b/contrib/ncurses/man/menu_items.3x
new file mode 100644
index 000000000000..7ec7db5604ba
--- /dev/null
+++ b/contrib/ncurses/man/menu_items.3x
@@ -0,0 +1,91 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_items.3x,v 1.5 1998/11/29 01:09:56 Rick.Ohnemus Exp $
+.TH menu_items 3X ""
+.SH NAME
+\fBmenu_items\fR - make and break connections between items and menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_items(MENU *menu, ITEM **items);
+.br
+ITEM **menu_items(const MENU *menu);
+.br
+int item_count(const MENU *menu);
+.br
+.SH DESCRIPTION
+The function \fBset_menu_items\fR changes the item pointer array of the given
+\fImenu\fR. The array must be terminated by a \fBNULL\fR.
+
+The function \fBmenu_items\fR returns the item array of the given menu.
+
+The function \fBitem_count\fR returns the count of items in \fImenu\fR.
+.SH RETURN VALUES
+The function \fBmenu_items\fR returns \fBNULL\fR on error.
+
+The function \fBitem_count\fR returns \fBERR\fR (the general \fBcurses\fR error
+return value) on error.
+
+The function \fBset_menu_items\fR returns one of the following codes on error:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The menu is already posted.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No items are connected to the menu.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+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 \fBitem_count\fR error value
+as -1 (which is the value of \fBERR\fR).
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_mark.3x b/contrib/ncurses/man/menu_mark.3x
new file mode 100644
index 000000000000..72ea000335e4
--- /dev/null
+++ b/contrib/ncurses/man/menu_mark.3x
@@ -0,0 +1,84 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_mark.3x,v 1.6 1998/11/29 01:10:03 Rick.Ohnemus Exp $
+.TH menu_mark 3X ""
+.SH NAME
+\fBmenu_mark\fR - get and set the menu mark string
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_mark(MENU *menu, const char *mark);
+.br
+const char *menu_mark(const MENU *menu);
+.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.
+
+The function \fBset_menu_mark\fR sets the mark string for the given menu.
+Calling \fBset_menu_mark\fR 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 \fBset_menu_mark\fR with
+a \fBNULL\fR menu argument will change this default.
+
+The function \fBmenu_mark\fR returns the menu's mark string (or \fBNULL\fR if
+there is none).
+.SH RETURN VALUE
+The function \fBmenu_mark\fR returns \fBNULL\fR on error. The function
+\fBset_menu_mark\fR may return the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_new.3x b/contrib/ncurses/man/menu_new.3x
new file mode 100644
index 000000000000..c53bd9b8cb65
--- /dev/null
+++ b/contrib/ncurses/man/menu_new.3x
@@ -0,0 +1,79 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_new.3x,v 1.7 1998/11/29 01:10:13 Rick.Ohnemus Exp $
+.TH menu_new 3X ""
+.SH NAME
+\fBmenu_new\fR - create and destroy menus
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+MENU *new_menu(ITEM **items);
+.br
+int free_menu(MENU *menu);
+.br
+.SH DESCRIPTION
+The function \fBnew_menu\fR creates a new menu connected to a specified item
+pointer array (which must be \fBNULL\fR-terminated).
+
+The function \fBfree_menu\fR disconnects \fImenu\fR from its item array
+and frees the storage allocated for the menu.
+.SH RETURN VALUE
+The function \fBnew_menu\fR returns \fBNULL\fR on error.
+
+The function \fBfree_menu\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The menu has already been posted.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_opts.3x b/contrib/ncurses/man/menu_opts.3x
new file mode 100644
index 000000000000..30cad58d4957
--- /dev/null
+++ b/contrib/ncurses/man/menu_opts.3x
@@ -0,0 +1,104 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_opts.3x,v 1.7 1998/11/29 01:10:21 Rick.Ohnemus Exp $
+.TH menu_opts 3X ""
+.SH NAME
+\fBmenu_opts\fR - set and get menu options
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_opts(MENU *menu, OPTIONS opts);
+.br
+int menu_opts_on(MENU *menu, OPTIONS opts);
+.br
+int menu_opts_off(MENU *menu, OPTIONS opts);
+.br
+OPTIONS menu_opts(const MENU *menu);
+.br
+.SH DESCRIPTION
+The function \fBset_menu_opts\fR sets all the given menu's option bits (menu
+option bits may be logically-OR'ed together).
+
+The function \fBmenu_opts_on\fR turns on the given option bits, and leaves
+others alone.
+
+The function \fBmenu_opts_off\fR turns off the given option bits, and leaves
+others alone.
+
+The function \fBmenu_opts\fR returns the menu's current option bits.
+
+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.
+.SH RETURN VALUE
+Except for \fBmenu_opts\fR, each routine returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_POSTED\fR
+The menu is already posted.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_pattern.3x b/contrib/ncurses/man/menu_pattern.3x
new file mode 100644
index 000000000000..693ebe35729a
--- /dev/null
+++ b/contrib/ncurses/man/menu_pattern.3x
@@ -0,0 +1,82 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: menu_pattern.3x,v 1.5 1998/03/11 21:12:53 juergen Exp $
+.TH menu_pattern 3X ""
+.SH NAME
+\fBmenu_pattern\fR - get and set a menu's pattern buffer
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_pattern(MENU *menu, const char *pattern);
+.br
+char *menu_pattern(const MENU *menu);
+.br
+.SH DESCRIPTION
+Every menu has an associated pattern match buffer. As input events that are
+printable ASCII characters come in, they are appended to this match buffer
+and tested for a match, as described in \fBmenu_driver\fR(3X).
+
+The function \fBset_menu_pattern\fR 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 \fBmenu_pattern\fR returns the pattern buffer of the given
+\fImenu\fR.
+.SH RETURN VALUE
+The function \fBmenu_pattern\fR returns \fBNULL\fR on error. The function
+\fBset_menu_pattern\fR may return the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_NO_MATCH\fR
+Character failed to match.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_post.3x b/contrib/ncurses/man/menu_post.3x
new file mode 100644
index 000000000000..a4182d649520
--- /dev/null
+++ b/contrib/ncurses/man/menu_post.3x
@@ -0,0 +1,91 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_post.3x,v 1.7 1998/11/29 01:10:33 Rick.Ohnemus Exp $
+.TH menu_post 3X ""
+.SH NAME
+\fBmenu_post\fR - write or erase menus from associated subwindows
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int post_menu(MENU *menu);
+.br
+int unpost_menu(MENU *menu);
+.br
+.SH DESCRIPTION
+The function \fBpost_menu\fR displays a menu to its associated subwindow. To
+trigger physical display of the subwindow, use \fBrefresh\fR or some equivalent
+\fBcurses\fR routine (the implicit \fBdoupdate\fR triggered by an \fBcurses\fR
+input request will do). \fBpost_menu\fR resets the selection status of all items.
+
+The function \fBunpost_menu\fR erases menu from its associated subwindow.
+.SH RETURN VALUE
+These routines return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The menu has already been posted.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_NO_ROOM\fR
+Menu is too large for its window. You should consider to use
+\fBset_menu_format()\fR to solve the problem.
+.TP 5
+\fBE_NOT_POSTED\fR
+The menu has not been posted.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No items are connected to the menu.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_requestname.3x b/contrib/ncurses/man/menu_requestname.3x
new file mode 100644
index 000000000000..f4b646a455fc
--- /dev/null
+++ b/contrib/ncurses/man/menu_requestname.3x
@@ -0,0 +1,69 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_requestname.3x,v 1.6 1998/11/29 01:10:40 Rick.Ohnemus Exp $
+.TH menu_requestname 3X ""
+.SH NAME
+\fBmenu_requestname\fR - handle printable menu request names
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+const char *menu_request_name(int request);
+.br
+int menu_request_by_name(const char *name);
+.br
+.SH DESCRIPTION
+The function \fBmenu_request_name\fR returns the printable name of a menu
+request code.
+.br
+The function \fBmenu_request_by_name\fR 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\fR returns \fBNULL\fR on error and sets errno
+to \fBE_BAD_ARGUMENT\fR.
+.br
+\fBmenu_request_by_name\fR returns \fBE_NO_MATCH\fR on error.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_spacing.3x b/contrib/ncurses/man/menu_spacing.3x
new file mode 100644
index 000000000000..0480b3c02d4b
--- /dev/null
+++ b/contrib/ncurses/man/menu_spacing.3x
@@ -0,0 +1,84 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_spacing.3x,v 1.5 1998/11/29 01:10:51 Rick.Ohnemus Exp $
+.TH menu_spacing 3X ""
+.SH NAME
+\fBmenu_spacing\fR - Control spacing between menu items.
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_spacing(MENU *menu,
+ int spc_description
+ int spc_rows,
+ int spc_columns);
+.br
+int menu_spacing(const MENU *menu,
+ int* spc_description
+ int* spc_rows,
+ int* spc_columns);
+.br
+.SH DESCRIPTION
+The function \fBset_menu_spacing\fR sets the spacing informations for the menu.
+\fBspc_description\fR controls the number of spaces between an item name and an item
+description. It must not be larger than \fBTABSIZE\fR. The menu system puts in the
+middle of this spacing area the pad character. The remaining parts are filled with
+spaces.
+\fBspc_rows\fR controls the number of rows that are used for an item. It must not be
+larger than 3. The menu system inserts then blank lines between item rows, these lines
+will contain the pad character in the appropriate positions.
+\fBspc_columns\fR controls the number of blanks between columns of items. It must not
+be larger than TABSIZE.
+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\fR 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\fR on success. \fBset_menu_spacing\fR may return
+\fBE_POSTED\fR if the menu is posted, or \fBE_BAD_ARGUMENT\fR if one of the
+spacing values is out of range.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_userptr.3x b/contrib/ncurses/man/menu_userptr.3x
new file mode 100644
index 000000000000..1fe354183d83
--- /dev/null
+++ b/contrib/ncurses/man/menu_userptr.3x
@@ -0,0 +1,73 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_userptr.3x,v 1.6 1998/11/29 01:11:02 Rick.Ohnemus Exp $
+.TH menu_userptr 3X ""
+.SH NAME
+\fBmenu_userptr\fR - associate application data with a menu item
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_userptr(MENU *menu, void *userptr);
+.br
+void *menu_userptr(const MENU *menu);
+.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
+Except for \fBmenu_userptr\fR (which returns \fBNULL\fR on error), each
+function returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+These routines emulate the System V menu library. They were not supported on
+Version 7 or BSD versions.
+
+The user pointer should be a void pointer. We leave it as a char pointer for
+SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/menu_win.3x b/contrib/ncurses/man/menu_win.3x
new file mode 100644
index 000000000000..336da44b0c5b
--- /dev/null
+++ b/contrib/ncurses/man/menu_win.3x
@@ -0,0 +1,95 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: menu_win.3x,v 1.6 1998/11/29 01:11:11 Rick.Ohnemus Exp $
+.TH menu_win 3X ""
+.SH NAME
+\fBmenu_win\fR - make and break menu window and subwindow associations
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_menu_win(MENU *menu, WINDOW *win);
+.br
+WINDOW *menu_win(const MENU *menu);
+.br
+int set_menu_sub(MENU *menu, WINDOW *sub);
+.br
+WINDOW *menu_sub(const MENU *menu);
+.br
+int scale_menu(const MENU *menu, int *rows, int *columns);
+.br
+.SH DESCRIPTION
+Every menu has an associated pair of \fBcurses\fR 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 \fBstdscr\fR for both.
+
+In the \fBset_\fR functions, window argument of \fBNULL\fR is treated as though
+it were \fBstsdcr\fR. A menu argument of \fBNULL\fR is treated as a request
+to change the system default menu window or subwindow.
+
+The function \fBscale_menu\fR returns the minimum size required for the
+subwindow of \fImenu\fR.
+.SH RETURN VALUE
+Routines that return pointers return \fBNULL\fR on error. Routines that return
+an integer return one of the following error codes:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_POSTED\fR
+The menu has already been posted.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No items are connected to the menu.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/mitem_current.3x b/contrib/ncurses/man/mitem_current.3x
new file mode 100644
index 000000000000..179a23be3b2e
--- /dev/null
+++ b/contrib/ncurses/man/mitem_current.3x
@@ -0,0 +1,101 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: mitem_current.3x,v 1.9 1998/12/26 19:52:34 tom Exp $
+.TH mitem_current 3X ""
+.SH NAME
+\fBmitem_current\fR - set and get current_menu_item
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_current_item(MENU *menu, const ITEM *item);
+.br
+ITEM *current_item(const MENU *menu);
+.br
+int set_top_row(MENU *menu, int row);
+.br
+int top_row(const MENU *menu);
+.br
+int item_index(const ITEM *item);
+.br
+.SH DESCRIPTION
+The function \fBset_current_item\fR sets the current item (the item on which
+the menu cursor is positioned). \fBcurrent_item\fR returns a pointer to the
+current item in the given menu.
+
+The function \fBset_top_row\fR 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\fR option is toggled). The item leftmost on the given row
+becomes current. The function \fBtop_row\fR returns the number of the top menu
+row being displayed.
+
+The function \fBitem_index\fR returns the (zero-origin) index of \fIitem\fR in
+the menu's item pointer list.
+.SH RETURN VALUE
+\fBcurrent_item\fR returns \fBNULL\fR on error.
+
+\fBtop_row\fR and \fBitem_index\fR return \fBERR\fR (the general \fBcurses\fR
+error value) on error.
+
+\fBset_current_item\fR and \fBset_top_row\fR return one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_BAD_STATE\fR
+Routine was called from an initialization or termination function.
+.TP 5
+\fBE_NOT_CONNECTED\fR
+No items are connected to the menu.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+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 \fBtop_row\fR and
+\fBindex_item\fR error value as -1 (which is the value of \fBERR\fR).
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/mitem_name.3x b/contrib/ncurses/man/mitem_name.3x
new file mode 100644
index 000000000000..007752e0bbe4
--- /dev/null
+++ b/contrib/ncurses/man/mitem_name.3x
@@ -0,0 +1,64 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: mitem_name.3x,v 1.5 1998/11/29 01:11:29 Rick.Ohnemus Exp $
+.TH mitem_name 3X ""
+.SH NAME
+\fBmitem_name\fR - get menu item name and description fields
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+const char *item_name(const ITEM *item);
+.br
+const char *item_description(const ITEM *item);
+.br
+.SH DESCRIPTION
+The function \fBitem_name\fR returns the name part of the given item.
+.br
+The function \fBitem_description\fR returns the description part of the given
+item.
+.SH RETURN VALUE
+These routines returns \fBNULL\fR on error.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/mitem_new.3x b/contrib/ncurses/man/mitem_new.3x
new file mode 100644
index 000000000000..0653840167bd
--- /dev/null
+++ b/contrib/ncurses/man/mitem_new.3x
@@ -0,0 +1,83 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: mitem_new.3x,v 1.7 1998/11/29 01:11:38 Rick.Ohnemus Exp $
+.TH mitem_new 3X ""
+.SH NAME
+\fBmitem_new\fR - create and destroy menu items
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+ITEM *new_item(const char *name, const char *description);
+.br
+int free_item(ITEM *item);
+.br
+.SH DESCRIPTION
+The function \fBnew_item\fR allocates a new item and initializes it from the
+\fBname\fR and \fBdescription\fR 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 carefull with names
+or descriptions allocated on the stack of some routines.
+.br
+The function \fBfree_item\fR 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\fR returns \fBNULL\fR on error.
+
+The function \fBfree_item\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_BAD_ARGUMENT\fR
+Routine detected an incorrect or out-of-range argument.
+.TP 5
+\fBE_CONNECTED\fR
+Item is connected to a menu.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/mitem_opts.3x b/contrib/ncurses/man/mitem_opts.3x
new file mode 100644
index 000000000000..99e4e5ea7e99
--- /dev/null
+++ b/contrib/ncurses/man/mitem_opts.3x
@@ -0,0 +1,84 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: mitem_opts.3x,v 1.6 1998/11/29 01:12:37 Rick.Ohnemus Exp $
+.TH mitem_opts 3X ""
+.SH NAME
+\fBmitem_opts\fR - set and get menu item options
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_item_opts(ITEM *item, OPTIONS opts);
+.br
+int item_opts_on(ITEM *item, OPTIONS opts);
+.br
+int item_opts_off(ITEM *item, OPTIONS opts);
+.br
+OPTIONS item_opts(const ITEM *item);
+.br
+.SH DESCRIPTION
+The function \fBset_item_opts\fR sets all the given item's option bits (menu
+option bits may be logically-OR'ed together).
+
+The function \fBitem_opts_on\fR turns on the given option bits, and leaves
+others alone.
+
+The function \fBitem_opts_off\fR turns off the given option bits, and leaves
+others alone.
+
+The function \fBitem_opts\fR returns the item's current option bits.
+
+There is only one defined option bit mask, \fBO_SELECTABLE\fR. When this is
+on, the item may be selected during menu processing. This option defaults
+to on.
+.SH RETURN VALUE
+Except for \fBitem_opts\fR, each routine returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/mitem_userptr.3x b/contrib/ncurses/man/mitem_userptr.3x
new file mode 100644
index 000000000000..2dd564fd61e8
--- /dev/null
+++ b/contrib/ncurses/man/mitem_userptr.3x
@@ -0,0 +1,72 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: mitem_userptr.3x,v 1.6 1998/11/29 01:12:47 Rick.Ohnemus Exp $
+.TH mitem_userptr 3X ""
+.SH NAME
+\fBmitem_userptr\fR - associate application data with a menu item
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_item_userptr(ITEM *item, void *userptr);
+.br
+void *item_userptr(const ITEM *item);
+.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
+Except for \fBitem_userptr\fR (which returns \fBNULL\fR on error), each function returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.SH PORTABILITY
+These routines emulate the System V menu library. They were not supported on
+Version 7 or BSD versions.
+
+The user pointer should be a void pointer. We leave it as a char pointer for
+SVr4 compatibility.
+.SH AUTHORS
+Juergen Pfeifer. Manual pages and adaptation for new curses by Eric
+S. Raymond.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/mitem_value.3x b/contrib/ncurses/man/mitem_value.3x
new file mode 100644
index 000000000000..680fda8869c3
--- /dev/null
+++ b/contrib/ncurses/man/mitem_value.3x
@@ -0,0 +1,76 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.'" $Id: mitem_value.3x,v 1.4 1998/03/11 21:12:53 juergen Exp $
+.TH mitem_value 3X ""
+.SH NAME
+\fBmitem_value\fR - set and get menu item values
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+int set_item_value(ITEM *item, bool value);
+.br
+bool item_value(const ITEM *item);
+.br
+.SH DESCRIPTION
+If you turn off the menu option \fBO_ONEVALUE\fR (e.g., with
+\fBset_menu_opts\fR or \fBmenu_opts_off\fR; see \fBmenu_opts\fR(3X)), the menu
+becomes multi-valued; that is, more than one item may simultaneously be
+selected.
+
+In a multi_valued menu, you can used \fBset_item_value\fR to select the
+given menu item (second argument \fBTRUE\fR) or deselect it (second argument
+\fBFALSE\fR).
+.SH RETURN VALUE
+The function \fBset_item_value\fR returns one of the following:
+.TP 5
+\fBE_OK\fR
+The routine succeeded.
+.TP 5
+\fBE_SYSTEM_ERROR\fR
+System error occurred (see \fBerrno\fR).
+.TP 5
+\fBE_REQUEST_DENIED\fR
+The menu driver could not process the request.
+.SH SEE ALSO
+\fBcurses\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/mitem_visible.3x b/contrib/ncurses/man/mitem_visible.3x
new file mode 100644
index 000000000000..8f9039c2f6db
--- /dev/null
+++ b/contrib/ncurses/man/mitem_visible.3x
@@ -0,0 +1,59 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: mitem_visible.3x,v 1.5 1998/11/29 01:12:55 Rick.Ohnemus Exp $
+.TH mitem_visible 3X ""
+.SH NAME
+\fBmitem_visible\fR - check visibility of a menu item
+.SH SYNOPSIS
+\fB#include <menu.h>\fR
+.br
+bool item_visible(const ITEM *item);
+.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\fR(3X), \fBmenu\fR(3X).
+.SH NOTES
+The header file \fB<menu.h>\fR automatically includes the header file
+\fB<curses.h>\fR.
+.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.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/ncurses.3x b/contrib/ncurses/man/ncurses.3x
new file mode 100644
index 000000000000..afbbe277c786
--- /dev/null
+++ b/contrib/ncurses/man/ncurses.3x
@@ -0,0 +1,912 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: ncurses.3x,v 1.34 1999/07/24 21:37:35 tom Exp $
+.hy 0
+.TH ncurses 3X ""
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+\fBncurses\fR - CRT screen handling and optimization package
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+.br
+.SH DESCRIPTION
+The \fBncurses\fR 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.
+
+The \fBncurses\fR routines emulate the \fBcurses\fR(3X) library of System V
+Release 4 UNIX, and the XPG4 curses standard (XSI curses) but the \fBncurses\fR
+library is freely redistributable in source form. Differences from the SVr4
+curses are summarized under the EXTENSIONS and BUGS sections below and
+described in detail in the EXTENSIONS and BUGS sections of individual man
+pages.
+
+A program using these routines must be linked with the \fB-lncurses\fR option,
+or (if it has been generated) with the debugging library \fB-lncurses_g\fR.
+(Your system integrator may also have installed these libraries under
+the names \fB-lcurses\fR and \fB-lcurses_g\fR.)
+The ncurses_g library generates trace logs (in a file called 'trace' in the
+current directory) that describe curses actions.
+
+The \fBncurses\fR package supports: overall screen, window and pad
+manipulation; output to windows and pads; reading terminal input; control over
+terminal and \fBcurses\fR input and output options; environment query
+routines; color manipulation; use of soft label keys; terminfo capabilities;
+and access to low-level terminal-manipulation routines.
+
+To initialize the routines, the routine \fBinitscr\fR or \fBnewterm\fR
+must be called before any of the other routines that deal with windows
+and screens are used. The routine \fBendwin\fR 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:
+
+ \fBinitscr(); cbreak(); noecho();\fR
+
+Most programs would additionally use the sequence:
+
+ \fBnonl();\fR
+ \fBintrflush(stdscr, FALSE);\fR
+ \fBkeypad(stdscr, TRUE);\fR
+
+Before a \fBcurses\fR 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 \fBtput init\fR command
+after the shell environment variable \fBTERM\fR has been exported.
+\fBtset(1)\fR is usually responsible for doing this.
+[See \fBterminfo\fR(\*n) for further details.]
+
+The \fBncurses\fR library permits manipulation of data structures,
+called \fIwindows\fR, which can be thought of as two-dimensional
+arrays of characters representing all or part of a CRT screen. A
+default window called \fBstdscr\fR, which is the size of the terminal
+screen, is supplied. Others may be created with \fBnewwin\fR.
+
+Note that \fBcurses\fR does not handle overlapping windows, that's done by
+the \fBpanel\fR(3X) library. This means that you can either use
+\fBstdscr\fR or divide the screen into tiled windows and not using
+\fBstdscr\fR at all. Mixing the two will result in unpredictable, and
+undesired, effects.
+
+Windows are referred to by variables declared as \fBWINDOW *\fR.
+These data structures are manipulated with routines described here and
+elsewhere in the \fBncurses\fR manual pages. Among which the most basic
+routines are \fBmove\fR and \fBaddch\fR. More general versions of
+these routines are included with names beginning with \fBw\fR,
+allowing the user to specify a window. The routines not beginning
+with \fBw\fR affect \fBstdscr\fR.)
+
+After using routines to manipulate a window, \fBrefresh\fR is called,
+telling \fBcurses\fR to make the user's CRT screen look like
+\fBstdscr\fR. The characters in a window are actually of type
+\fBchtype\fR, (character and attribute data) so that other information
+about the character may also be stored with each character.
+
+Special windows called \fIpads\fR 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\fR(3X) 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, \fBcurses\fR 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>\fR,
+such as \fBA_REVERSE\fR, \fBACS_HLINE\fR, and \fBKEY_LEFT\fR.
+
+If the environment variables \fBLINES\fR and \fBCOLUMNS\fR 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\fR. This would
+effect a program running in an AT&T 630 layer, for example, where the size of a
+screen is changeable (see \fBENVIRONMENT\fR).
+
+If the environment variable \fBTERMINFO\fR is defined, any program using
+\fBcurses\fR checks for a local terminal definition before checking in the
+standard place. For example, if \fBTERM\fR is set to \fBatt4424\fR, then the
+compiled terminal definition is found in
+
+ \fB\*d/a/att4424\fR.
+
+(The \fBa\fR is copied from the first letter of \fBatt4424\fR to avoid
+creation of huge directories.) However, if \fBTERMINFO\fR is set to
+\fB$HOME/myterms\fR, \fBcurses\fR first checks
+
+ \fB$HOME/myterms/a/att4424\fR,
+
+and if that fails, it then checks
+
+ \fB\*d/a/att4424\fR.
+
+This is useful for developing experimental definitions or when write
+permission in \fB\*d\fR is not available.
+
+The integer variables \fBLINES\fR and \fBCOLS\fR are defined in
+\fB<curses.h>\fR and will be filled in by \fBinitscr\fR with the size of the
+screen. The constants \fBTRUE\fR and \fBFALSE\fR have the values \fB1\fR and
+\fB0\fR, respectively.
+
+The \fBcurses\fR routines also define the \fBWINDOW *\fR variable \fBcurscr\fR
+which is used for certain low-level operations like clearing and redrawing a
+screen containing garbage. The \fBcurscr\fR can be used in only a few
+routines.
+
+.SS Routine and Argument Names
+Many \fBcurses\fR routines have two or more versions. The routines prefixed
+with \fBw\fR require a window argument. The routines prefixed with \fBp\fR
+require a pad argument. Those without a prefix generally use \fBstdscr\fR.
+
+The routines prefixed with \fBmv\fR require a \fIy\fR and \fIx\fR
+coordinate to move to before performing the appropriate action. The
+\fBmv\fR routines imply a call to \fBmove\fR before the call to the
+other routine. The coordinate \fIy\fR always refers to the row (of
+the window), and \fIx\fR always refers to the column. The upper
+left-hand corner is always (0,0), not (1,1).
+
+The routines prefixed with \fBmvw\fR take both a window argument and
+\fIx\fR and \fIy\fR coordinates. The window argument is always
+specified before the coordinates.
+
+In each case, \fIwin\fR is the window affected, and \fIpad\fR is the
+pad affected; \fIwin\fR and \fIpad\fR are always pointers to type
+\fBWINDOW\fR.
+
+Option setting routines require a Boolean flag \fIbf\fR with the value
+\fBTRUE\fR or \fBFALSE\fR; \fIbf\fR is always of type \fBbool\fR. The
+variables \fIch\fR and \fIattrs\fR below are always of type
+\fBchtype\fR. The types \fBWINDOW\fR, \fBSCREEN\fR, \fBbool\fR, and
+\fBchtype\fR are defined in \fB<curses.h>\fR. The type \fBTERMINAL\fR
+is defined in \fB<term.h>\fR. All other arguments are integers.
+
+.SS Routine Name Index
+The following table lists each \fBcurses\fR routine and the name of
+the manual page on which it is described. Routines flagged with `*'
+are ncurses-specific, not described by XPG4 or present in SVr4.
+
+.TS
+center tab(/);
+l l
+l l .
+\fBcurses\fR Routine Name/Manual Page Name
+=
+addch/\fBcurs_addch\fR(3X)
+addchnstr/\fBcurs_addchstr\fR(3X)
+addchstr/\fBcurs_addchstr\fR(3X)
+addnstr/\fBcurs_addstr\fR(3X)
+addstr/\fBcurs_addstr\fR(3X)
+attr_get/\fBcurs_attr\fR(3X)
+attr_off/\fBcurs_attr\fR(3X)
+attr_on/\fBcurs_attr\fR(3X)
+attr_set/\fBcurs_attr\fR(3X)
+attroff/\fBcurs_attr\fR(3X)
+attron/\fBcurs_attr\fR(3X)
+attrset/\fBcurs_attr\fR(3X)
+baudrate/\fBcurs_termattrs\fR(3X)
+beep/\fBcurs_beep\fR(3X)
+bkgd/\fBcurs_bkgd\fR(3X)
+bkgdset/\fBcurs_bkgd\fR(3X)
+border/\fBcurs_border\fR(3X)
+box/\fBcurs_border\fR(3X)
+can_change_color/\fBcurs_color\fR(3X)
+cbreak/\fBcurs_inopts\fR(3X)
+chgat/\fBcurs_attr\fR(3X)
+clear/\fBcurs_clear\fR(3X)
+clearok/\fBcurs_outopts\fR(3X)
+clrtobot/\fBcurs_clear\fR(3X)
+clrtoeol/\fBcurs_clear\fR(3X)
+color_content/\fBcurs_color\fR(3X)
+color_set/\fBcurs_attr\fR(3X)
+copywin/\fBcurs_overlay\fR(3X)
+curs_set/\fBcurs_kernel\fR(3X)
+def_prog_mode/\fBcurs_kernel\fR(3X)
+def_shell_mode/\fBcurs_kernel\fR(3X)
+define_key/\fBdefine_key\fR(3X)*
+del_curterm/\fBcurs_terminfo\fR(3X)
+delay_output/\fBcurs_util\fR(3X)
+delch/\fBcurs_delch\fR(3X)
+deleteln/\fBcurs_deleteln\fR(3X)
+delscreen/\fBcurs_initscr\fR(3X)
+delwin/\fBcurs_window\fR(3X)
+derwin/\fBcurs_window\fR(3X)
+doupdate/\fBcurs_refresh\fR(3X)
+dupwin/\fBcurs_window\fR(3X)
+echo/\fBcurs_inopts\fR(3X)
+echochar/\fBcurs_addch\fR(3X)
+endwin/\fBcurs_initscr\fR(3X)
+erase/\fBcurs_clear\fR(3X)
+erasechar/\fBcurs_termattrs\fR(3X)
+filter/\fBcurs_util\fR(3X)
+flash/\fBcurs_beep\fR(3X)
+flushinp/\fBcurs_util\fR(3X)
+getbegyx/\fBcurs_getyx\fR(3X)
+getbkgd/\fBcurs_bkgd\fR(3X)
+getch/\fBcurs_getch\fR(3X)
+getmaxyx/\fBcurs_getyx\fR(3X)
+getmouse/\fBcurs_mouse\fR(3X)*
+getnstr/\fBcurs_getstr\fR(3X)
+getparyx/\fBcurs_getyx\fR(3X)
+getstr/\fBcurs_getstr\fR(3X)
+getsyx/\fBcurs_kernel\fR(3X)
+getwin/\fBcurs_util\fR(3X)
+getyx/\fBcurs_getyx\fR(3X)
+halfdelay/\fBcurs_inopts\fR(3X)
+has_colors/\fBcurs_color\fR(3X)
+has_ic/\fBcurs_termattrs\fR(3X)
+has_il/\fBcurs_termattrs\fR(3X)
+has_key/\fBcurs_getch\fR(3X)*
+hline/\fBcurs_border\fR(3X)
+idcok/\fBcurs_outopts\fR(3X)
+idlok/\fBcurs_outopts\fR(3X)
+immedok/\fBcurs_outopts\fR(3X)
+inch/\fBcurs_inch\fR(3X)
+inchnstr/\fBcurs_inchstr\fR(3X)
+inchstr/\fBcurs_inchstr\fR(3X)
+init_color/\fBcurs_color\fR(3X)
+init_pair/\fBcurs_color\fR(3X)
+initscr/\fBcurs_initscr\fR(3X)
+innstr/\fBcurs_instr\fR(3X)
+insch/\fBcurs_insch\fR(3X)
+insdelln/\fBcurs_deleteln\fR(3X)
+insertln/\fBcurs_deleteln\fR(3X)
+insnstr/\fBcurs_insstr\fR(3X)
+insstr/\fBcurs_insstr\fR(3X)
+instr/\fBcurs_instr\fR(3X)
+intrflush/\fBcurs_inopts\fR(3X)
+is_linetouched/\fBcurs_touch\fR(3X)
+is_wintouched/\fBcurs_touch\fR(3X)
+isendwin/\fBcurs_initscr\fR(3X)
+keyname/\fBcurs_util\fR(3X)
+keyok/\fBkeyok\fR(3X)*
+keypad/\fBcurs_inopts\fR(3X)
+killchar/\fBcurs_termattrs\fR(3X)
+leaveok/\fBcurs_outopts\fR(3X)
+longname/\fBcurs_termattrs\fR(3X)
+mcprint/\fBcurs_print\fR(3X)*
+meta/\fBcurs_inopts\fR(3X)
+mouseinterval/\fBcurs_mouse\fR(3X)*
+mousemask/\fBcurs_mouse\fR(3X)*
+move/\fBcurs_move\fR(3X)
+mvaddch/\fBcurs_addch\fR(3X)
+mvaddchnstr/\fBcurs_addchstr\fR(3X)
+mvaddchstr/\fBcurs_addchstr\fR(3X)
+mvaddnstr/\fBcurs_addstr\fR(3X)
+mvaddstr/\fBcurs_addstr\fR(3X)
+mvchgat/\fBcurs_attr\fR(3X)
+mvcur/\fBcurs_terminfo\fR(3X)
+mvdelch/\fBcurs_delch\fR(3X)
+mvderwin/\fBcurs_window\fR(3X)
+mvgetch/\fBcurs_getch\fR(3X)
+mvgetnstr/\fBcurs_getstr\fR(3X)
+mvgetstr/\fBcurs_getstr\fR(3X)
+mvhline/\fBcurs_border\fR(3X)
+mvinch/\fBcurs_inch\fR(3X)
+mvinchnstr/\fBcurs_inchstr\fR(3X)
+mvinchstr/\fBcurs_inchstr\fR(3X)
+mvinnstr/\fBcurs_instr\fR(3X)
+mvinsch/\fBcurs_insch\fR(3X)
+mvinsnstr/\fBcurs_insstr\fR(3X)
+mvinsstr/\fBcurs_insstr\fR(3X)
+mvinstr/\fBcurs_instr\fR(3X)
+mvprintw/\fBcurs_printw\fR(3X)
+mvscanw/\fBcurs_scanw\fR(3X)
+mvwaddch/\fBcurs_addch\fR(3X)
+mvwaddchnstr/\fBcurs_addchstr\fR(3X)
+mvwaddchstr/\fBcurs_addchstr\fR(3X)
+mvwaddnstr/\fBcurs_addstr\fR(3X)
+mvwaddstr/\fBcurs_addstr\fR(3X)
+mvwchgat/\fBcurs_attr\fR(3X)
+mvwdelch/\fBcurs_delch\fR(3X)
+mvwgetch/\fBcurs_getch\fR(3X)
+mvwgetnstr/\fBcurs_getstr\fR(3X)
+mvwgetstr/\fBcurs_getstr\fR(3X)
+mvwhline/\fBcurs_border\fR(3X)
+mvwin/\fBcurs_window\fR(3X)
+mvwinch/\fBcurs_inch\fR(3X)
+mvwinchnstr/\fBcurs_inchstr\fR(3X)
+mvwinchstr/\fBcurs_inchstr\fR(3X)
+mvwinnstr/\fBcurs_instr\fR(3X)
+mvwinsch/\fBcurs_insch\fR(3X)
+mvwinsnstr/\fBcurs_insstr\fR(3X)
+mvwinsstr/\fBcurs_insstr\fR(3X)
+mvwinstr/\fBcurs_instr\fR(3X)
+mvwprintw/\fBcurs_printw\fR(3X)
+mvwscanw/\fBcurs_scanw\fR(3X)
+mvwvline/\fBcurs_border\fR(3X)
+napms/\fBcurs_kernel\fR(3X)
+newpad/\fBcurs_pad\fR(3X)
+newterm/\fBcurs_initscr\fR(3X)
+newwin/\fBcurs_window\fR(3X)
+nl/\fBcurs_outopts\fR(3X)
+nocbreak/\fBcurs_inopts\fR(3X)
+nodelay/\fBcurs_inopts\fR(3X)
+noecho/\fBcurs_inopts\fR(3X)
+nonl/\fBcurs_outopts\fR(3X)
+noqiflush/\fBcurs_inopts\fR(3X)
+noraw/\fBcurs_inopts\fR(3X)
+notimeout/\fBcurs_inopts\fR(3X)
+overlay/\fBcurs_overlay\fR(3X)
+overwrite/\fBcurs_overlay\fR(3X)
+pair_content/\fBcurs_color\fR(3X)
+pechochar/\fBcurs_pad\fR(3X)
+pnoutrefresh/\fBcurs_pad\fR(3X)
+prefresh/\fBcurs_pad\fR(3X)
+printw/\fBcurs_printw\fR(3X)
+putp/\fBcurs_terminfo\fR(3X)
+putwin/\fBcurs_util\fR(3X)
+qiflush/\fBcurs_inopts\fR(3X)
+raw/\fBcurs_inopts\fR(3X)
+redrawwin/\fBcurs_refresh\fR(3X)
+refresh/\fBcurs_refresh\fR(3X)
+reset_prog_mode/\fBcurs_kernel\fR(3X)
+reset_shell_mode/\fBcurs_kernel\fR(3X)
+resetty/\fBcurs_kernel\fR(3X)
+resizeterm/\fBresizeterm\fR(3X)*
+restartterm/\fBcurs_terminfo\fR(3X)
+ripoffline/\fBcurs_kernel\fR(3X)
+savetty/\fBcurs_kernel\fR(3X)
+scanw/\fBcurs_scanw\fR(3X)
+scr_dump/\fBcurs_scr_dump\fR(3X)
+scr_init/\fBcurs_scr_dump\fR(3X)
+scr_restore/\fBcurs_scr_dump\fR(3X)
+scr_set/\fBcurs_scr_dump\fR(3X)
+scrl/\fBcurs_scroll\fR(3X)
+scroll/\fBcurs_scroll\fR(3X)
+scrollok/\fBcurs_outopts\fR(3X)
+set_curterm/\fBcurs_terminfo\fR(3X)
+set_term/\fBcurs_initscr\fR(3X)
+setscrreg/\fBcurs_outopts\fR(3X)
+setsyx/\fBcurs_kernel\fR(3X)
+setterm/\fBcurs_terminfo\fR(3X)
+setupterm/\fBcurs_terminfo\fR(3X)
+slk_attr/\fBcurs_slk\fR(3X)*
+slk_attr_off/\fBcurs_slk\fR(3X)
+slk_attr_on/\fBcurs_slk\fR(3X)
+slk_attr_set/\fBcurs_slk\fR(3X)
+slk_attroff/\fBcurs_slk\fR(3X)
+slk_attron/\fBcurs_slk\fR(3X)
+slk_attrset/\fBcurs_slk\fR(3X)
+slk_clear/\fBcurs_slk\fR(3X)
+slk_color/\fBcurs_slk\fR(3X)
+slk_init/\fBcurs_slk\fR(3X)
+slk_label/\fBcurs_slk\fR(3X)
+slk_noutrefresh/\fBcurs_slk\fR(3X)
+slk_refresh/\fBcurs_slk\fR(3X)
+slk_restore/\fBcurs_slk\fR(3X)
+slk_set/\fBcurs_slk\fR(3X)
+slk_touch/\fBcurs_slk\fR(3X)
+standend/\fBcurs_attr\fR(3X)
+standout/\fBcurs_attr\fR(3X)
+start_color/\fBcurs_color\fR(3X)
+subpad/\fBcurs_pad\fR(3X)
+subwin/\fBcurs_window\fR(3X)
+syncok/\fBcurs_window\fR(3X)
+termattrs/\fBcurs_termattrs\fR(3X)
+termname/\fBcurs_termattrs\fR(3X)
+tgetent/\fBcurs_termcap\fR(3X)
+tgetflag/\fBcurs_termcap\fR(3X)
+tgetnum/\fBcurs_termcap\fR(3X)
+tgetstr/\fBcurs_termcap\fR(3X)
+tgoto/\fBcurs_termcap\fR(3X)
+tigetflag/\fBcurs_terminfo\fR(3X)
+tigetnum/\fBcurs_terminfo\fR(3X)
+tigetstr/\fBcurs_terminfo\fR(3X)
+timeout/\fBcurs_inopts\fR(3X)
+touchline/\fBcurs_touch\fR(3X)
+touchwin/\fBcurs_touch\fR(3X)
+tparm/\fBcurs_terminfo\fR(3X)
+tputs/\fBcurs_termcap\fR(3X)
+tputs/\fBcurs_terminfo\fR(3X)
+typeahead/\fBcurs_inopts\fR(3X)
+unctrl/\fBcurs_util\fR(3X)
+ungetch/\fBcurs_getch\fR(3X)
+ungetmouse/\fBcurs_mouse\fR(3X)*
+untouchwin/\fBcurs_touch\fR(3X)
+use_default_colors/\fBdft_fgbg\fR(3X)*
+use_env/\fBcurs_util\fR(3X)
+vidattr/\fBcurs_terminfo\fR(3X)
+vidputs/\fBcurs_terminfo\fR(3X)
+vline/\fBcurs_border\fR(3X)
+vw_printw/\fBcurs_printw\fR(3X)
+vw_scanw/\fBcurs_scanw\fR(3X)
+vwprintw/\fBcurs_printw\fR(3X)
+vwscanw/\fBcurs_scanw\fR(3X)
+waddch/\fBcurs_addch\fR(3X)
+waddchnstr/\fBcurs_addchstr\fR(3X)
+waddchstr/\fBcurs_addchstr\fR(3X)
+waddnstr/\fBcurs_addstr\fR(3X)
+waddstr/\fBcurs_addstr\fR(3X)
+wattr_get/\fBcurs_attr\fR(3X)
+wattr_off/\fBcurs_attr\fR(3X)
+wattr_on/\fBcurs_attr\fR(3X)
+wattr_set/\fBcurs_attr\fR(3X)
+wattroff/\fBcurs_attr\fR(3X)
+wattron/\fBcurs_attr\fR(3X)
+wattrset/\fBcurs_attr\fR(3X)
+wbkgd/\fBcurs_bkgd\fR(3X)
+wbkgdset/\fBcurs_bkgd\fR(3X)
+wborder/\fBcurs_border\fR(3X)
+wchgat/\fBcurs_attr\fR(3X)
+wclear/\fBcurs_clear\fR(3X)
+wclrtobot/\fBcurs_clear\fR(3X)
+wclrtoeol/\fBcurs_clear\fR(3X)
+wcolor_set/\fBcurs_attr\fR(3X)
+wcursyncup/\fBcurs_window\fR(3X)
+wdelch/\fBcurs_delch\fR(3X)
+wdeleteln/\fBcurs_deleteln\fR(3X)
+wechochar/\fBcurs_addch\fR(3X)
+wenclose/\fBcurs_mouse\fR(3X)*
+werase/\fBcurs_clear\fR(3X)
+wgetch/\fBcurs_getch\fR(3X)
+wgetnstr/\fBcurs_getstr\fR(3X)
+wgetstr/\fBcurs_getstr\fR(3X)
+whline/\fBcurs_border\fR(3X)
+winch/\fBcurs_inch\fR(3X)
+winchnstr/\fBcurs_inchstr\fR(3X)
+winchstr/\fBcurs_inchstr\fR(3X)
+winnstr/\fBcurs_instr\fR(3X)
+winsch/\fBcurs_insch\fR(3X)
+winsdelln/\fBcurs_deleteln\fR(3X)
+winsertln/\fBcurs_deleteln\fR(3X)
+winsnstr/\fBcurs_insstr\fR(3X)
+winsstr/\fBcurs_insstr\fR(3X)
+winstr/\fBcurs_instr\fR(3X)
+wmouse_trafo/\fBcurs_mouse\fR(3X)
+wmove/\fBcurs_move\fR(3X)
+wnoutrefresh/\fBcurs_refresh\fR(3X)
+wprintw/\fBcurs_printw\fR(3X)
+wredrawln/\fBcurs_refresh\fR(3X)
+wrefresh/\fBcurs_refresh\fR(3X)
+wresize/\fBwresize\fR(3X)*
+wscanw/\fBcurs_scanw\fR(3X)
+wscrl/\fBcurs_scroll\fR(3X)
+wsetscrreg/\fBcurs_outopts\fR(3X)
+wstandend/\fBcurs_attr\fR(3X)
+wstandout/\fBcurs_attr\fR(3X)
+wsyncdown/\fBcurs_window\fR(3X)
+wsyncup/\fBcurs_window\fR(3X)
+wtimeout/\fBcurs_inopts\fR(3X)
+wtouchln/\fBcurs_touch\fR(3X)
+wvline/\fBcurs_border\fR(3X)
+.TE
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fR upon failure and an
+integer value other than \fBERR\fR upon successful completion, unless
+otherwise noted in the routine descriptions.
+
+All macros return the value of the \fBw\fR version, except \fBsetscrreg\fR,
+\fBwsetscrreg\fR, \fBgetyx\fR, \fBgetbegyx\fR, \fBgetmaxyx\fR. The return
+values of \fBsetscrreg\fR, \fBwsetscrreg\fR, \fBgetyx\fR, \fBgetbegyx\fR, and
+\fBgetmaxyx\fR are undefined (\fIi\fR.\fIe\fR., these should not be used as the
+right-hand side of assignment statements).
+
+Routines that return pointers return \fBNULL\fR on error.
+.SH ENVIRONMENT
+The following environment symbols are useful for customizing the
+runtime behavior of the \fBncurses\fR library. The most important
+ones have been already discussed in detail.
+.TP 5
+BAUDRATE
+The debugging library checks this environment symbol when the application
+has redirected output to a file.
+The symbol's numeric value is used for the baudrate.
+If no value is found \fBncurses\fR uses 9600.
+This allows testers to construct repeatable test-cases
+that take into account costs that depend on baudrate.
+.TP 5
+CC
+When set, change occurrences of the command_character
+(i.e., the \fBcmdch\fP capability)
+of the loaded terminfo entries to the value of this symbol.
+Very few terminfo entries provide this feature.
+.TP 5
+COLUMNS
+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 $COLUMNS value nor the terminal's screen size is available,
+\fBncurses\fR uses the size which may be specified in the terminfo database
+(i.e., the \fBcols\fR capability).
+
+It is important that your application use a correct size for the screen.
+However, 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.
+
+Either COLUMNS or LINES 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\fR and \fBcols\fR should not be specified in
+a terminal description for terminals which are run as emulations.
+
+Use the \fBuse_env\fR function to disable this feature.
+.TP 5
+DISPLAY
+Provides a hint to ncurses that your terminal is an X terminal
+emulator such as \fBxterm\fP.
+If the \fBkmous\fP capability is set to the beginning of the xterm
+mouse response, e.g., "kmous=\E[M", then ncurses will send the terminal
+xterm's mouse initialization strings and allow appropriate replies.
+See the \fBcurs_mouse\fR(3X) manual page for programming information.
+.TP 5
+ESCDELAY
+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.
+.TP 5
+HOME
+Tells \fBncurses\fR where your home directory is.
+That is where it may read and write auxiliary terminal descriptions:
+
+$HOME/.termcap
+.br
+$HOME/.terminfo
+.TP 5
+LINES
+Like COLUMNS, specify the height of the screen in characters.
+See COLUMNS for a detailed description.
+.TP 5
+MOUSE_BUTTONS_123
+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
+.br
+2 = right
+.br
+3 = middle.
+
+This symbol lets you customize the mouse.
+The symbol must be three numeric digits 1-3 in any order, e.g., 123 or 321.
+If it is not specified, \fBncurses\fR uses 132.
+.TP 5
+NCURSES_NO_PADDING
+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 symbol to disable all but mandatory
+padding. Mandatory padding is used as a part of special control
+sequences such as \fIflash\fR.
+.TP 5
+NCURSES_NO_SETBUF
+Normally \fBncurses\fR enables buffered output during terminal initialization.
+This is done (as in SVr4 curses) for performance reasons.
+For testing purposes, both of \fBncurses\fR and certain applications,
+this feature is made optional. Setting the NCURSES_NO_SETBUF variable
+disables output buffering, leaving the output in the original (usually
+line buffered) mode.
+.TP 5
+NCURSES_TRACE
+During initialization, the \fBncurses\fR debugging library
+checks the NCURSES_TRACE symbol.
+If it is defined, to a numeric value, \fBncurses\fR calls the \fBtrace\fR
+function, using that value as the argument.
+
+The argument values, which are defined in \fBcurses.h\fR, provide several
+types of information.
+When running with traces enabled, your application will write the
+file \fBtrace\fR to the current directory.
+.TP 5
+TERM
+Denotes your terminal type.
+Each terminal type is distinct, though many are similar.
+.TP 5
+TERMCAP
+If the \fBncurses\fR library has been configured with \fItermcap\fR
+support, \fBncurses\fR will check for a terminal's description in
+termcap form if it is not available in the terminfo database.
+
+The TERMCAP symbol contains either a terminal description (with
+newlines stripped out),
+or a file name telling where the information denoted by the TERM symbol exists.
+In either case, setting it directs \fBncurses\fR to ignore
+the usual place for this information, e.g., /etc/termcap.
+.TP 5
+TERMINFO
+Overrides the directory in which \fBncurses\fR searches for your terminal
+description.
+This is the simplest, but not the only way to change the list of directories.
+The complete list of directories in order follows:
+.RS
+.TP 3
+-
+the last directory to which \fBncurses\fR wrote, if any, is searched first.
+.TP 3
+-
+the directory specified by the TERMINFO symbol
+.TP 3
+-
+$HOME/.terminfo
+.TP 3
+-
+directories listed in the TERMINFO_DIRS symbol
+.TP 3
+-
+one or more directories whose names are configured and compiled into the
+ncurses library, e.g.,
+@DATADIR@/terminfo
+.RE
+.TP 5
+TERMINFO_DIRS
+Specifies a list of directories to search for terminal descriptions.
+The list is separated by colons (i.e., ":").
+All of the terminal descriptions are in terminfo form, which makes
+a subdirectory named for the first letter of the terminal names therein.
+.TP 5
+TERMPATH
+If TERMCAP does not hold a file name then \fBncurses\fR checks
+the TERMPATH symbol.
+This is a list of filenames separated by colons (i.e., ":").
+If the TERMPATH symbol is not set, \fBncurses\fR looks in the files
+/etc/termcap, /usr/share/misc/termcap and $HOME/.termcap, in that order.
+.SH FILES
+.TP 5
+@DATADIR@/tabset
+directory containing initialization files for the terminal capability database
+@DATADIR@/terminfo
+terminal capability database
+.SH SEE ALSO
+\fBterminfo\fR(\*n) and 3X pages whose names begin "curs_" for detailed routine
+descriptions.
+.SH EXTENSIONS
+The \fBncurses\fR library can be compiled with an option (\fB-DUSE_GETCAP\fR)
+that falls back to the old-style /etc/termcap file if the terminal setup code
+cannot find a terminfo entry corresponding to \fBTERM\fR. Use of this feature
+is not recommended, as it essentially includes an entire termcap compiler in
+the \fBncurses\fR startup code, at significant cost in core and startup cycles.
+
+The \fBncurses\fR library includes facilities for capturing mouse events on
+certain terminals (including xterm). See the \fBcurs_mouse\fR(3X)
+manual page for details.
+
+The \fBncurses\fR library includes facilities for responding to window
+resizing events, e.g., when running in an xterm.
+See the \fBresizeterm\fR(3X)
+and \fBwresize\fR(3X) manual pages for details.
+In addition, the library may be configured with a SIGWINCH handler.
+
+The \fBncurses\fR 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\fR(3X)
+and \fBkeyok\fR(3X) manual pages for details.
+
+The \fBncurses\fR 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 \fBuse_default_colors\fR(3X) manual page for details.
+
+The \fBncurses\fR library includes a function for directing application output
+to a printer attached to the terminal device. See the \fBcurs_print\fR(3X)
+manual page for details.
+.SH PORTABILITY
+The \fBncurses\fR library is intended to be BASE-level conformant with the XSI
+Curses standard. Certain portions of the EXTENDED XSI Curses functionality
+(including color support) are supported. The following EXTENDED XSI Curses
+calls in support of wide (multibyte) characters are not yet implemented:
+\fBadd_wch\fP,
+\fBadd_wchnstr\fP,
+\fBadd_wchstr\fP,
+\fBaddnwstr\fP,
+\fBaddwstr\fP,
+\fBbkgrnd\fP,
+\fBbkgrndset\fP,
+\fBborder_set\fP,
+\fBbox_set\fP,
+\fBecho_wchar\fP,
+\fBerasewchar\fP,
+\fBget_wch\fP,
+\fBget_wstr\fP,
+\fBgetbkgrnd\fP,
+\fBgetcchar\fP,
+\fBgetn_wstr\fP,
+\fBgetwchtype\fP,
+\fBhline_set\fP,
+\fBin_wch\fP,
+\fBin_wchnstr\fP,
+\fBin_wchstr\fP,
+\fBinnwstr\fP,
+\fBins_nwstr\fP,
+\fBins_wch\fP,
+\fBins_wstr\fP,
+\fBinwchnstr\fP,
+\fBinwchstr\fP,
+\fBinwstr\fP,
+\fBkey_name\fP,
+\fBkillwchar\fP,
+\fBmvadd_wch\fP,
+\fBmvadd_wchnstr\fP,
+\fBmvadd_wchstr\fP,
+\fBmvaddnwstr\fP,
+\fBmvaddwstr\fP,
+\fBmvget_wch\fP,
+\fBmvget_wstr\fP,
+\fBmvgetn_wstr\fP,
+\fBmvhline_set\fP,
+\fBmvin_wch\fP,
+\fBmvinnwstr\fP,
+\fBmvins_nwstr\fP,
+\fBmvins_wch\fP,
+\fBmvins_wstr\fP,
+\fBmvinwchnstr\fP,
+\fBmvinwchstr\fP,
+\fBmvinwchstr\fP,
+\fBmvinwstr\fP,
+\fBmvvline_set\fP,
+\fBmvwadd_wch\fP,
+\fBmvwadd_wchnstr\fP,
+\fBmvwadd_wchstr\fP,
+\fBmvwaddnwstr\fP,
+\fBmvwaddwstr\fP,
+\fBmvwget_ch\fP,
+\fBmvwget_wch\fP,
+\fBmvwget_wstr\fP,
+\fBmvwgetn_wstr\fP,
+\fBmvwhline_set\fP,
+\fBmvwin_wch\fP,
+\fBmvwin_wchnstr\fP,
+\fBmvwin_wchstr\fP,
+\fBmvwinnwstr\fP,
+\fBmvwins_nwstr\fP,
+\fBmvwins_wch\fP,
+\fBmvwins_wstr\fP,
+\fBmvwinwchnstr\fP.
+\fBmvwinwstr\fP,
+\fBmvwvline_set\fP,
+\fBpecho_wchar\fP,
+\fBsetcchar\fP,
+\fBslk_wset\fP,
+\fBterm_attrs\fP,
+\fBunget_wch\fP,
+\fBvhline_set\fP,
+\fBvid_attr\fP,
+\fBvid_puts\fP,
+\fBvline_set\fP,
+\fBwadd_wch\fP,
+\fBwadd_wchnstr\fP,
+\fBwadd_wchstr\fP,
+\fBwaddnwstr\fP,
+\fBwaddwstr\fP,
+\fBwaddwstr\fP,
+\fBwbkgrnd\fP,
+\fBwbkgrndset\fP,
+\fBwbkgrndset\fP,
+\fBwborder_set\fP,
+\fBwecho_wchar\fP,
+\fBwecho_wchar\fP,
+\fBwget_wch\fP,
+\fBwget_wstr\fP,
+\fBwgetbkgrnd\fP,
+\fBwgetn_wstr\fP,
+\fBwhline_set\fP,
+\fBwin_wch\fP,
+\fBwin_wchnstr\fP,
+\fBwin_wchstr\fP,
+\fBwinnwstr\fP,
+\fBwins_nwstr\fP,
+\fBwins_wch\fP,
+\fBwins_wstr\fP,
+\fBwinwchnstr\fP,
+\fBwinwchstr\fP,
+\fBwinwstr\fP,
+\fBwunctrl\fP,
+\fBwvline_set\fP,
+.PP
+A small number of local differences (that is, individual differences between
+the XSI Curses and \fBncurses\fR calls) are described in \fBPORTABILITY\fR
+sections of the library man pages.
+.PP
+The routine \fBhas_key\fR is not part of XPG4, nor is it present in SVr4. See
+the \fBcurs_getch\fR(3X) manual page for details.
+.PP
+The routine \fBslk_attr\fR is not part of XPG4, nor is it present in SVr4. See
+the \fBcurs_slk\fR(3X) manual page for details.
+.PP
+The routines \fBgetmouse\fR, \fBmousemask\fR, \fBungetmouse\fR,
+\fBmouseinterval\fR, and \fBwenclose\fR relating to mouse interfacing are not
+part of XPG4, nor are they present in SVr4. See the \fBcurs_mouse\fR(3X)
+manual page for details.
+.PP
+The routine \fBmcprint\fR was not present in any previous curses
+implementation. See the \fBcurs_print\fR(3X) manual page for details.
+.PP
+The routine \fBwresize\fR is not part of XPG4, nor is it present in SVr4. See
+the \fBwresize\fR(3X) manual page for details.
+.PP
+In historic curses versions, delays embedded in the capabilities \fBcr\fR,
+\fBind\fR, \fBcub1\fR, \fBff\fR and \fBtab\fR activated corresponding delay
+bits in the UNIX tty driver. In this implementation, all padding is done by
+NUL sends. This method is slightly more expensive, but narrows the interface
+to the UNIX kernel significantly and increases the package's portability
+correspondingly.
+.PP
+In the XSI standard and SVr4 manual pages, many entry points have prototype
+arguments of the for \fBchar *const\fR (or \fBcchar_t *const\fR, or
+\fBwchar_t *const\fR, or \fBvoid *const\fR). Depending on one's interpretation of the
+ANSI C standard (see section 3.5.4.1), these declarations are either (a)
+meaningless, or (b) meaningless and illegal. The declaration
+\fBconst char *x\fR is a modifiable pointer to unmodifiable data, but
+\fBchar *const x\fR' is
+an unmodifiable pointer to modifiable data. Given that C passes arguments by
+value, \fB<type> *const\fR as a formal type is at best dubious. Some compilers
+choke on the prototypes. Therefore, in this implementation, they have been
+changed to \fBconst <type> *\fR globally.
+.SH NOTES
+The header file \fB<curses.h>\fR automatically includes the header files
+\fB<stdio.h>\fR and \fB<unctrl.h>\fR.
+
+If standard output from a \fBncurses\fR 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 pcurses by Pavel Curtis.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/panel.3x b/contrib/ncurses/man/panel.3x
new file mode 100644
index 000000000000..046778a8cf96
--- /dev/null
+++ b/contrib/ncurses/man/panel.3x
@@ -0,0 +1,182 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: panel.3x,v 1.9 1998/03/11 21:12:53 juergen Exp $
+.TH panel 3X ""
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+panel - panel stack extension for curses
+.SH SYNOPSIS
+\fB#include <panel.h>\fR
+.P
+\fBcc [flags] sourcefiles -lpanel -lncurses\fR
+.P
+\fBPANEL *new_panel(WINDOW *win)\fR
+.br
+\fBint bottom_panel(PANEL *pan)\fR
+.br
+\fBint top_panel(PANEL *pan)\fR
+.br
+\fBint show_panel(PANEL *pan)\fR
+.br
+\fBvoid update_panels();\fR
+.br
+\fBint hide_panel(PANEL *pan)\fR
+.br
+\fBWINDOW *panel_window(const PANEL *pan)\fR
+.br
+\fBint replace_panel(PANEL *pan, WINDOW *window)\fR
+.br
+\fBint move_panel(PANEL *pan, int starty, int startx)\fR
+.br
+\fBint panel_hidden(const PANEL *pan)\fR
+.br
+\fBPANEL *panel_above(const PANEL *pan)\fR
+.br
+\fBPANEL *panel_below(const PANEL *pan)\fR
+.br
+\fBint set_panel_userptr(PANEL *pan, const void *ptr)\fR
+.br
+\fBconst void *panel_userptr(const PANEL *pan)\fR
+.br
+\fBint del_panel(PANEL *pan)\fR
+.br
+.SH DESCRIPTION
+Panels are \fBcurses\fR(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\fR 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\fR 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, hides, 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\fR(3X), make only
+high-level curses calls, and work anywhere terminfo curses does.
+.SH FUNCTIONS
+.TP
+\fBnew_panel(win)\fR
+allocates a \fBPANEL\fR structure, associates it with
+\fBwin\fR, 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.
+.TP
+\fBvoid update_panels()\fR
+refreshes the virtual screen to reflect the relations between the
+panels in the stack, but does not call doupdate() to refresh the
+physical screen. Use this function and not wrefresh or wnoutrefresh.
+update_panels() may be called more than once before a call to
+doupdate(), but doupdate() is the function responsible for updating
+the physical screen.
+.TP
+\fBdel_panel(pan)\fR
+removes the given panel from the stack and deallocates the
+\fBPANEL\fR structure (but not its associated window).
+.TP
+\fBhide_panel(pan)\fR
+removes the given panel from the panel stack and thus hides it from
+view. The \fBPANEL\fR structure is not lost, merely removed from the stack.
+.TP
+\fBshow_panel(pan)\fR
+makes a hidden panel visible by placing it on top of the panels in the
+panel stack. See COMPATIBILITY below.
+.TP
+\fBtop_panel(pan)\fR
+puts the given visible panel on top of all panels in the stack. See
+COMPATIBILITY below.
+.TP
+\fBbottom_panel(pan)\fR
+puts panel at the bottom of all panels.
+.TP
+\fBmove_panel(pan,starty,startx)\fR
+moves the given panel window so that its upper-left corner is at
+\fBstarty\fR, \fBstartx\fR. It does not change the position of the
+panel in the stack. Be sure to use this function, not \fBmvwin()\fR,
+to move a panel window.
+.TP
+\fBreplace_panel(pan,window)\fR
+replaces the current window of panel with \fBwindow\fR (useful, for
+example if you want to resize a panel; if you're using \fBncurses\fR,
+you can call \fBreplace_panel\fR on the output of \fBwresize\fR(3X)).
+It does not change the position of the panel in the stack.
+.TP
+\fBpanel_above(pan)\fR
+returns a pointer to the panel above pan. If the panel argument is
+\fB(PANEL *)0\fR, it returns a pointer to the bottom panel in the stack.
+.TP
+\fBpanel_below(pan)\fR
+returns a pointer to the panel just below pan. If the panel argument
+is \fB(PANEL *)0\fR, it returns a pointer to the top panel in the stack.
+.TP
+\fBset_panel_userptr(pan,ptr)\fR
+sets the panel's user pointer.
+.TP
+\fBpanel_userptr(pan)\fR
+returns the user pointer for a given panel.
+.TP
+\fBpanel_window(pan)\fR
+returns a pointer to the window of the given panel.
+.SH DIAGNOSTICS
+Each routine that returns a pointer returns \fBNULL\fR if an error
+occurs. Each routine that returns an int value returns \fBOK\fR if it
+executes successfully and \fBERR\fR if not.
+.SH COMPATIBILITY
+Reasonable care has been taken to ensure compatibility
+with the native panel facility introduced in SVr3.2 (inspection of
+the SVr4 manual pages suggests the programming interface is unchanged).
+The \fBPANEL\fR data structures are merely similar. The programmer
+is cautioned not to directly use \fBPANEL\fR fields.
+.P
+The functions \fBshow_panel()\fR and \fBtop_panel()\fR are identical
+in this implementation, and work equally well with displayed or hidden
+panels. In the native System V implementation, \fBshow_panel()\fR is
+intended for making a hidden panel visible (at the top of the stack)
+and \fBtop_panel()\fR 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 want to say `-lpanel -lncurses', not the other way around (which would
+give you a link error using GNU \fBld\fR(1) and some other linkers).
+.SH FILES
+.P
+panel.h
+interface for the panels library
+.P
+libpanel.a
+the panels library itself
+.SH SEE ALSO
+\fBcurses\fR(3X)
+.SH AUTHOR
+Originally written by Warren Tucker <wht@n4hgf.mt-park.ga.us>,
+primarily to assist in porting u386mon to systems without a native
+panels library. Repackaged for ncurses by Zeyd ben-Halim.
diff --git a/contrib/ncurses/man/resizeterm.3x b/contrib/ncurses/man/resizeterm.3x
new file mode 100644
index 000000000000..9c7cc8fd3873
--- /dev/null
+++ b/contrib/ncurses/man/resizeterm.3x
@@ -0,0 +1,87 @@
+.\"***************************************************************************
+.\" Copyright (c) 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> 1996,1997
+.\"
+.\" $Id: resizeterm.3x,v 1.7 1998/03/14 23:42:52 tom Exp $
+.TH resizeterm 3X ""
+.SH NAME
+\fBresizeterm\fR - change the curses terminal size
+..
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint resizeterm(int lines, int columns);\fR
+..
+.SH DESCRIPTION
+This is an extension to the curses library.
+It provides callers with a hook into the \fBncurses\fR data to resize windows,
+primarily for use by programs running in an X Window terminal (e.g., xterm).
+The function \fBresizeterm\fR resizes the standard and current windows
+to the specified dimensions, and adjusts other bookkeeping data used by
+the \fBncurses\fR library that record the window dimensions.
+
+When resizing the windows, the function blank-fills the areas that are
+extended. The calling application should fill in these areas with
+appropriate data.
+
+The function attempts to resize all windows.
+However, due to the calling convention of pads,
+it is not possible to resize these
+without additional interaction with the application.
+..
+.SH RETURN VALUE
+The function returns the integer \fBERR\fR upon failure and \fBOK\fR 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 windows.
+..
+.SH NOTES
+While this function is intended to be used to support a signal handler
+(i.e., for SIGWINCH), care should be taken to avoid invoking it in a
+context where \fBmalloc\fR or \fBrealloc\fR may have been interrupted,
+since it uses those functions.
+..
+.PP
+If ncurses is configured to supply its own SIGWINCH handler,
+the \fBresizeterm\fR function ungetch's a \fBKEY_RESIZE\fR which
+will be read on the next call to \fBgetch\fR.
+This is used to alert an application that the screen size has changed,
+and that it should repaint special features such as pads that cannot
+be done automatically.
+..
+.SH SEE ALSO
+\fBwresize\fR(3X).
+..
+.SH AUTHOR
+Thomas Dickey (from an equivalent function written in 1988 for BSD curses).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/term.5 b/contrib/ncurses/man/term.5
new file mode 100644
index 000000000000..f79679db608d
--- /dev/null
+++ b/contrib/ncurses/man/term.5
@@ -0,0 +1,208 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: term.5,v 1.9 1998/03/11 21:12:53 juergen Exp $
+.TH TERM 5
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+term \- format of compiled term file.
+.SH SYNOPSIS
+.B term
+.SH DESCRIPTION
+.PP
+Compiled terminfo descriptions are placed under the directory \fB\*d\fP.
+In order to avoid a linear search of a huge \s-1UNIX\s+1 system directory, a
+two-level scheme is used: \fB\*b/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.
+.PP
+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
+.I tic
+program, and read by the routine
+.IR setupterm .
+The file is divided into six parts:
+the header,
+terminal names,
+boolean flags,
+numbers,
+strings,
+and
+string table.
+.PP
+The header section begins the file.
+This section contains six short integers in the format
+described below.
+These integers are
+(1) the magic number (octal 0432);
+(2) the size, in bytes, of the names section;
+(3) the number of bytes in the boolean section;
+(4) the number of short integers in the numbers section;
+(5) the number of offsets (short integers) in the strings section;
+(6) the size, in bytes, of the string table.
+.PP
+Short integers are stored in 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.)
+The value \-1 is represented by the two bytes 0377, 0377; other negative
+values are illegal. This value generally
+means that the corresponding capability is missing from this terminal.
+Note that 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
+The terminal names section comes next.
+It contains the first line of the terminfo description,
+listing the various names for the terminal,
+separated by the `|' character.
+The section is terminated with an \s-1ASCII NUL\s+1 character.
+.PP
+The boolean flags have one byte for each flag.
+This byte is either 0 or 1 as the flag is present or absent.
+The capabilities are in the same order as the file <term.h>.
+.PP
+Between the boolean section and the number section,
+a null byte will be inserted, if necessary,
+to ensure that the number section begins on an even byte (this is a
+relic of the PDP-11's word-addressed architecture, originally
+designed in to avoid IOT traps induced by addressing a word on an
+odd byte boundary).
+All short integers are aligned on a short word boundary.
+.PP
+The numbers section is similar to the flags section.
+Each capability takes up two bytes,
+and is stored as a little-endian short integer.
+If the value represented is \-1, the capability is taken to be missing.
+.PP
+The strings section is also similar.
+Each capability is stored as a short integer, in the format above.
+A value of \-1 means the capability is missing.
+Otherwise, the value is taken as an offset from the beginning
+of the string table.
+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.
+.PP
+The final section is the string table.
+It contains all the values of string capabilities referenced in
+the string section.
+Each string is null terminated.
+.PP
+Note that it is possible for
+.I setupterm
+to expect a different set of capabilities
+than are actually present in the file.
+Either the database may have been updated since
+.I setupterm
+has been 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
+.I 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.
+.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\fR(\*n) for detailed
+discussion of terminfo source compatibility issues.
+.PP
+As an example, here is a hex dump of the description for the Lear-Siegler
+ADM-3, a popular though rather stupid early terminal:
+.nf
+.sp
+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,
+.sp
+.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
+.fi
+.sp
+.PP
+Some limitations: total compiled entries cannot exceed 4096 bytes.
+The name field cannot exceed 128 bytes.
+.SH FILES
+\*d/*/* compiled terminal capability data base
+.SH "SEE ALSO"
+\fBcurses\fR(3X), \fBterminfo\fR(\*n).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/term.7 b/contrib/ncurses/man/term.7
new file mode 100644
index 000000000000..e8f81bb6f0d7
--- /dev/null
+++ b/contrib/ncurses/man/term.7
@@ -0,0 +1,204 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: term.7,v 1.11 1999/01/24 02:35:14 Todd.Miller Exp $
+.TH TERM 7
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+term \- conventions for naming terminal types
+.SH DESCRIPTION
+.PP
+The environment variable \fBTERM\fR 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\fR value will be set on a per-line basis by either
+\fB/etc/inittab\fR (Linux and System-V-like UNIXes) or \fB/etc/ttys\fR (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\fR 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\fR setting to your
+taste in your shell profile. The \fBtset\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\fR 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
+
+ toe | more
+
+from your shell. These capability files are in a binary format optimized for
+retrieval speed (unlike the old text-based \fBtermcap\fR format they replace);
+to examine an entry, you must use the \fBinfocmp\fR(1) command. Invoke it as
+follows:
+
+ infocmp \fIentry-name\fR
+
+where \fIentry-name\fR 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\fR(\*n).
+.PP
+The first line of a \fBterminfo\fR(\*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\fR, and is the one to use when setting \fBTERM\fR. 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\fR for Hewlett-Packard, \fBwy\fR for
+Wyse, or \fBatt\fR for AT&T terminals), or a common name of the terminal line
+(\fBvt\fR for the VT series of terminals from DEC, or \fBsun\fR for Sun
+Microsystems workstation consoles, or \fBregent\fR 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\fR, \fBhp2621\fR, \fBwy50\fR.
+.PP
+The root name for a PC-Unix console type should be the OS name,
+i.e. \fBlinux\fR, \fBbsdos\fR, \fBfreebsd\fR, \fBnetbsd\fR. It should
+\fInot\fR be \fBconsole\fR 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 doesn't fit one of the
+standard ANSI or vt100 types) should be the program name or a readily
+recognizable abbreviation of it (i.e. \fBversaterm\fR, \fBctrm\fR).
+.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\fR (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\fR 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 data base
+.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\fR(3X), \fBterminfo\fR(\*n), \fBterm\fR(\*n).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/terminfo.head b/contrib/ncurses/man/terminfo.head
new file mode 100644
index 000000000000..3118c1577fcf
--- /dev/null
+++ b/contrib/ncurses/man/terminfo.head
@@ -0,0 +1,95 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: terminfo.head,v 1.8 1998/03/11 21:12:53 juergen Exp $
+.TH TERMINFO 5 "" "" "File Formats"
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+terminfo \- terminal capability data base
+.SH SYNOPSIS
+\*d/*/*
+.SH DESCRIPTION
+.I Terminfo
+is a data base describing terminals, used by screen-oriented programs such as
+\fBnvi\fR(1),
+\fBrogue\fR(1)
+and libraries such as
+\fBcurses\fR(3X).
+.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
+Entries in
+.I terminfo
+consist of a sequence of `,' separated fields (embedded commas may be
+escaped with a backslash or notated as \e072).
+White space after the `,' separator is ignored.
+The first entry 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,
+the last name given should be a long name fully identifying the terminal,
+and all others are understood as synonyms for the terminal name.
+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.
+.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(7)\fR manual page.
+.SS Capabilities
+.\" Head of terminfo man page ends here
+.ps -1
diff --git a/contrib/ncurses/man/terminfo.tail b/contrib/ncurses/man/terminfo.tail
new file mode 100644
index 000000000000..7b019db34856
--- /dev/null
+++ b/contrib/ncurses/man/terminfo.tail
@@ -0,0 +1,1497 @@
+.\" $Id: terminfo.tail,v 1.29 1999/03/07 02:09:07 tom Exp $
+.\" Beginning of terminfo.tail file
+.ps +1
+.PP
+.SS A Sample Entry
+.PP
+The following entry, describing an ANSI-standard terminal, is representative
+of what a \fBterminfo\fR entry for a modern terminal typically looks like.
+.PP
+.nf
+.in -2
+.ta .3i
+.ft CW
+\s-2ansi|ansi/pc-term compatible with color,
+ mc5i,
+ colors#8, ncv#3, pairs#64,
+ 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[%p1%dG, ht=\\E[I,
+ ich=\\E[%p1%d@, il=\\E[%p1%dL, indn=\\E[%p1%dS, .indn=\\E[%p1%dT,
+ kbs=^H, kcbt=\\E[Z, kcub1=\\E[D, kcud1=\\E[B,
+ kcuf1=\\E[C, kcuu1=\\E[A, 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,
+ kich1=\\E[L, mc4=\\E[4i, mc5=\\E[5i, nel=\\r\\E[S,
+ op=\\E[37;40m, rep=%p1%c\\E[%p2%{1}%-%db,
+ rin=\\E[%p1%dT, s0ds=\\E(B, s1ds=\\E)B, s2ds=\\E*B,
+ s3ds=\\E+B, 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;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p8%t;11%;%?%p9%t;12%;m,
+ sgr0=\\E[0;10m, tbc=\\E[2g, u6=\\E[%d;%dR, u7=\\E[6n,
+ u8=\\E[?%[;0123456789]c, u9=\\E[c, vpa=\\E[%p1%dd,\s+2
+.in +2
+.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:
+Boolean capabilities which indicate that the terminal has
+some particular feature, numeric capabilities giving the size of the terminal
+or the size of particular delays, and 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\fR.
+Hence the description of ansi includes \fBam\fR.
+Numeric capabilities are followed by the character `#' and then a positive value.
+Thus \fBcols\fR, 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\fR (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. Both \fB\eE\fR and \fB\ee\fR
+map to an \s-1ESCAPE\s0 character,
+\fB^x\fR maps to a control-x for any appropriate x, and the sequences
+\fB\en \el \er \et \eb \ef \es\fR give
+a newline, line-feed, return, tab, backspace, form-feed, and space.
+Other escapes include \fB\e^\fR for \fB^\fR,
+\fB\e\e\fR for \fB\e\fR,
+\fB\e\fR, for comma,
+\fB\e:\fR for \fB:\fR,
+and \fB\e0\fR for null.
+(\fB\e0\fR will produce \e200, which does not terminate a string but behaves
+as a null character on most terminals, providing CS7 is specified. See stty(1).)
+Finally, characters may be given as three octal digits after a \fB\e\fR.
+.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
+.I tputs
+to provide this delay. The delay must be a number with at most one decimal
+place of precision; it may be followed by suffixes `*' or '/' or both. 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
+.IR lines
+affected.) Normally, padding is advisory if the device has the \fBxon\fR
+capability; it is used for cost computation but does not trigger delays. A `/'
+suffix indicates that the padding is mandatory and forces a delay of the given
+number of milliseconds even on devices for which \fBxon\fR 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
+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.
+.PP
+If TERMINFO is not set, the \fBncurses\fR version of the terminfo reader code
+will instead look in the directory \fB$HOME/.terminfo\fR
+for a compiled description.
+If it fails to find one there, and the environment variable TERMINFO_DIRS is
+set, it will interpret the contents of that variable as a list of colon-
+separated directories to be searched (an empty entry is interpreted as a
+command to search \fI\*d\fR). If no description is found in any of the
+TERMINFO_DIRS directories, the fetch fails.
+.PP
+If neither TERMINFO nor TERMINFO_DIRS is set, the last place tried will be the
+system terminfo directory, \fI\*d\fR.
+.PP
+(Neither the \fB$HOME/.terminfo\fR lookups nor TERMINFO_DIRS extensions are
+supported under stock System V terminfo/curses.)
+.PP
+.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\fR numeric capability. If the terminal is a \s-1CRT\s0, then the
+number of lines on the screen is given by the \fBlines\fR 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\fR capability.
+If the terminal can clear its screen, leaving the cursor in the home
+position, then this is given by the \fBclear\fR string capability.
+If the terminal overstrikes
+(rather than clearing a position when a character is struck over)
+then it should have the \fBos\fR 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\fR 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\fR.
+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 \*(lqglass-tty\*(rq terminals.
+Thus the model 33 teletype is described as
+.PP
+.DT
+.nf
+.ft CW
+.in -7
+ \s-133\||\|tty33\||\|tty\||\|model 33 teletype,
+ bel=^G, cols#72, cr=^M, cud1=^J, hc, ind=^J, os,\s+1
+.in +7
+.ft R
+.PP
+while the Lear Siegler \s-1ADM\-3\s0 is described as
+.PP
+.DT
+.nf
+.ft CW
+.in -7
+ \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 +7
+.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
+.IR printf (3S)
+like escapes \fB%x\fR 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.
+Often more complex operations are necessary.
+.PP
+The \fB%\fR encodings have the following meanings:
+.PP
+.DT
+.nf
+.ta .5i 1.5i
+ \s-1%% outputs `%'
+ %\fI[[\fP:\fI]flags][width[.precision]][\fPdoxXs\fI]\fP
+ as in \fBprintf\fP, flags are [-+#] and space
+ %c print pop() gives %c
+
+ %p[1-9] push \fIi\fP'th 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
+ %'\fIc\fP' char constant \fIc\fP
+ %{\fInn\fP} integer constant \fInn\fP
+ %l push strlen(pop)
+
+ %+ %- %* %/ %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 a la Algol 68:
+ %? c\d1\u %t b\d1\u %e c\d2\u %t b\d2\u %e c\d3\u %t b\d3\u %e c\d4\u %t b\d4\u %e %;
+\s+1 c\di\u are conditions, b\di\u are bodies.
+.fi
+.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}%-". %P and %g 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\fR capability is \*(lqcup=6\eE&%p2%2dc%p1%2dY\*(rq.
+.PP
+The Microterm \s-1ACT-IV\s0 needs the current row and column sent
+preceded by a \fB^T\fR, with the row and column simply encoded in binary,
+\*(lqcup=^T%p1%c%p2%c\*(rq.
+Terminals which use \*(lq%c\*(rq need to be able to
+backspace the cursor (\fBcub1\fR),
+and to move the cursor up one line on the screen (\fBcuu1\fR).
+This is necessary because it is not always safe to transmit \fB\en\fR
+\fB^D\fR and \fB\er\fR, 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 \*(lqcup=\eE=%p1%' '%+%c%p2%' '%+%c\*(rq.
+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\fR; similarly a fast way of getting to the lower left-hand corner
+can be given as \fBll\fR; this may involve going up with \fBcuu1\fR
+from the home position,
+but a program should never do this itself (unless \fBll\fR 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
+.BR 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\fR and \fBrmcup\fR.
+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 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\fR.
+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\fR.
+\fBEd\fR 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\fR; 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\fR; 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\fR(3X) library does this synthesis
+automatically, so you need not compose insert/delete strings for
+an entry with \fBcsr\fR).
+.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\fR 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\fR followed by \fBdl1\fR or \fBind\fR. If the data scrolled
+off the bottom of the region by the \fBri\fR re-appears, then scrolling
+is non-destructive. System V and XSI Curses expect that \fBind\fR, \fBri\fR,
+\fBindn\fR, and \fBrin\fR will simulate destructive scrolling; their
+documentation cautions you not to define \fBcsr\fR unless this is true.
+This \fBcurses\fR implementation is more liberal and will do explicit erases
+after scrolling if \fBndstr\fR 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\fR capability should be given; if display memory can be retained
+below, then \fBdb\fR 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\fR 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. You can determine the
+kind of terminal you have by clearing the screen and then typing
+text separated by cursor motions. Type \*(lqabc\ \ \ \ def\*(rq using local
+cursor motions (not spaces) between the \*(lqabc\*(rq and the \*(lqdef\*(rq.
+Then position the cursor before the \*(lqabc\*(rq 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 \*(lqabc\*(rq
+shifts over to the \*(lqdef\*(rq 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\fR, which stands for
+\*(lqinsert null\*(rq.
+While these are two logically separate attributes (one line vs. 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\fR the sequence to get into insert mode.
+Give as \fBrmir\fR the sequence to leave insert mode.
+Now give as \fBich1\fR 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\fR; 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\fR.
+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\fR sequences do not
+require previous smir, and most smir insert modes do not require \fBich1\fR
+before each character. Therefore, the new \fBcurses\fR actually assumes this
+is the case and uses either \fBrmir\fR/\fBsmir\fR or \fBich\fR/\fBich1\fR 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\fR/\fBsmir\fR sequences in \fBich1\fR.
+.PP
+If post insert padding is needed, give this as a number of milliseconds
+in \fBip\fR (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\fR.
+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\fR to speed up inserting
+in this case. Omitting \fBmir\fR will affect only speed. Some terminals
+(notably Datamedia's) must not have \fBmir\fR 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\fR and \fBrmdc\fR
+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\fR,
+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\fR and \fBrmso\fR, 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\fR should be given to tell how many spaces are left.
+.PP
+Codes to begin underlining and end underlining can be given as \fBsmul\fR
+and \fBrmul\fR 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\fR.
+.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 c c
+l c c
+lw28 lw6 lw2 lw20.
+\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
+.TS
+center;
+l c c
+l c c
+lw28 lw6 lw2 lw20.
+\fBsequence when to output terminfo translation\fP
+
+\\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%;
+.TE
+.PP
+Putting this all together into the sgr sequence gives:
+.PP
+.nf
+ 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%;,
+.fi
+.PP
+Remember that if you specify sgr, you must also specify sgr0.
+.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\fR; 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
+.BR 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\fR.
+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\fR.
+.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\fR and \fBrmkx\fR.
+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
+\fBkcub1, kcuf1, kcuu1, kcud1, \fRand\fB khome\fR respectively.
+If there are function keys such as f0, f1, ..., f10, the codes they send
+can be given as \fBkf0, kf1, ..., kf10\fR.
+If these keys have labels other than the default f0 through f10, the labels
+can be given as \fBlf0, lf1, ..., lf10\fR.
+The codes transmitted by certain other special keys can be given:
+.B kll
+(home down),
+.B kbs
+(backspace),
+.B ktbc
+(clear all tabs),
+.B kctab
+(clear the tab stop in this column),
+.B kclr
+(clear screen or erase key),
+.B kdch1
+(delete character),
+.B kdl1
+(delete line),
+.B krmir
+(exit insert mode),
+.B kel
+(clear to end of line),
+.B ked
+(clear to end of screen),
+.B kich1
+(insert character or enter insert mode),
+.B kil1
+(insert line),
+.B knp
+(next page),
+.B kpp
+(previous page),
+.B kind
+(scroll forward/down),
+.B kri
+(scroll backward/up),
+.B khts
+(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
+.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
+If the terminal has hardware tabs, the command to advance to the next
+tab stop can be given as
+.B ht
+(usually control I).
+A ``back-tab'' command which moves leftward to the preceding tab stop can
+be given as
+.BR cbt .
+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.
+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.
+This is normally used by the
+.IR tset
+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
+.BR is1 ,
+.BR is2 ,
+and
+.BR is3 ,
+initialization strings for the terminal,
+.BR iprog ,
+the path name of a program to be run to initialize the terminal,
+and \fBif\fR, 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
+.I init
+option of the
+.IR tput
+program, each time the user logs in.
+They will be printed in the following order:
+run the program
+.BR iprog ;
+output
+.BR is1 ;
+.BR is2 ;
+set the margins using
+.BR mgc ,
+.BR smgl and
+.BR smgr ;
+set tabs using
+.B tbc
+and
+.BR hts ;
+print the file
+.BR if ;
+and finally
+output
+.BR is3 .
+.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 .
+A pair of sequences that does a harder reset from a totally unknown state
+can be analogously given as
+.BR rs1 ,
+.BR rs2 ,
+.BR rf ,
+and
+.BR rs3 ,
+analogous to
+.B is2
+and
+.BR if .
+These strings are output by the
+.IR reset
+program, which is used when the terminal gets into a wedged state.
+Commands are normally placed in
+.BR rs1 ,
+.BR 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
+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 .
+.SS Delays and Padding
+.PP
+Many older and slower terminals don't 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 don't 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\fR (padding baud rate) is given, padding is suppressed at baud rates
+below the value of \fBpb\fR. If the entry has no padding baud rate, then
+whether padding is emitted or not is completely controlled by \fBxon\fR.
+.PP
+If the terminal requires other than a null (zero) character as a pad,
+then this can be given as \fBpad\fR.
+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\fR 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\fR 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\fR which takes the cursor to a given zero-origin column on the
+status line. The capability \fBfsl\fR must return to the main-screen
+cursor positions before the last \fBtsl\fR. You may need to embed the
+string values of \fBsc\fR (save cursor) and \fBrc\fR (restore cursor)
+in \fBtsl\fR and \fBfsl\fR 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\fR.
+.PP
+A command to erase or blank the status line may be specified as \fBdsl\fR.
+.PP
+The boolean capability \fBeslok\fR specifies that escape sequences, tabs,
+etc. work ordinarily in the status line.
+.PP
+The \fBncurses\fR 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\fR build in support for 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\fR capability.
+.PP
+.TS H
+center expand;
+c l l c
+c l l c
+lw28 lw6 lw2 lw20.
+.\".TH
+\fBGlyph ACS Ascii VT100\fR
+\fBName Name Default Name\fR
+UK pound sign ACS_STERLING f }
+arrow pointing down ACS_DARROW v .
+arrow pointing left ACS_LARROW < ,
+arrow pointing right ACS_RARROW > +
+arrow pointing up ACS_UARROW ^ -
+board of squares ACS_BOARD # h
+bullet ACS_BULLET o ~
+checker board (stipple) ACS_CKBOARD : a
+degree symbol ACS_DEGREE \e f
+diamond ACS_DIAMOND + `
+greater-than-or-equal-to ACS_GEQUAL > z
+greek pi ACS_PI * {
+horizontal line ACS_HLINE - q
+lantern symbol ACS_LANTERN # i
+large plus or crossover ACS_PLUS + n
+less-than-or-equal-to ACS_LEQUAL < y
+lower left corner ACS_LLCORNER + m
+lower right corner ACS_LRCORNER + j
+not-equal ACS_NEQUAL ! |
+plus/minus ACS_PLMINUS # g
+scan line 1 ACS_S1 ~ o
+scan line 3 ACS_S3 - p
+scan line 7 ACS_S7 - r
+scan line 9 ACS_S9 \&_ s
+solid square block ACS_BLOCK # 0
+tee pointing down ACS_TTEE + w
+tee pointing left ACS_RTEE + u
+tee pointing right ACS_LTEE + t
+tee pointing up ACS_BTEE + v
+upper left corner ACS_ULCORNER + l
+upper right corner ACS_URCORNER + k
+vertical line ACS_VLINE | x
+.TE
+.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\fR/\fBrmacs\fR 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
+Most color terminals are either `Tektronix-like' or `HP-like'. Tektronix-like
+terminals have a predefined set of N colors (where N usually 8), and can set
+character-cell foreground and background characters independently, mixing them
+into N * N color-pairs. On HP-like terminals, the use must set each color
+pair up separately (foreground and background are not independently settable).
+Up to M color-pairs may be set up from 2*M different colors. ANSI-compatible
+terminals are Tektronix-like.
+.PP
+Some basic color capabilities are independent of the color method. The numeric
+capabilities \fBcolors\fR and \fBpairs\fR specify the maximum numbers of colors
+and color-pairs that can be displayed simultaneously. The \fBop\fR (original
+pair) string resets foreground and background colors to their default values
+for the terminal. The \fBoc\fR 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\fR.
+.PP
+To change the current foreground or background color on a Tektronix-type
+terminal, use \fBsetaf\fR (set ANSI foreground) and \fBsetab\fR (set ANSI
+background) or \fBsetf\fR (set foreground) and \fBsetb\fR (set background).
+These take one parameter, the color number. The SVr4 documentation describes
+only \fBsetaf\fR/\fBsetab\fR; the XPG4 draft says that "If the terminal
+supports ANSI escape sequences to set background and foreground, they should
+be coded as \fBsetaf\fR and \fBsetab\fR, respectively. If the terminal
+supports other escape sequences to set background and foreground, they should
+be coded as \fBsetf\fR and \fBsetb\fR, respectively. The \fIvidputs()\fR
+function and the refresh functions use \fBsetaf\fR and \fBsetab\fR if they are
+defined."
+.PP
+The \fBsetaf\fR/\fBsetab\fR and \fBsetf\fR/\fBsetb\fR capabilities take a
+single numeric argument each. Argument values 0-7 are portably defined as
+follows (the middle column is the symbolic #define available in the header for
+the \fBcurses\fR or \fBncurses\fR 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\fR
+black \fBCOLOR_BLACK\fR 0 0, 0, 0
+red \fBCOLOR_RED\ \fR 1 max,0,0
+green \fBCOLOR_GREEN\fR 2 0,max,0
+yellow \fBCOLOR_YELLOW\fR 3 max,max,0
+blue \fBCOLOR_BLUE\fR 4 0,0,max
+magenta \fBCOLOR_MAGENTA\fR 5 max,0,max
+cyan \fBCOLOR_CYAN\fR 6 0,max,max
+white \fBCOLOR_WHITE\fR 7 max,max,max
+.TE
+.PP
+On an HP-like terminal, use \fBscp\fR with a color-pair number parameter to set
+which color pair is current.
+.PP
+On a Tektronix-like terminal, the capability \fBccc\fR may be present to
+indicate that colors can be modified. If so, the \fBinitc\fR capability will
+take a color number (0 to \fBcolors\fR - 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\fR is present,
+they are instead as HLS (Hue, Lightness, Saturation) indices. The ranges are
+terminal-dependent.
+.PP
+On an HP-like terminal, \fBinitp\fR may give a capability for changing a
+color-pair value. It will take seven parameters; a color-pair number (0 to
+\fBmax_pairs\fR - 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\fR.
+.PP
+On some color terminals, colors collide with highlights. You can register
+these collisions with the \fBncv\fR capability. This is a bit-mask of
+attributes not to be used when colors are enabled. The correspondence with the
+attributes understood by \fBcurses\fR is as follows:
+.PP
+.TS
+center;
+l c c
+lw25 lw2 lw10.
+\fBAttribute Bit Decimal\fR
+A_STANDOUT 0 1
+A_UNDERLINE 1 2
+A_REVERSE 2 4
+A_BLINK 3 8
+A_DIM 4 16
+A_BOLD 5 32
+A_INVIS 6 64
+A_PROTECT 7 128
+A_ALTCHARSET 8 256
+.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\fR capability of 2.
+.PP
+SVr4 curses does nothing with \fBncv\fR, 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\fR variable;
+though the application may set this value to something other than
+a null, ncurses will test \fBnpc\fR 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, 'x', 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\fR.
+.PP
+Terminals which ignore a line-feed immediately after an \fBam\fR wrap,
+such as the Concept and vt100,
+should indicate \fBxenl\fR.
+.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\fR (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\fR\fIx\fR.
+.PP
+.SS Similar Terminals
+.PP
+If there are two very similar terminals,
+one can be defined as being just like the other with certain exceptions.
+The string capability \fBuse\fR can be given
+with the name of the similar terminal.
+The capabilities given before
+.B use
+override those in the terminal type invoked by
+.BR use .
+A capability can be canceled by placing \fBxx@\fR to the left of the
+capability definition, where xx is the capability.
+For example, the entry
+.PP
+ 2621-nl, smkx@, rmkx@, use=2621,
+.PP
+defines a 2621-nl that does not have the \fBsmkx\fR or \fBrmkx\fR 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
+.SS Pitfalls of Long Entries
+.PP
+Long terminfo entries are unlikely to be a problem; to date, no entry has even
+approached terminfo's 4K string-table maximum. Unfortunately, the termcap
+translations are much more strictly limited (to 1K), thus termcap translations
+of long terminfo entries can cause problems.
+.PP
+The man pages for 4.3BSD and older versions of tgetent() instruct the user to
+allocate a 1K 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 tgetent()
+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 don't; others truncate the
+entries to 1023 bytes. Some application programs allocate more than
+the recommended 1K for the termcap entry; others don't.
+.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 doesn't 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 tgetent() strips out while reading it.
+Some termcap libraries strip off the final newline, too (GNU termcap does not).
+Now suppose:
+.TP 5
+*
+a termcap entry before expansion is more than 1023 bytes long,
+.TP 5
+*
+and the application has only allocated a 1k buffer,
+.TP 5
+*
+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's the entry it wants,
+.TP 5
+*
+and tgetent() is searching for a terminal type that either is the
+long entry, appears in the termcap file after the long entry, or
+doesn't appear in the file at all (so that tgetent() has to search
+the whole termcap file).
+.PP
+Then tgetent() 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 tgetent() only does "tc" expansion once it's 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's 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\fR implementation of
+\fBtic\fR(1) 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
+The %x operator in parameterized strings is unique to the ncurses implementation
+of \fBtparm\fR (it is required in order to support an unfortunate choice of
+\fBinitc\fR format on the Linux console).
+.PP
+Some SVr4 \fBcurses\fR implementations, and all previous to SVr4, don't
+interpret the %A and %O operators in parameter strings.
+.PP
+SVr4/XPG4 do not specify whether \fBmsgr\fR licenses movement while in
+an alternate-character-set mode (such modes may, among other things, map
+CR and NL to characters that don't trigger local motions).
+The \fBncurses\fR implementation ignores \fBmsgr\fR in \fBALTCHARSET\fR
+mode. This raises the possibility that an XPG4
+implementation making the opposite interpretation may need terminfo
+entries made for \fBncurses\fR to have \fBmsgr\fR turned off.
+.PP
+The \fBncurses\fR library handles insert-character and insert-character modes
+in a slightly non-standard way in order to get better update efficiency. See
+the \fBInsert/Delete Character\fR subsection above.
+.PP
+The parameter substitutions for \fBset_clock\fR and \fBdisplay_clock\fR 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\fR capability. The \fBncurses\fR wants to
+interpret it as \fBKEY_MOUSE\fR, for use by terminals and emulators like xterm
+that can return mouse-tracking information in the keyboard-input stream.
+.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:
+.PP
+\fBSVR4, Solaris, ncurses\fR --
+These support all SVr4 capabilities.
+.PP
+\fBSGI\fR --
+Supports the SVr4 set, adds one undocumented extended string
+capability (\fBset_pglen\fR).
+.PP
+\fBSVr1, Ultrix\fR --
+These support a restricted subset of terminfo capabilities. The booleans
+end with \fBxon_xoff\fR; the numerics with \fBwidth_status_line\fR; and the
+strings with \fBprtr_non\fR.
+.PP
+\fBHP/UX\fR --
+Supports the SVr1 subset, plus the SVr[234] numerics \fBnum_labels\fR,
+\fBlabel_height\fR, \fBlabel_width\fR, plus function keys 11 through 63, plus
+\fBplab_norm\fR, \fBlabel_on\fR, and \fBlabel_off\fR, plus some incompatible
+extensions in the string table.
+.PP
+\fBAIX\fR --
+Supports the SVr1 subset, plus function keys 11 through 63, plus a number
+of incompatible string table extensions.
+.PP
+\fBOSF\fR --
+Supports both the SVr4 set and the AIX extensions.
+.SH FILES
+.TP 25
+\*d/?/*
+files containing terminal descriptions
+.SH "SEE ALSO"
+\fBtic\fR(1M), \fBcurses\fR(3X), \fBprintf\fR(3S), \fBterm\fR(\*n).
+.SH AUTHORS
+Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey.
+Based on pcurses by Pavel Curtis.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/tic.1m b/contrib/ncurses/man/tic.1m
new file mode 100644
index 000000000000..7f8fe496593f
--- /dev/null
+++ b/contrib/ncurses/man/tic.1m
@@ -0,0 +1,285 @@
+.\"***************************************************************************
+.\" Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+.\" *
+.\" Permission is hereby granted, free of charge, to any person obtaining a *
+.\" copy of this software and associated documentation files (the *
+.\" "Software"), to deal in the Software without restriction, including *
+.\" without limitation the rights to use, copy, modify, merge, publish, *
+.\" distribute, distribute with modifications, sublicense, and/or sell *
+.\" copies of the Software, and to permit persons to whom the Software is *
+.\" furnished to do so, subject to the following conditions: *
+.\" *
+.\" The above copyright notice and this permission notice shall be included *
+.\" in all copies or substantial portions of the Software. *
+.\" *
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+.\" *
+.\" Except as contained in this notice, the name(s) of the above copyright *
+.\" holders 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.25 1999/03/07 02:07:06 tom Exp $
+.TH tic 1M ""
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+\fBtic\fR - the \fIterminfo\fR entry-description compiler
+.SH SYNOPSIS
+\fBtic\fR
+[\fB\-\
+1\
+C\
+I\
+N\
+R\
+T\
+c\
+f\
+r\
+s\
+x\
+\fR]
+[\fB-e\fR \fInames\fR]
+[\fB-o\fR \fIdir\fR]
+[\fB-v\fR[\fIn\fR]]
+[\fB-w\fR[\fIn\fR]]
+\fIfile\fR
+.br
+.SH DESCRIPTION
+The command \fBtic\fR translates a \fBterminfo\fR file from source
+format into compiled format. The compiled format is necessary for use with
+the library routines in \fBncurses\fR(3X).
+.PP
+The results are normally placed in the system terminfo
+directory \fB\*d\fR. There are two ways to change this behavior.
+.PP
+First, you may override the system default by setting the variable
+\fBTERMINFO\fR in your shell environment to a valid (existing) directory name.
+.PP
+Secondly, if \fBtic\fR cannot get access to \fI\*d\fR or your TERMINFO
+directory, it looks for the directory \fI$HOME/.terminfo\fR; if that directory
+exists, the entry is placed there.
+.PP
+Libraries that read terminfo entries are expected to check for a TERMINFO
+directory first, look at \fI$HOME/.terminfo\fR if TERMINFO is not set, and
+finally look in \fI\*d\fR.
+.TP
+\fB-c\fR
+specifies to only check \fIfile\fR for errors, including syntax problems and
+bad use links. If you specify \fB-C\fR (\fB-I\fR) 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 (and a documented limit in terminfo), these entries may cause core
+dumps.
+.TP
+\fB-v\fR\fIn\fR
+specifies that (verbose) output be written to standard error trace
+information showing \fBtic\fR's progress. The optional integer
+\fIn\fR is a number from 1 to 10, inclusive, indicating the desired
+level of detail of information. If \fIn\fR is omitted, the default
+level is 1. If \fIn\fR is specified and greater than 1, the level of
+detail is increased.
+.TP
+\fB-o\fR\fIdir\fR
+Write compiled entries to given directory. Overrides the TERMINFO environment
+variable.
+.TP
+\fB-w\fR\fIn\fR
+specifies the width of the output.
+.TP
+\fB-1\fR
+restricts the output to a single column
+.TP
+\fB-C\fR
+Force source translation to termcap format. Note: this differs from the -C
+option of \fIinfocmp\fR(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.
+.TP
+\fB-G\fR
+Display constant literals in decimal form
+rather than their character equivalents.
+.TP
+\fB-I\fR
+Force source translation to terminfo format.
+.TP
+\fB-L\fR
+Force source translation to terminfo format
+using the long C variable names listed in <\fBterm.h\fR>
+.TP
+\fB-N\fR
+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\fR, \fBcarriage_return\fR, \fBcursor_left\fR,
+\fBcursor_down\fR, \fBscroll_forward\fR, \fBtab\fR, \fBnewline\fR,
+\fBkey_backspace\fR, \fBkey_left\fR, and \fBkey_down\fR, then attempts
+to use obsolete termcap capabilities to deduce correct values. It also
+normally suppresses output of obsolete termcap capabilities such as \fBbs\fR.
+This option forces a more literal translation that also preserves the
+obsolete capabilities.
+.TP
+\fB-R\fR\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 don't 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\fR(\*n) for details.
+.TP
+\fB-T\fR
+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-r\fR
+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 up
+to version 1.3 or BSD termcap up to 4.3BSD) that doesn't handle multiple
+tc capabilities per entry.
+.TP
+\fB-e\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 -I or -C.)
+.TP
+\fB-f\fR
+Display complex terminfo strings which contain if/then/else/endif expressions
+indented for readability.
+.TP
+\fB-g\fR
+Display constant character literals in quoted form
+rather than their decimal equivalents.
+.TP
+\fB-s\fR
+Summarize the compile by showing the directory into which entries
+are written, and the number of entries which are compiled.
+.TP
+\fB-x\fR
+Treat unknown capabilities as user-defined.
+.TP
+\fIfile\fR
+contains one or more \fBterminfo\fR terminal descriptions in source
+format [see \fBterminfo\fR(\*n)]. Each description in the file
+describes the capabilities of a particular terminal.
+.PP
+The debug flag levels are as follows:
+.TP
+1
+Names of files created and linked
+.TP
+2
+Information related to the ``use'' facility
+.TP
+3
+Statistics from the hashing algorithm
+.TP
+5
+String-table memory allocations
+.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
+.LP
+If n is not given, it is taken to be one.
+.PP
+All but one of the capabilities recognized by \fBtic\fR are documented
+in \fBterminfo\fR(\*n). The exception is the \fBuse\fR capability.
+
+When a \fBuse\fR=\fIentry\fR-\fIname\fR field is discovered in a
+terminal entry currently being compiled, \fBtic\fR reads in the binary
+from \fB\*d\fR to complete the entry. (Entries created from
+\fIfile\fR will be used first. If the environment variable
+\fBTERMINFO\fR is set, that directory is searched instead of
+\fB\*d\fR.) \fBtic\fR duplicates the capabilities in
+\fIentry\fR-\fIname\fR for the current entry, with the exception of
+those capabilities that explicitly are defined in the current entry.
+
+When an entry, e.g., \fBentry_name_1\fR, contains a
+\fBuse=\fR\fIentry\fR_\fIname\fR_\fI2\fR field, any canceled
+capabilities in \fIentry\fR_\fIname\fR_\fI2\fR must also appear in
+\fBentry_name_1\fR before \fBuse=\fR for these capabilities to be
+canceled in \fBentry_name_1\fR.
+
+If the environment variable \fBTERMINFO\fR is set, the compiled
+results are placed there instead of \fB\*d\fR.
+
+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 COMPATIBILITY
+There is some evidence that historic \fBtic\fR implementations treated
+description fields with no whitespace in them as additional aliases or
+short names. This \fBtic\fR does not do that, but it does warn when
+description fields may be treated that way and check them for dangerous
+characters.
+.SH EXTENSIONS
+Unlike the stock SVr4 \fBtic\fR 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\fR(\*n) 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 \fBuse\fR
+capabilities.
+This implementation of \fBtic\fR will find \fBuse\fR targets anywhere
+in the source file, or anywhere in the file tree rooted at \fBTERMINFO\fR (if
+\fBTERMINFO\fR is defined), or in the user's \fI$HOME/.terminfo\fR directory
+(if it exists), or (finally) anywhere in the system's file tree of
+compiled entries.
+
+The error messages from this \fBtic\fR have the same format as GNU C
+error messages, and can be parsed by GNU Emacs's compile facility.
+
+The
+\fB-o\fR,
+\fB-G\fR,
+\fB-I\fR,
+\fB-C\fR,
+\fB-N\fR,
+\fB-R\fR,
+\fB-e\fR,
+\fB-f\fR,
+\fB-g\fR,
+\fB-T\fR,
+\fB-r\fR,
+\fB-s\fR and
+\fB-x\fR
+options
+are not supported under SVr4.
+The SVr4 -c mode does not report bad use links.
+
+System V does not compile entries to or read entries from your
+\fI$HOME/.terminfo\fR directory unless TERMINFO is explicitly set to it.
+.SH FILES
+.TP 5
+\fB\*d/?/*\fR
+Compiled terminal description database.
+.SH SEE ALSO
+\fBinfocmp\fR(1M), \fBcaptoinfo\fR(1M), \fBinfotocap\fR(1M), \fBtoe\fR(1M),
+\fBcurses\fR(3X), \fBterminfo\fR(\*n).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/toe.1m b/contrib/ncurses/man/toe.1m
new file mode 100644
index 000000000000..ea277266db1a
--- /dev/null
+++ b/contrib/ncurses/man/toe.1m
@@ -0,0 +1,81 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: toe.1m,v 1.7 1998/03/11 21:12:53 juergen Exp $
+.TH toe 1M ""
+.ds n 5
+.ds d @DATADIR@/terminfo
+.SH NAME
+\fBtoe\fR - table of (terminfo) entries
+.SH SYNOPSIS
+\fBtoe\fR [\fB-v\fR[\fIn\fR]] [\fB-huUV\fR] \fIfile...\fR
+.br
+.SH DESCRIPTION
+.PP
+With no options, \fBtoe\fR 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 -h 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-u\fR \fIfile\fR
+says to issue a report on dependencies in the given file. This 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\fR \fIfile\fR
+says to issue a report on reverse dependencies in the given file. This 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\fR\fIn\fR
+specifies that (verbose) output be written to standard error trace
+information showing \fBtoe\fR's progress. The optional integer
+\fIn\fR is a number from 1 to 10, interpreted as for \fBtic\fR(1).
+.TP 5
+\fB-V\fR
+prints out the version of the program in use on standard error and exits.
+.SH FILES
+.TP 5
+\fB\*d/?/*\fR
+Compiled terminal description database.
+.SH SEE ALSO
+\fBtic\fR(1M), \fBinfocmp\fR(1M), \fBcaptoinfo\fR(1M), \fBinfotocap\fR(1M),
+\fBcurses\fR(3X), \fBterminfo\fR(\*n).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/tput.1 b/contrib/ncurses/man/tput.1
new file mode 100644
index 000000000000..84b64b2588a1
--- /dev/null
+++ b/contrib/ncurses/man/tput.1
@@ -0,0 +1,241 @@
+'\" t
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: tput.1,v 1.12 1999/01/24 02:44:26 Jeffrey.C.Honig Exp $
+.TH tput 1 ""
+.ds d @DATADIR@/terminfo
+.ds n 5
+.SH NAME
+\fBtput\fR - initialize a terminal or query terminfo database
+.SH SYNOPSIS
+\fBtput\fR [\fB-T\fR\fItype\fR] \fIcapname\fR [\fIparms\fR ... ]
+.br
+\fBtput\fR [\fB-T\fR\fItype\fR] \fBinit\fR
+.br
+\fBtput\fR [\fB-T\fR\fItype\fR] \fBreset\fR
+.br
+\fBtput\fR [\fB-T\fR\fItype\fR] \fBlongname\fR
+.br
+\fBtput -S\fR \fB<<\fR
+.br
+.SH DESCRIPTION
+The \fBtput\fR utility uses the \fBterminfo\fR database to make the
+values of terminal-dependent capabilities and information available to
+the shell (see \fBsh\fR(1)), to initialize or reset the terminal, or
+return the long name of the requested terminal type. \fBtput\fR
+outputs a string if the attribute (\fIcap\fRability \fIname\fR) is of
+type string, or an integer if the attribute is of type integer. If
+the attribute is of type boolean, \fBtput\fR simply sets the exit code
+(\fB0\fR for TRUE if the terminal has the capability, \fB1\fR for
+FALSE if it does not), and produces no output. Before using a value
+returned on standard output, the user should test the exit code
+[\fB$?\fR, see \fBsh\fR(1)] to be sure it is \fB0\fR.
+(See the \fBEXIT CODES\fR and \fBDIAGNOSTICS\fR sections.)
+For a complete list of capabilities
+and the \fIcapname\fR associated with each, see \fBterminfo\fR(\*n).
+.TP
+\fB-T\fR\fItype\fR
+indicates the \fItype\fR of terminal. Normally this option is
+unnecessary, because the default is taken from the environment
+variable \fBTERM\fR. If \fB-T\fR is specified, then the shell
+variables \fBLINES\fR and \fBCOLUMNS\fR will be ignored,and the
+operating system will not be queried for the actual screen size.
+.TP
+\fIcapname\fR
+indicates the attribute from the \fBterminfo\fR database. When
+\fBtermcap\fR support is compiled in, the \fBtermcap\fR name for
+the attribute is also accepted.
+.TP
+\fIparms\fR
+If the attribute is a string that takes parameters, the arguments
+\fIparms\fR will be instantiated into the string. An all numeric
+argument will be passed to the attribute as a number.
+.TP
+\fB-S\fR
+allows more than one capability per invocation of \fBtput\fR. The
+capabilities must be passed to \fBtput\fR from the standard input
+instead of from the command line (see example). Only one
+\fIcapname\fR is allowed per line. The \fB-S\fR option changes the
+meaning of the \fB0\fR and \fB1\fR boolean and string exit codes (see the
+EXIT CODES section).
+.TP
+\fBinit\fR
+If the \fBterminfo\fR database is present and an entry for the user's
+terminal exists (see \fB-T\fR\fItype\fR, above), the following will
+occur: (1) if present, the terminal's initialization strings will be
+output (\fBis1\fR, \fBis2\fR, \fBis3\fR, \fBif\fR, \fBiprog\fR), (2)
+any delays (e.g., newline) specified in the entry will be set in the
+tty driver, (3) tabs expansion will be turned on or off according to
+the specification in the entry, and (4) if tabs are not expanded,
+standard tabs will be set (every 8 spaces). If an entry does not
+contain the information needed for any of the four above activities,
+that activity will silently be skipped.
+.TP
+\fBreset\fR
+Instead of putting out initialization strings, the terminal's
+reset strings will be output if present (\fBrs1\fR, \fBrs2\fR, \fBrs3\fR, \fBrf\fR).
+If the reset strings are not present, but initialization
+strings are, the initialization strings will be output.
+Otherwise, \fBreset\fR acts identically to \fBinit\fR.
+.TP
+\fBlongname\fR
+If the \fBterminfo\fR database is present and an entry for the
+user's terminal exists (see \fB-T\fR\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\fR database [see \fBterm\fR(5)].
+.SH EXAMPLES
+.TP 5
+\fBtput init\fR
+Initialize the terminal according to the type of
+terminal in the environmental variable \fBTERM\fR. This
+command should be included in everyone's .profile after
+the environmental variable \fBTERM\fR has been exported, as
+illustrated on the \fBprofile\fR(4) manual page.
+.TP 5
+\fBtput -T5620 reset\fR
+Reset an AT&T 5620 terminal, overriding the type of
+terminal in the environmental variable \fBTERM\fR.
+.TP 5
+\fBtput cup 0 0\fR
+Send the sequence to move the cursor to row \fB0\fR, column \fB0\fR
+(the upper left corner of the screen, usually known as the "home"
+cursor position).
+.TP 5
+\fBtput clear\fR
+Echo the clear-screen sequence for the current terminal.
+.TP 5
+\fBtput cols\fR
+Print the number of columns for the current terminal.
+.TP 5
+\fBtput -T450 cols\fR
+Print the number of columns for the 450 terminal.
+.TP 5
+\fBbold=`tput smso` offbold=`tput rmso`\fR
+Set the shell variables \fBbold\fR, to begin stand-out mode
+sequence, and \fBoffbold\fR, 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"\fR
+.TP 5
+\fBtput hc\fR
+Set exit code to indicate if the current terminal is a hard copy terminal.
+.TP 5
+\fBtput cup 23 4\fR
+Send the sequence to move the cursor to row 23, column 4.
+.TP 5
+\fBtput longname\fR
+Print the long name from the \fBterminfo\fR database for the
+type of terminal specified in the environmental
+variable \fBTERM\fR.
+.TP 0
+\fBtput -S <<!\fR
+.br
+\fB> clear\fR
+.br
+\fB> cup 10 10\fR
+.br
+\fB> bold\fR
+.br
+\fB> !\fR
+.TP 5
+\&
+This example shows tput processing several capabilities in one
+invocation. This example 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!\fR) on a line by itself.
+.SH FILES
+.TP
+\fB\*d\fR
+compiled terminal description database
+.TP
+\fB/usr/include/curses.h\fR
+\fBcurses\fR(3X) header file
+.TP
+\fB/usr/include/term.h\fR
+\fBterminfo\fR header file
+.TP
+\fB@DATADIR@/tabset/*\fR
+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 "Tabs and Initialization"
+section of \fBterminfo\fR(4)
+.SH SEE ALSO
+\fBclear\fR(1), \fBstty\fR(1), \fBtabs\fR(\*n). \fBprofile\fR(\*n),
+\fBterminfo\fR(4) in the \fISystem\fR \fIAdministrator\fR'\fIs\fR
+\fIReference\fR \fIManual\fR. Chapter 10 of the
+\fIProgrammer\fR'\fIs\fR \fIGuide\fR.
+.SH EXIT CODES
+If \fIcapname\fR is of type boolean, a value of \fB0\fR is set for
+TRUE and \fB1\fR for FALSE unless the \fB-S\fR option is used.
+
+If \fIcapname\fR is of type string, a value of \fB0\fR is set if the
+\fIcapname\fR is defined for this terminal \fItype\fR (the value of
+\fIcapname\fR is returned on standard output); a value of \fB1\fR is
+set if \fIcapname\fR is not defined for this terminal \fItype\fR (a
+null value is returned on standard output).
+
+If \fIcapname\fR is of type boolean or string and the \fB-S\fR option
+is used, a value of \fB0\fR is returned to indicate that all lines
+were successful. No indication of which line failed can be given so
+exit code \fB1\fR will never appear. Exit codes \fB2\fR, \fB3\fR, and
+\fB4\fR retain their usual interpretation.
+
+If \fIcapname\fR is of type integer, a value of \fB0\fR is always set,
+whether or not \fIcapname\fR is defined for this terminal \fItype\fR.
+To determine if \fIcapname\fR is defined for this terminal \fItype\fR,
+the user must test the value of standard output. A value of \fB-1\fR
+means that \fIcapname\fR is not defined for this terminal \fItype\fR.
+
+Any other exit code indicates an error; see the DIAGNOSTICS section.
+.SH DIAGNOSTICS
+\fBtput\fR prints the following error messages and sets the corresponding exit
+codes.
+
+.TS
+l l.
+exit code error message
+\fB0\fR (\fIcapname\fR is a numeric variable that is not specified in the
+ \fBterminfo\fR(\*n) database for this terminal type, e.g.
+ \fBtput -T450 lines\fR and \fBtput -T2621 xmc\fR)
+\fB1\fR no error message is printed, see the \fBEXIT CODES\fR section.
+\fB2\fR usage error
+\fB3\fR unknown terminal \fItype\fR or no \fBterminfo\fR database
+\fB4\fR unknown \fBterminfo\fR capability \fIcapname\fR
+.TE
+.SH PORTABILITY
+The \fBlongname\fR and \fB-S\fR options, and the parameter-substitution
+features used in the \fBcup\fR example, are not supported in BSD curses or in
+AT&T/USL curses before SVr4.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/man/tset.1 b/contrib/ncurses/man/tset.1
new file mode 100644
index 000000000000..50d58e109574
--- /dev/null
+++ b/contrib/ncurses/man/tset.1
@@ -0,0 +1,247 @@
+.\"***************************************************************************
+.\" Copyright (c) 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. *
+.\"***************************************************************************
+.\"
+.\" $Id: tset.1,v 1.8 1998/12/26 01:44:41 tom Exp $
+.TH tset 1 ""
+.SH NAME
+\fBtset\fR - terminal initialization
+.SH SYNOPSIS
+tset [-IQqrs] [-] [-e \fIch\fR] [-i \fIch\fR] [-k \fIch\fR] [-m \fImapping\fR] [\fIterminal\fR]
+.br
+reset [-IQqrs] [-] [-e \fIch\fR] [-i \fIch\fR] [-k \fIch\fR] [-m \fImapping\fR] [\fIterminal\fR]
+.SH DESCRIPTION
+\&\fBTset\fR initializes terminals.
+\fBTset\fR first 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\fR argument specified on the command line.
+.PP
+2. The value of the \fBTERM\fR environmental variable.
+.PP
+3. (BSD systems only.) The terminal type associated with the standard
+error output device in the \fI/etc/ttys\fR file. (On Linux and
+System-V-like UNIXes, \fIgetty\fR does this job by setting
+\fBTERM\fR according to the type passed to it by \fI/etc/inittab\fR.)
+.PP
+4. The default terminal type, ``unknown''.
+.PP
+If the terminal type was not specified on the command-line, the -m
+option mappings are then applied (see below 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 terminfo
+entry for the terminal is retrieved. If no terminfo entry is found
+for the type, the user is prompted for another terminal type.
+.PP
+Once the terminfo entry is retrieved, the window size, backspace, interrupt
+and line kill characters (among many other things) are set and the terminal
+and tab initialization strings are sent to the standard error output.
+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.
+.PP
+When invoked as \fBreset\fR, \fBtset\fR sets cooked and echo modes,
+turns off cbreak and raw modes, turns on newline translation and
+resets any unset special characters to their default values before
+doing the terminal initialization described above. This is useful
+after a program dies leaving a terminal in an abnormal state. Note,
+you may have to type
+
+ \fB<LF>reset<LF>\fR
+
+(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.
+Also, the terminal will often not echo the command.
+.PP
+The options are as follows:
+.TP 5
+-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 5
+-e
+Set the erase character to \fIch\fR.
+.TP 5
+-I
+Do not send the terminal or tab initialization strings to the terminal.
+.TP 5
+-i
+Set the interrupt character to \fIch\fR.
+.TP 5
+-k
+Set the line kill character to \fIch\fR.
+.TP 5
+-m
+Specify a mapping from a port type to a terminal.
+See below for more information.
+.TP 5
+-Q
+Don't display any values for the erase, interrupt and line kill characters.
+.TP 5
+-r
+Print the terminal type to the standard error output.
+.TP 5
+-s
+Print the sequence of shell commands to initialize the environment variable
+\fBTERM\fR to the standard output.
+See the section below on setting the environment for details.
+.PP
+The arguments for the -e, -i, and -k
+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''.
+.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 -s option.
+.PP
+When the -s option is specified, the commands to enter the information
+into the shell's environment are written to the standard output. If
+the \fBSHELL\fR environmental variable ends in ``csh'', the commands
+are for \fBcsh\fR, otherwise, they are for \fBsh\fR.
+Note, the \fBcsh\fR commands set and unset the shell variable
+\fBnoglob\fR, leaving it unset. The following line in the \fB.login\fR
+or \fB.profile\fR files will initialize the environment correctly:
+
+ 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\fR file or the \fBTERM\fR environmental variable is often
+something generic like \fBnetwork\fR, \fBdialup\fR, or \fBunknown\fR.
+When \fBtset\fR is used in a startup script it is often desirable to
+provide information about the type of terminal used on such ports.
+.PP
+The purpose of the -m option is to map
+from some set of conditions to a terminal type, that is, to
+tell \fBtset\fR
+``If I'm on this port at a particular speed, guess that I'm on that
+kind of terminal''.
+.PP
+The argument to the -m 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 -m
+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\fR.
+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\fR,
+and the baud rate is greater than 9600 baud, a terminal type of
+\fBvt100\fR 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\fR
+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 -m option argument.
+Also, to avoid problems with meta-characters, it is suggested that the
+entire -m option argument be placed within single quote characters,
+and that \fBcsh\fR users insert a backslash character (``\e'') before
+any exclamation marks (``!'').
+.SH HISTORY
+The \fBtset\fR command appeared in BSD 3.0. The \fBncurses\fR implementation
+was lightly adapted from the 4.4BSD sources for a terminfo environment by Eric
+S. Raymond <esr@snark.thyrsus.com>.
+.SH COMPATIBILITY
+The \fBtset\fR utility has been provided for backward-compatibility with BSD
+environments (under most modern UNIXes, \fB/etc/inittab\fR and \fIgetty\fR(1)
+can set \fBTERM\fR appropriately for each dial-up line; this obviates what was
+\fBtset\fR's most important use). This implementation behaves like 4.4BSD
+tset, with a few exceptions specified here.
+.PP
+The -S option of BSD tset no longer works; it prints an error message to stderr
+and dies. The -s option only sets \fBTERM\fR, not \fBTERMCAP\fP. Both these
+changes are because the \fBTERMCAP\fR variable is no longer supported under
+terminfo-based \fBncurses\fR, which makes \fBtset -S\fR useless (we made it die
+noisily rather than silently induce lossage).
+.PP
+There was an undocumented 4.4BSD feature that invoking tset 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 -A, -E, -h, -u and -v options were deleted from the \fBtset\fR
+utility in 4.4BSD. None of them were documented in 4.3BSD and all are
+of limited utility at best. The -a, -d, and -p 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 -m option instead. The
+-n option remains, but has no effect. The -adnp options are therefore
+omitted from the usage summary above.
+.PP
+It is still permissible to specify the -e, -i, and -k options without
+arguments, although it is strongly recommended that such usage be fixed to
+explicitly specify the character.
+.PP
+As of 4.4BSD, executing \fBtset\fR as \fBreset\fR no longer implies the -Q
+option. Also, the interaction between the - option and the \fIterminal\fR
+argument in some historic implementations of \fBtset\fR has been removed.
+.SH ENVIRONMENT
+The \fBtset\fR command uses the \fBSHELL\fR and \fBTERM\fR
+environment variables.
+.SH FILES
+.TP 5
+/etc/ttys
+system port name to terminal type mapping database (BSD versions only).
+.TP 5
+@DATADIR@/terminfo
+terminal capability database
+.SH SEE ALSO
+csh(1),
+sh(1),
+stty(1),
+tty(4),
+termcap(5),
+ttys(5),
+environ(7)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
+
diff --git a/contrib/ncurses/man/wresize.3x b/contrib/ncurses/man/wresize.3x
new file mode 100644
index 000000000000..5988f1987b25
--- /dev/null
+++ b/contrib/ncurses/man/wresize.3x
@@ -0,0 +1,70 @@
+.\"***************************************************************************
+.\" Copyright (c) 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> 1996
+.\"
+.\" $Id: wresize.3x,v 1.5 1998/03/14 23:42:44 tom Exp $
+.TH wresize 3X ""
+.SH NAME
+\fBwresize\fR - resize a curses window
+..
+.SH SYNOPSIS
+\fB#include <curses.h>\fR
+
+\fBint wresize(WINDOW *win, int lines, int columns);\fR
+..
+.SH DESCRIPTION
+The \fBwresize\fR function reallocates storage for an \fBncurses\fR
+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 \fBwbkgndset\fR) merged into them.
+..
+.SH RETURN VALUE
+The function returns the integer \fBERR\fR upon failure and \fBOK\fR 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\fR screen dimensions to
+simplify the logic of \fBresizeterm\fR.
+The caller must ensure that the window's dimensions fit within the
+actual screen dimensions.
+..
+.SH SEE ALSO
+\fBresizeterm\fR(3X).
+..
+.SH AUTHOR
+Thomas Dickey (from an equivalent function written in 1988 for BSD curses).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/menu/Makefile.in b/contrib/ncurses/menu/Makefile.in
new file mode 100644
index 000000000000..d334dab02ba1
--- /dev/null
+++ b/contrib/ncurses/menu/Makefile.in
@@ -0,0 +1,151 @@
+# $Id: Makefile.in,v 1.25 1998/11/10 19:08:30 juergen Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+MODEL = @DFT_LWR_MODEL@
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@
+
+INSTALL = @INSTALL@
+INSTALL_LIB = @INSTALL@ @INSTALL_LIB@
+INSTALL_DATA = @INSTALL_DATA@
+
+AR = @AR@
+AR_OPTS = @AR_OPTS@
+AWK = @AWK@
+LD = @LD@
+LN_S = @LN_S@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+
+CPPFLAGS = @CPPFLAGS@ \
+ -DHAVE_CONFIG_H
+
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -pg
+
+CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK = $(CC)
+LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+SHLIB_DIRS = -L../lib -L$(libdir)
+SHLIB_LIST = $(SHLIB_DIRS) -lncurses @SHLIB_LIST@
+
+MK_SHARED_LIB = @MK_SHARED_LIB@
+
+REL_VERSION = @cf_cv_rel_version@
+ABI_VERSION = @cf_cv_abi_version@
+
+RANLIB = @RANLIB@
+
+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
+
+################################################################################
+all \
+install :: $(AUTO_SRC) $(LIBRARIES)
+
+sources : $(AUTO_SRC)
+
+$(INSTALL_PREFIX)$(libdir) :
+ $(srcdir)/../mkinstalldirs $@
+
+# 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 $@
+
+MENU_PRIV_H = \
+ $(srcdir)/menu.priv.h \
+ $(AUTO_SRC) \
+ ../include/curses.h
+
+tags:
+ ctags *.[ch]
+
+TAGS:
+ etags *.[ch]
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.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/contrib/ncurses/menu/READ.ME b/contrib/ncurses/menu/READ.ME
new file mode 100644
index 000000000000..3fd5627445e7
--- /dev/null
+++ b/contrib/ncurses/menu/READ.ME
@@ -0,0 +1,14 @@
+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
+
+eMail: juergen.pfeifer@gmx.net
diff --git a/contrib/ncurses/menu/eti.h b/contrib/ncurses/menu/eti.h
new file mode 100644
index 000000000000..cc1c8308a948
--- /dev/null
+++ b/contrib/ncurses/menu/eti.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#ifndef _ETI_ERRNO_H_
+#define _ETI_ERRNO_H_
+
+#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/contrib/ncurses/menu/headers b/contrib/ncurses/menu/headers
new file mode 100644
index 000000000000..3fe0be08d2dd
--- /dev/null
+++ b/contrib/ncurses/menu/headers
@@ -0,0 +1,32 @@
+##############################################################################
+# Copyright (c) 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> 1996
+#
+$(srcdir)/eti.h
+$(srcdir)/menu.h
diff --git a/contrib/ncurses/menu/llib-lmenu b/contrib/ncurses/menu/llib-lmenu
new file mode 100644
index 000000000000..3f421c1113b2
--- /dev/null
+++ b/contrib/ncurses/menu/llib-lmenu
@@ -0,0 +1,508 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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,1999 *
+ ****************************************************************************/
+/* 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
+bool _nc_Connect_Items(
+ MENU *menu,
+ ITEM **items)
+ { return(*(bool *)0); }
+
+#undef _nc_Disconnect_Items
+void _nc_Disconnect_Items(
+ MENU *menu)
+ { /* void */ }
+
+#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,
+ bool value)
+ { return(*(int *)0); }
+
+#undef item_value
+bool item_value(
+ const ITEM *item)
+ { return(*(bool *)0); }
+
+/* ./m_item_vis.c */
+
+#undef item_visible
+bool item_visible(
+ const ITEM *item)
+ { return(*(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
+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_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/contrib/ncurses/menu/m_attribs.c b/contrib/ncurses/menu/m_attribs.c
new file mode 100644
index 000000000000..3cf2a1189bf3
--- /dev/null
+++ b/contrib/ncurses/menu/m_attribs.c
@@ -0,0 +1,141 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_attribs *
+* Control menus display attributes *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_attribs.c,v 1.8 1999/05/16 17:24:24 juergen 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 ) \
+int set_menu_ ## name (MENU * menu, chtype 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 menus attribute */
+#define GEN_MENU_ATTR_GET_FCT( name ) \
+chtype menu_ ## name (const MENU * menu)\
+{\
+ return (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 thiis 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/contrib/ncurses/menu/m_cursor.c b/contrib/ncurses/menu/m_cursor.c
new file mode 100644
index 000000000000..a46308954e96
--- /dev/null
+++ b/contrib/ncurses/menu/m_cursor.c
@@ -0,0 +1,110 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_cursor *
+* Correctly position a menus cursor *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_cursor.c,v 1.13 1999/05/16 17:24:43 juergen 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
++--------------------------------------------------------------------------*/
+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
++--------------------------------------------------------------------------*/
+int pos_menu_cursor(const MENU * menu)
+{
+ WINDOW *win, *sub;
+ int x, y;
+ int err = _nc_menu_cursor_pos(menu,(ITEM*)0,&y,&x);
+
+ if (E_OK==err)
+ {
+ win = menu->userwin ? menu->userwin : stdscr;
+ 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/contrib/ncurses/menu/m_driver.c b/contrib/ncurses/menu/m_driver.c
new file mode 100644
index 000000000000..fef3e8ea7147
--- /dev/null
+++ b/contrib/ncurses/menu/m_driver.c
@@ -0,0 +1,540 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_driver *
+* Central dispatching routine *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_driver.c,v 1.17 1999/05/16 17:24:55 juergen 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)++] = (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(*string++)!=toupper(*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
++--------------------------------------------------------------------------*/
+int _nc_Match_Next_Character_In_Item_Name(MENU *menu, int ch, ITEM **item)
+{
+ bool found = FALSE, passed = FALSE;
+ int idx, last;
+
+ 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 oder 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((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
++--------------------------------------------------------------------------*/
+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, rdiff;
+
+ 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))
+ {
+ 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!=(ITEM*)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-- && item!=(ITEM*)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(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 i,x,y,err;
+ ry = event.y; rx = event.x;
+ if (wmouse_trafo(sub,&ry,&rx,FALSE))
+ {
+ for(i=0;i<menu->nitems;i++)
+ {
+ 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
+ result = E_REQUEST_DENIED;
+ }
+#endif /* NCURSES_MOUSE_VERSION */
+ else
+ result = E_UNKNOWN_COMMAND;
+ }
+
+ 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/contrib/ncurses/menu/m_format.c b/contrib/ncurses/menu/m_format.c
new file mode 100644
index 000000000000..829fbe8caf6f
--- /dev/null
+++ b/contrib/ncurses/menu/m_format.c
@@ -0,0 +1,125 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.9 1999/05/16 17:25:04 juergen 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
++--------------------------------------------------------------------------*/
+int set_menu_format(MENU *menu, int rows, int cols)
+{
+ int total_rows, total_cols;
+
+ if (rows<0 || cols<0)
+ RETURN(E_BAD_ARGUMENT);
+
+ if (menu)
+ {
+ 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 = rows;
+ menu->fcols = cols;
+
+ assert(rows>0 && cols>0);
+ total_rows = (menu->nitems - 1)/cols + 1;
+ total_cols = (menu->status & O_ROWMAJOR) ?
+ minimum(menu->nitems,cols) :
+ (menu->nitems-1)/total_rows + 1;
+
+ menu->rows = total_rows;
+ menu->cols = total_cols;
+ menu->arows = minimum(total_rows,rows);
+ menu->toprow = 0;
+ menu->curitem = *(menu->items);
+ assert(menu->curitem);
+ menu->status |= _LINK_NEEDED;
+ _nc_Calculate_Item_Length_and_Width(menu);
+ }
+ else
+ {
+ if (rows>0) _nc_Default_Menu.frows = rows;
+ if (cols>0) _nc_Default_Menu.fcols = 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 : -
++--------------------------------------------------------------------------*/
+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/contrib/ncurses/menu/m_global.c b/contrib/ncurses/menu/m_global.c
new file mode 100644
index 000000000000..3633e55b9cc2
--- /dev/null
+++ b/contrib/ncurses/menu/m_global.c
@@ -0,0 +1,483 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.11 1999/05/16 17:25:14 juergen Exp $")
+
+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 */
+ ALL_MENU_OPTS, /* options */
+ 0 /* status */
+};
+
+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 */
+ };
+
+/*---------------------------------------------------------------------------
+| 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 : -
++--------------------------------------------------------------------------*/
+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++ )
+ {
+ if (items[0]->name.length > MaximumNameLength )
+ MaximumNameLength = items[0]->name.length;
+
+ if (items[0]->description.length > MaximumDescriptionLength)
+ MaximumDescriptionLength = items[0]->description.length;
+ }
+
+ menu->namelen = MaximumNameLength;
+ menu->desclen = MaximumDescriptionLength;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnmenu
+| Function : static void ResetConnectionInfo(MENU *, ITEM **)
+|
+| Description : Reset all informations in the menu and the items in
+| the item array that indicates a connection
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+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 - successfull connection
+| FALSE - connection failed
++--------------------------------------------------------------------------*/
+bool _nc_Connect_Items(MENU *menu, ITEM **items)
+{
+ ITEM **item;
+ unsigned int ItemCount = 0;
+
+ if ( menu && items )
+ {
+ 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 = ItemCount++;
+ (*item)->imenu = menu;
+ }
+ }
+ }
+ else
+ return(FALSE);
+
+ if (ItemCount != 0)
+ {
+ menu->items = items;
+ menu->nitems = ItemCount;
+ ComputeMaximum_NameDesc_Lengths(menu);
+ if ( (menu->pattern = (char *)malloc( (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 : -
++--------------------------------------------------------------------------*/
+void _nc_Disconnect_Items(MENU * menu)
+{
+ if (menu && menu->items)
+ ResetConnectionInfo( menu, menu->items );
+}
+
+/*---------------------------------------------------------------------------
+| 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 : -
++--------------------------------------------------------------------------*/
+void _nc_Calculate_Item_Length_and_Width(MENU * menu)
+{
+ int l;
+
+ assert(menu);
+
+ menu->height = 1 + menu->spc_rows * (menu->arows - 1);
+
+ l = menu->namelen + menu->marklen;
+ if ( (menu->opt & O_SHOWDESC) && (menu->desclen > 0) )
+ l += (menu->desclen + menu->spc_desc);
+
+ menu->itemlen = l;
+ l *= menu->cols;
+ l += (menu->cols-1)*menu->spc_cols; /* for the padding between the columns */
+ menu->width = l;
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnmenu
+| Function : void _nc_Link_Item(MENU *menu)
+|
+| Description : Statically calculate for every item its four neighbours.
+| This depends on the orientation of the menu. This
+| static aproach simplifies navigation in the menu a lot.
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+void _nc_Link_Items(MENU * menu)
+{
+ if (menu && menu->items && *(menu->items))
+ {
+ int i,j;
+ 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;
+
+ menu->status &= ~_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 = col;
+ item->y = row;
+ if ( ++col == Number_Of_Columns )
+ {
+ row++;
+ col = 0;
+ }
+ }
+ }
+ else
+ {
+ int Number_Of_Rows = menu->rows;
+
+ 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 = col;
+ item->y = 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 : -
++--------------------------------------------------------------------------*/
+void _nc_Show_Menu(const MENU *menu)
+{
+ WINDOW *win;
+ int maxy, maxx;
+
+ assert(menu);
+ if ( (menu->status & _POSTED) && !(menu->status & _IN_DRIVER) )
+ {
+ /* 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 : -
++--------------------------------------------------------------------------*/
+void _nc_New_TopRow_and_CurrentItem(MENU *menu, int new_toprow,
+ ITEM *new_current_item)
+{
+ ITEM *cur_item;
+ bool mterm_called = FALSE;
+ bool iterm_called = FALSE;
+
+ assert(menu);
+ if (menu->status & _POSTED)
+ {
+ 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 = new_toprow;
+ 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 = new_toprow;
+ menu->curitem = new_current_item;
+ }
+}
+
+/* m_global.c ends here */
diff --git a/contrib/ncurses/menu/m_hook.c b/contrib/ncurses/menu/m_hook.c
new file mode 100644
index 000000000000..e031d37e4fc3
--- /dev/null
+++ b/contrib/ncurses/menu/m_hook.c
@@ -0,0 +1,149 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.8 1999/05/16 17:25:24 juergen Exp $")
+
+/* "Template" macro to generate function to set application specific hook */
+#define GEN_HOOK_SET_FUNCTION( typ, name ) \
+int set_ ## typ ## _ ## name (MENU *menu, Menu_Hook 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_Hook typ ## _ ## name ( const MENU *menu )\
+{\
+ return (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/contrib/ncurses/menu/m_item_cur.c b/contrib/ncurses/menu/m_item_cur.c
new file mode 100644
index 000000000000..7ac9f33daf10
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_cur.c
@@ -0,0 +1,106 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.11 1999/05/16 17:25:34 juergen 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
++--------------------------------------------------------------------------*/
+int set_current_item(MENU * menu, ITEM * 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
++--------------------------------------------------------------------------*/
+ITEM *current_item(const MENU * menu)
+{
+ return (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
++--------------------------------------------------------------------------*/
+int item_index(const ITEM *item)
+{
+ return (item && item->imenu) ? item->index : ERR;
+}
+
+/* m_item_cur.c ends here */
diff --git a/contrib/ncurses/menu/m_item_nam.c b/contrib/ncurses/menu/m_item_nam.c
new file mode 100644
index 000000000000..1be8a6da86fb
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_nam.c
@@ -0,0 +1,68 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.9 1999/05/16 17:25:43 juergen 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
++--------------------------------------------------------------------------*/
+const char *item_name(const ITEM * item)
+{
+ return ((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
++--------------------------------------------------------------------------*/
+const char *item_description(const ITEM * item)
+{
+ return ((item) ? item->description.str : (char *)0);
+}
+
+/* m_item_nam.c ends here */
diff --git a/contrib/ncurses/menu/m_item_new.c b/contrib/ncurses/menu/m_item_new.c
new file mode 100644
index 000000000000..a7b50adaebb0
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_new.c
@@ -0,0 +1,227 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_new *
+* Create and destroy menu items *
+* Set and get marker string for menu *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_new.c,v 1.11 1999/05/16 17:28:49 juergen 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)
+{
+ assert(s);
+ while(*s)
+ {
+ if (!isprint((unsigned char)*s))
+ return FALSE;
+ s++;
+ }
+ return TRUE;
+}
+
+/*---------------------------------------------------------------------------
+| 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.
++--------------------------------------------------------------------------*/
+ITEM *new_item(const char *name, const char *description)
+{
+ ITEM *item;
+
+ if ( !name || (*name == '\0') || !Is_Printable_String(name) )
+ {
+ item = (ITEM *)0;
+ SET_ERROR( E_BAD_ARGUMENT );
+ }
+ else
+ {
+ item = (ITEM *)calloc(1,sizeof(ITEM));
+ if (item)
+ {
+ *item = _nc_Default_Item; /* hope we have struct assignment */
+
+ item->name.length = strlen(name);
+ item->name.str = name;
+
+ if (description && (*description != '\0') &&
+ Is_Printable_String(description))
+ {
+ item->description.length = strlen(description);
+ item->description.str = description;
+ }
+ else
+ {
+ item->description.length = 0;
+ item->description.str = (char *)0;
+ }
+ }
+ else
+ SET_ERROR( E_SYSTEM_ERROR );
+ }
+ return(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
++--------------------------------------------------------------------------*/
+int free_item(ITEM * 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
++--------------------------------------------------------------------------*/
+int set_menu_mark(MENU * menu, const char * mark)
+{
+ int l;
+
+ if ( mark && (*mark != '\0') && Is_Printable_String(mark) )
+ l = 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 = (char *)malloc(l+1);
+ if (menu->mark)
+ {
+ strcpy(menu->mark, mark);
+ if (menu != &_nc_Default_Menu)
+ menu->status |= _MARK_ALLOCATED;
+ }
+ else
+ {
+ menu->mark = old_mark;
+ 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
+ {
+ return 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
++--------------------------------------------------------------------------*/
+const char *menu_mark(const MENU * menu)
+{
+ return Normalize_Menu( menu )->mark;
+}
+
+/* m_item_new.c */
diff --git a/contrib/ncurses/menu/m_item_opt.c b/contrib/ncurses/menu/m_item_opt.c
new file mode 100644
index 000000000000..a37fadcbf901
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_opt.c
@@ -0,0 +1,146 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_item_opt *
+* Menus item option routines *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_item_opt.c,v 1.10 1999/05/16 17:25:52 juergen 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
++--------------------------------------------------------------------------*/
+int set_item_opts(ITEM *item, Item_Options 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
++--------------------------------------------------------------------------*/
+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 behaviour */
+
+ if (opts & ~ALL_ITEM_OPTS)
+ RETURN(E_BAD_ARGUMENT);
+ else
+ {
+ Normalize_Item(citem);
+ opts = citem->opt & ~(opts & ALL_ITEM_OPTS);
+ return 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
++--------------------------------------------------------------------------*/
+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 behaviour */
+
+ opts &= ALL_ITEM_OPTS;
+ if (opts & ~ALL_ITEM_OPTS)
+ RETURN(E_BAD_ARGUMENT);
+ else
+ {
+ Normalize_Item(citem);
+ opts = citem->opt | opts;
+ return 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
++--------------------------------------------------------------------------*/
+Item_Options item_opts(const ITEM * item)
+{
+ return (ALL_ITEM_OPTS & Normalize_Item(item)->opt);
+}
+
+/* m_item_opt.c ends here */
diff --git a/contrib/ncurses/menu/m_item_top.c b/contrib/ncurses/menu/m_item_top.c
new file mode 100644
index 000000000000..cbe092afbbc1
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_top.c
@@ -0,0 +1,102 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.4 1999/05/16 17:26:01 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| Facility : libnmenu
+| Function : int set_top_row(MENU *menu, int row)
+|
+| Description : Makes the speified 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
++--------------------------------------------------------------------------*/
+int set_top_row(MENU * menu, int row)
+{
+ ITEM *item;
+
+ 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)
+ {
+ 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
++--------------------------------------------------------------------------*/
+int top_row(const MENU * menu)
+{
+ if (menu && menu->items && *(menu->items))
+ {
+ assert( (menu->toprow>=0) && (menu->toprow < menu->rows) );
+ return menu->toprow;
+ }
+ else
+ return(ERR);
+}
+
+/* m_item_top.c ends here */
diff --git a/contrib/ncurses/menu/m_item_use.c b/contrib/ncurses/menu/m_item_use.c
new file mode 100644
index 000000000000..2659f4b3f386
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_use.c
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.10 1999/05/16 17:26:11 juergen 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 informations.
+|
+| Return Values : E_OK - success
++--------------------------------------------------------------------------*/
+int set_item_userptr(ITEM * 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 informations.
+|
+| Return Values : Value of the pointer. If no such pointer has been set,
+| NULL is returned.
++--------------------------------------------------------------------------*/
+void *item_userptr(const ITEM * item)
+{
+ return Normalize_Item(item)->userptr;
+}
+
+/* m_item_use.c */
diff --git a/contrib/ncurses/menu/m_item_val.c b/contrib/ncurses/menu/m_item_val.c
new file mode 100644
index 000000000000..cf52d1dd668a
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_val.c
@@ -0,0 +1,100 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.8 1999/05/16 17:26:20 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| Facility : libnmenu
+| Function : int set_item_value(ITEM *item, int value)
+|
+| Description : Programmatically set the items 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
++--------------------------------------------------------------------------*/
+int set_item_value(ITEM *item, bool value)
+{
+ MENU *menu;
+
+ if (item)
+ {
+ 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
++--------------------------------------------------------------------------*/
+bool item_value(const ITEM *item)
+{
+ return ((Normalize_Item(item)->value) ? TRUE : FALSE);
+}
+
+/* m_item_val.c ends here */
diff --git a/contrib/ncurses/menu/m_item_vis.c b/contrib/ncurses/menu/m_item_vis.c
new file mode 100644
index 000000000000..dab5ecb38e38
--- /dev/null
+++ b/contrib/ncurses/menu/m_item_vis.c
@@ -0,0 +1,66 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.10 1999/05/16 17:26:34 juergen 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
++--------------------------------------------------------------------------*/
+bool item_visible(const ITEM * item)
+{
+ MENU *menu;
+
+ if ( item &&
+ (menu=item->imenu) &&
+ (menu->status & _POSTED) &&
+ ( (menu->toprow + menu->arows) > (item->y) ) &&
+ ( item->y >= menu->toprow) )
+ return TRUE;
+ else
+ return FALSE;
+}
+
+/* m_item_vis.c ends here */
diff --git a/contrib/ncurses/menu/m_items.c b/contrib/ncurses/menu/m_items.c
new file mode 100644
index 000000000000..1bda088a2f9e
--- /dev/null
+++ b/contrib/ncurses/menu/m_items.c
@@ -0,0 +1,103 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.8 1999/05/16 17:26:50 juergen 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
++--------------------------------------------------------------------------*/
+int set_menu_items(MENU * menu, ITEM ** 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 arry of the menu
+|
+| Return Values : NULL on error
++--------------------------------------------------------------------------*/
+ITEM **menu_items(const MENU *menu)
+{
+ return(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.
++--------------------------------------------------------------------------*/
+int item_count(const MENU *menu)
+{
+ return(menu ? menu->nitems : -1);
+}
+
+/* m_items.c ends here */
diff --git a/contrib/ncurses/menu/m_new.c b/contrib/ncurses/menu/m_new.c
new file mode 100644
index 000000000000..ba2b90cffe19
--- /dev/null
+++ b/contrib/ncurses/menu/m_new.c
@@ -0,0 +1,108 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_new *
+* Creation and destruction of new menus *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_new.c,v 1.10 1999/05/16 17:26:59 juergen Exp $")
+
+/*---------------------------------------------------------------------------
+| 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
++--------------------------------------------------------------------------*/
+MENU *new_menu(ITEM ** items)
+{
+ MENU *menu = (MENU *)calloc(1,sizeof(MENU));
+
+ if (menu)
+ {
+ *menu = _nc_Default_Menu;
+ menu->status = 0;
+ menu->rows = menu->frows;
+ menu->cols = menu->fcols;
+ if (items && *items)
+ {
+ if (!_nc_Connect_Items(menu,items))
+ {
+ free(menu);
+ menu = (MENU *)0;
+ }
+ }
+ }
+
+ if (!menu)
+ SET_ERROR(E_SYSTEM_ERROR);
+
+ return(menu);
+}
+
+/*---------------------------------------------------------------------------
+| 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
++--------------------------------------------------------------------------*/
+int free_menu(MENU * 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/contrib/ncurses/menu/m_opts.c b/contrib/ncurses/menu/m_opts.c
new file mode 100644
index 000000000000..1875f418755b
--- /dev/null
+++ b/contrib/ncurses/menu/m_opts.c
@@ -0,0 +1,170 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_opts *
+* Menus option routines *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_opts.c,v 1.12 1999/05/16 17:27:08 juergen 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
++--------------------------------------------------------------------------*/
+int set_menu_opts(MENU * menu, Menu_Options 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
++--------------------------------------------------------------------------*/
+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 behaviour */
+
+ opts &= ALL_MENU_OPTS;
+ if (opts & ~ALL_MENU_OPTS)
+ RETURN(E_BAD_ARGUMENT);
+ else
+ {
+ Normalize_Menu(cmenu);
+ opts = cmenu->opt & ~opts;
+ return 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
++--------------------------------------------------------------------------*/
+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 behaviour */
+
+ opts &= ALL_MENU_OPTS;
+ if (opts & ~ALL_MENU_OPTS)
+ RETURN(E_BAD_ARGUMENT);
+ else
+ {
+ Normalize_Menu(cmenu);
+ opts = cmenu->opt | opts;
+ return 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_Options menu_opts(const MENU *menu)
+{
+ return (ALL_MENU_OPTS & Normalize_Menu( menu )->opt);
+}
+
+/* m_opts.c ends here */
diff --git a/contrib/ncurses/menu/m_pad.c b/contrib/ncurses/menu/m_pad.c
new file mode 100644
index 000000000000..180228329dd2
--- /dev/null
+++ b/contrib/ncurses/menu/m_pad.c
@@ -0,0 +1,90 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_pad *
+* Control menus padding character *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_pad.c,v 1.4 1999/05/16 17:27:17 juergen 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
++--------------------------------------------------------------------------*/
+int set_menu_pad(MENU *menu, int pad)
+{
+ bool do_refresh = (menu != (MENU*)0);
+
+ if (!isprint((unsigned char)pad))
+ RETURN(E_BAD_ARGUMENT);
+
+ Normalize_Menu( menu );
+ menu->pad = 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
++--------------------------------------------------------------------------*/
+int menu_pad(const MENU * menu)
+{
+ return (Normalize_Menu( menu ) -> pad);
+}
+
+/* m_pad.c ends here */
diff --git a/contrib/ncurses/menu/m_pattern.c b/contrib/ncurses/menu/m_pattern.c
new file mode 100644
index 000000000000..7187c2245880
--- /dev/null
+++ b/contrib/ncurses/menu/m_pattern.c
@@ -0,0 +1,117 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_pattern *
+* Pattern matching handling *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_pattern.c,v 1.4 1999/05/16 17:27:28 juergen 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
++--------------------------------------------------------------------------*/
+char *menu_pattern(const MENU * menu)
+{
+ return (menu ? (menu->pattern ? menu->pattern : "") : (char *)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_NOT_CONNECTED - no items connected to menu
+| E_BAD_STATE - menu in user hook routine
+| E_NO_MATCH - no item matches pattern
++--------------------------------------------------------------------------*/
+int set_menu_pattern(MENU *menu, const char *p)
+{
+ ITEM *matchitem;
+ int matchpos;
+
+ 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(*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/contrib/ncurses/menu/m_post.c b/contrib/ncurses/menu/m_post.c
new file mode 100644
index 000000000000..8825f3e57918
--- /dev/null
+++ b/contrib/ncurses/menu/m_post.c
@@ -0,0 +1,366 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_post *
+* Write or erase menus from associated subwindows *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_post.c,v 1.16 1999/05/16 17:27:38 juergen 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 : -
++--------------------------------------------------------------------------*/
+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;
+
+ 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,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,menu->fore);
+ isfore = TRUE;
+ }
+ waddstr(menu->win,menu->mark);
+ if (isfore)
+ {
+ wattron(menu->win,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,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,menu->grey);
+ isgrey = TRUE;
+ }
+ else
+ {
+ if (item->value || item==menu->curitem)
+ {
+ wattron(menu->win,menu->fore);
+ isfore = TRUE;
+ }
+ else
+ {
+ wattron(menu->win,menu->back);
+ isback = TRUE;
+ }
+ }
+
+ waddnstr(menu->win,item->name.str,item->name.length);
+ for(ch=' ',i=menu->namelen-item->name.length;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;
+
+ 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);
+ for(ch=' ',i=menu->desclen-item->description.length; 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,menu->grey);
+ else if (isfore) wattroff(menu->win,menu->fore);
+ wattron(menu->win,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))
+ mvwaddch(menu->win,cy+j,cx-1,menu->pad);
+ }
+ wmove(menu->win,ncy,ncx);
+ if (!isback)
+ wattroff(menu->win,menu->back);
+ }
+ }
+
+ /* Remove attributes */
+ if (isfore)
+ wattroff(menu->win,menu->fore);
+ if (isback)
+ wattroff(menu->win,menu->back);
+ if (isgrey)
+ wattroff(menu->win,menu->grey);
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnmenu
+| Function : void _nc_Draw_Menu(const MENU *)
+|
+| Description : Display the menu in its windows
+|
+| Return Values : -
++--------------------------------------------------------------------------*/
+void _nc_Draw_Menu(const MENU * menu)
+{
+ ITEM *item = menu->items[0];
+ ITEM *lasthor, *lastvert;
+ ITEM *hitem;
+ int y = 0;
+ 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;
+
+ do
+ {
+ wmove(menu->win,y,0);
+
+ hitem = item;
+ lasthor = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : hitem;
+
+ do
+ {
+ _nc_Post_Item( menu, hitem);
+
+ wattron(menu->win,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,menu->back);
+
+ item = item->down;
+ y += menu->spc_rows;
+
+ } while( item && (item != lastvert) );
+}
+
+/*---------------------------------------------------------------------------
+| Facility : libnmenu
+| Function : int post_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_NO_ROOM - Menu to large for screen
+| E_NOT_CONNECTED - No items connected to menu
+| E_BAD_STATE - Menu in userexit routine
+| E_POSTED - Menu already posted
++--------------------------------------------------------------------------*/
+int post_menu(MENU * 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 y;
+ int h = 1 + menu->spc_rows * (menu->rows - 1);
+
+ WINDOW *win = Get_Menu_Window(menu);
+ int maxy = getmaxy(win);
+ int maxx = getmaxx(win);
+
+ if (maxx < menu->width || maxy < menu->height)
+ RETURN(E_NO_ROOM);
+
+ if ( (menu->win = newpad(h,menu->width)) )
+ {
+ 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);
+
+ menu->status |= _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
++--------------------------------------------------------------------------*/
+int unpost_menu(MENU * menu)
+{
+ WINDOW *win;
+
+ 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;
+
+ menu->status &= ~_POSTED;
+
+ RETURN(E_OK);
+}
+
+/* m_post.c ends here */
diff --git a/contrib/ncurses/menu/m_req_name.c b/contrib/ncurses/menu/m_req_name.c
new file mode 100644
index 000000000000..d90d0afc4750
--- /dev/null
+++ b/contrib/ncurses/menu/m_req_name.c
@@ -0,0 +1,119 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 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.12 1999/05/16 17:27:47 juergen Exp $")
+
+static const char *request_names[ MAX_MENU_COMMAND - MIN_MENU_COMMAND + 1 ] = {
+ "LEFT_ITEM" ,
+ "RIGHT_ITEM" ,
+ "UP_ITEM" ,
+ "DOWN_ITEM" ,
+ "SCR_ULINE" ,
+ "SCR_DLINE" ,
+ "SCR_DPAGE" ,
+ "SCR_UPAGE" ,
+ "FIRST_ITEM" ,
+ "LAST_ITEM" ,
+ "NEXT_ITEM" ,
+ "PREV_ITEM" ,
+ "TOGGLE_ITEM" ,
+ "CLEAR_PATTERN",
+ "BACK_PATTERN" ,
+ "NEXT_MATCH" ,
+ "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
++--------------------------------------------------------------------------*/
+const char *menu_request_name( int request )
+{
+ if ( (request < MIN_MENU_COMMAND) || (request > MAX_MENU_COMMAND) )
+ {
+ SET_ERROR(E_BAD_ARGUMENT);
+ return (const char *)0;
+ }
+ else
+ return 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
++--------------------------------------------------------------------------*/
+int menu_request_by_name( const char *str )
+{
+ /* because the table is so small, it doesn't really hurt
+ to run sequentially through it.
+ */
+ unsigned int i = 0;
+ char buf[16];
+
+ if (str)
+ {
+ strncpy(buf,str,sizeof(buf));
+ while( (i<sizeof(buf)) && (buf[i] != '\0') )
+ {
+ buf[i] = toupper(buf[i]);
+ i++;
+ }
+
+ for (i=0; i < A_SIZE; i++)
+ {
+ if (strncmp(request_names[i],buf,sizeof(buf))==0)
+ return MIN_MENU_COMMAND + i;
+ }
+ }
+ RETURN(E_NO_MATCH);
+}
+
+/* m_req_name.c ends here */
diff --git a/contrib/ncurses/menu/m_scale.c b/contrib/ncurses/menu/m_scale.c
new file mode 100644
index 000000000000..d6f964bff662
--- /dev/null
+++ b/contrib/ncurses/menu/m_scale.c
@@ -0,0 +1,71 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_scale *
+* Menu scaling routine *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_scale.c,v 1.4 1999/05/16 17:28:00 juergen 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
++--------------------------------------------------------------------------*/
+int scale_menu(const MENU *menu, int *rows, int *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/contrib/ncurses/menu/m_spacing.c b/contrib/ncurses/menu/m_spacing.c
new file mode 100644
index 000000000000..1d035ab052d9
--- /dev/null
+++ b/contrib/ncurses/menu/m_spacing.c
@@ -0,0 +1,98 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_spacing *
+* Routines to handle spacing between entries *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_spacing.c,v 1.11 1999/05/16 17:28:09 juergen 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 entried
+|
+| Return Values : E_OK - on success
++--------------------------------------------------------------------------*/
+int set_menu_spacing(MENU *menu, int s_desc, int s_row, int s_col )
+{
+ MENU *m; /* split for ATAC workaround */
+ 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 = s_desc ? s_desc : 1;
+ m->spc_rows = s_row ? s_row : 1;
+ m->spc_cols = 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
++--------------------------------------------------------------------------*/
+int menu_spacing( const MENU *menu, int* s_desc, int* s_row, int* s_col)
+{
+ const MENU *m; /* split for ATAC workaround */
+ 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/contrib/ncurses/menu/m_sub.c b/contrib/ncurses/menu/m_sub.c
new file mode 100644
index 000000000000..35a361e687e2
--- /dev/null
+++ b/contrib/ncurses/menu/m_sub.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_sub *
+* Menus subwindow association routines *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_sub.c,v 1.4 1999/05/16 17:28:20 juergen 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
++--------------------------------------------------------------------------*/
+int set_menu_sub(MENU *menu, WINDOW *win)
+{
+ if (menu)
+ {
+ if ( menu->status & _POSTED )
+ RETURN(E_POSTED);
+ menu->usersub = win;
+ _nc_Calculate_Item_Length_and_Width(menu);
+ }
+ 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
++--------------------------------------------------------------------------*/
+WINDOW *menu_sub(const MENU * menu)
+{
+ const MENU* m = Normalize_Menu(menu);
+ return Get_Menu_Window(m);
+}
+
+/* m_sub.c ends here */
diff --git a/contrib/ncurses/menu/m_userptr.c b/contrib/ncurses/menu/m_userptr.c
new file mode 100644
index 000000000000..45818a3e78fb
--- /dev/null
+++ b/contrib/ncurses/menu/m_userptr.c
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_userptr *
+* Associate application data with menus *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_userptr.c,v 1.10 1999/05/16 17:28:29 juergen 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 informations.
+|
+| Return Values : E_OK - success
++--------------------------------------------------------------------------*/
+int set_menu_userptr(MENU * 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 informations.
+|
+| Return Values : Value of the pointer. If no such pointer has been set,
+| NULL is returned
++--------------------------------------------------------------------------*/
+void *menu_userptr(const MENU * menu)
+{
+ return( Normalize_Menu(menu)->userptr);
+}
+
+/* m_userptr.c ends here */
diff --git a/contrib/ncurses/menu/m_win.c b/contrib/ncurses/menu/m_win.c
new file mode 100644
index 000000000000..73f34b5cc629
--- /dev/null
+++ b/contrib/ncurses/menu/m_win.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module m_win *
+* Menus window association routines *
+***************************************************************************/
+
+#include "menu.priv.h"
+
+MODULE_ID("$Id: m_win.c,v 1.9 1999/05/16 17:28:37 juergen 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
++--------------------------------------------------------------------------*/
+int set_menu_win(MENU *menu, WINDOW *win)
+{
+ if (menu)
+ {
+ if ( menu->status & _POSTED )
+ RETURN(E_POSTED);
+ menu->userwin = win;
+ _nc_Calculate_Item_Length_and_Width(menu);
+ }
+ 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
++--------------------------------------------------------------------------*/
+WINDOW *menu_win(const MENU *menu)
+{
+ const MENU* m = Normalize_Menu(menu);
+ return (m->userwin ? m->userwin : stdscr);
+}
+
+/* m_win.c ends here */
diff --git a/contrib/ncurses/menu/menu.h b/contrib/ncurses/menu/menu.h
new file mode 100644
index 000000000000..4b4a286a63a2
--- /dev/null
+++ b/contrib/ncurses/menu/menu.h
@@ -0,0 +1,250 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+#ifndef ETI_MENU
+#define ETI_MENU
+
+#include <curses.h>
+#include <eti.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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)
+
+/* Item options: */
+#define O_SELECTABLE (0x01)
+
+typedef struct
+{
+ const char* str;
+ unsigned short length;
+} TEXT;
+
+typedef struct tagITEM
+{
+ 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; /* neighbour items */
+ struct tagITEM *right;
+ struct tagITEM *up;
+ struct tagITEM *down;
+
+} ITEM;
+
+typedef void (*Menu_Hook)(struct tagMENU *);
+
+typedef struct tagMENU
+{
+ 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 */
+
+} 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 ITEM **menu_items(const MENU *),
+ *current_item(const MENU *),
+ *new_item(const char *,const char *);
+
+extern MENU *new_menu(ITEM **);
+
+extern Item_Options item_opts(const ITEM *);
+extern Menu_Options menu_opts(const MENU *);
+
+Menu_Hook item_init(const MENU *),
+ item_term(const MENU *),
+ menu_init(const MENU *),
+ menu_term(const MENU *);
+
+extern WINDOW *menu_sub(const MENU *),
+ *menu_win(const MENU *);
+
+extern const char *item_description(const ITEM *),
+ *item_name(const ITEM *),
+ *menu_mark(const MENU *),
+ *menu_request_name(int);
+
+extern char *menu_pattern(const MENU *);
+
+extern void *menu_userptr(const MENU *),
+ *item_userptr(const ITEM *);
+
+extern chtype menu_back(const MENU *),
+ menu_fore(const MENU *),
+ menu_grey(const MENU *);
+
+extern int free_item(ITEM *),
+ free_menu(MENU *),
+ item_count(const MENU *),
+ item_index(const ITEM *),
+ item_opts_off(ITEM *,Item_Options),
+ item_opts_on(ITEM *,Item_Options),
+ menu_driver(MENU *,int),
+ menu_opts_off(MENU *,Menu_Options),
+ menu_opts_on(MENU *,Menu_Options),
+ menu_pad(const MENU *),
+ pos_menu_cursor(const MENU *),
+ post_menu(MENU *),
+ scale_menu(const MENU *,int *,int *),
+ set_current_item(MENU *menu,ITEM *item),
+ set_item_init(MENU *,void(*)(MENU *)),
+ set_item_opts(ITEM *,Item_Options),
+ set_item_term(MENU *,void(*)(MENU *)),
+ set_item_userptr(ITEM *, void *),
+ set_item_value(ITEM *,bool),
+ set_menu_back(MENU *,chtype),
+ set_menu_fore(MENU *,chtype),
+ set_menu_format(MENU *,int,int),
+ set_menu_grey(MENU *,chtype),
+ set_menu_init(MENU *,void(*)(MENU *)),
+ set_menu_items(MENU *,ITEM **),
+ set_menu_mark(MENU *, const char *),
+ set_menu_opts(MENU *,Menu_Options),
+ set_menu_pad(MENU *,int),
+ set_menu_pattern(MENU *,const char *),
+ set_menu_sub(MENU *,WINDOW *),
+ set_menu_term(MENU *,void(*)(MENU *)),
+ set_menu_userptr(MENU *,void *),
+ set_menu_win(MENU *,WINDOW *),
+ set_top_row(MENU *,int),
+ top_row(const MENU *),
+ unpost_menu(MENU *),
+ menu_request_by_name(const char *),
+ set_menu_spacing(MENU *,int,int,int),
+ menu_spacing(const MENU *,int *,int *,int *);
+
+
+extern bool item_value(const ITEM *),
+ item_visible(const ITEM *);
+
+void menu_format(const MENU *,int *,int *);
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* ETI_MENU */
diff --git a/contrib/ncurses/menu/menu.priv.h b/contrib/ncurses/menu/menu.priv.h
new file mode 100644
index 000000000000..4c2a22d1ff8e
--- /dev/null
+++ b/contrib/ncurses/menu/menu.priv.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/***************************************************************************
+* Module menu.priv.h *
+* Top level private header file for all libnmenu modules *
+***************************************************************************/
+
+#include "mf_common.h"
+#include "menu.h"
+
+/* Backspace code */
+#define BS (8)
+
+extern ITEM _nc_Default_Item;
+extern 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)
+
+/* Get the user defined (framing) window of the menu */
+#define Get_Menu_UserWin(menu) ((menu)->userwin ? (menu)->userwin : 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 )
+
+#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 = (item)->y;\
+ if ( (item)->y >= (row + (menu)->arows) )\
+ row = ( (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'; }
+
+/* Internal functions. */
+extern void _nc_Draw_Menu(const MENU *);
+extern void _nc_Show_Menu(const MENU *);
+extern void _nc_Calculate_Item_Length_and_Width(MENU *);
+extern void _nc_Post_Item(const MENU *, const ITEM *);
+extern bool _nc_Connect_Items(MENU *, ITEM **);
+extern void _nc_Disconnect_Items(MENU *);
+extern void _nc_New_TopRow_and_CurrentItem(MENU *,int, ITEM *);
+extern void _nc_Link_Items(MENU *);
+extern int _nc_Match_Next_Character_In_Item_Name(MENU*,int,ITEM**);
+extern int _nc_menu_cursor_pos(const MENU* menu, const ITEM* item,
+ int* pY, int* pX);
diff --git a/contrib/ncurses/menu/mf_common.h b/contrib/ncurses/menu/mf_common.h
new file mode 100644
index 000000000000..c13f6c893a04
--- /dev/null
+++ b/contrib/ncurses/menu/mf_common.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1995,1997 *
+ ****************************************************************************/
+
+/* Common internal header for menu and form library */
+
+#if HAVE_CONFIG_H
+# include <ncurses_cfg.h>
+#endif
+
+#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>
+
+#ifdef 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)
+#define RETURN(code) return( SET_ERROR(code) )
+
+/* The few common values in the status fields for menus and forms */
+#define _POSTED (0x01) /* menu or form is posted */
+#define _IN_DRIVER (0x02) /* menu or form is processing hook routine */
+
+/* Call object hook */
+#define Call_Hook( object, handler ) \
+ if ( (object) && ((object)->handler) )\
+ {\
+ (object)->status |= _IN_DRIVER;\
+ (object)->handler(object);\
+ (object)->status &= ~_IN_DRIVER;\
+ }
+
+#define INLINE
+
+#ifndef TRACE
+# if CC_HAS_INLINE_FUNCS
+# undef INLINE
+# define INLINE inline
+# endif
+#endif
diff --git a/contrib/ncurses/menu/modules b/contrib/ncurses/menu/modules
new file mode 100644
index 000000000000..5d6cc823abc1
--- /dev/null
+++ b/contrib/ncurses/menu/modules
@@ -0,0 +1,60 @@
+# $Id: modules,v 1.14 1999/02/18 22:39:04 juergen Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+
+@ base
+# Library objects
+m_attribs lib $(srcdir) $(MENU_PRIV_H)
+m_cursor lib $(srcdir) $(MENU_PRIV_H)
+m_driver lib $(srcdir) $(MENU_PRIV_H)
+m_format lib $(srcdir) $(MENU_PRIV_H)
+m_global lib $(srcdir) $(MENU_PRIV_H)
+m_hook lib $(srcdir) $(MENU_PRIV_H)
+m_item_cur lib $(srcdir) $(MENU_PRIV_H)
+m_item_nam lib $(srcdir) $(MENU_PRIV_H)
+m_item_new lib $(srcdir) $(MENU_PRIV_H)
+m_item_opt lib $(srcdir) $(MENU_PRIV_H)
+m_item_top lib $(srcdir) $(MENU_PRIV_H)
+m_item_use lib $(srcdir) $(MENU_PRIV_H)
+m_item_val lib $(srcdir) $(MENU_PRIV_H)
+m_item_vis lib $(srcdir) $(MENU_PRIV_H)
+m_items lib $(srcdir) $(MENU_PRIV_H)
+m_new lib $(srcdir) $(MENU_PRIV_H)
+m_opts lib $(srcdir) $(MENU_PRIV_H)
+m_pad lib $(srcdir) $(MENU_PRIV_H)
+m_pattern lib $(srcdir) $(MENU_PRIV_H)
+m_post lib $(srcdir) $(MENU_PRIV_H)
+m_req_name lib $(srcdir) $(MENU_PRIV_H)
+m_scale lib $(srcdir) $(MENU_PRIV_H)
+m_spacing lib $(srcdir) $(MENU_PRIV_H)
+m_sub lib $(srcdir) $(MENU_PRIV_H)
+m_userptr lib $(srcdir) $(MENU_PRIV_H)
+m_win lib $(srcdir) $(MENU_PRIV_H)
diff --git a/contrib/ncurses/misc/Makefile.in b/contrib/ncurses/misc/Makefile.in
new file mode 100644
index 000000000000..2b6d2e62ea25
--- /dev/null
+++ b/contrib/ncurses/misc/Makefile.in
@@ -0,0 +1,108 @@
+# $Id: Makefile.in,v 1.20 1998/02/11 12:13:52 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+CF_MFLAGS = @cf_cv_makeflags@
+@SET_MAKE@
+
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+datadir = @datadir@
+
+tabsetdir = $(datadir)/tabset
+ticdir = $(datadir)/terminfo
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+################################################################################
+all:
+
+sources:
+
+install: install.data
+
+install.data: $(INSTALL_PREFIX)$(libdir) \
+ $(INSTALL_PREFIX)$(ticdir) \
+ $(INSTALL_PREFIX)$(tabsetdir)
+ sh $(srcdir)/run_tic.sh $(bindir) $(srcdir) $(ticdir) $(INSTALL_PREFIX)
+ @cd $(srcdir)/tabset && \
+ sh -c 'for i in `echo * | fgrep -v CVS | fgrep -v RCS`; do \
+ echo installing $$i; \
+ $(INSTALL_DATA) $$i $(INSTALL_PREFIX)$(tabsetdir); done'
+
+$(INSTALL_PREFIX)$(libdir) \
+$(INSTALL_PREFIX)$(tabsetdir) \
+$(INSTALL_PREFIX)$(ticdir) :
+ $(srcdir)/../mkinstalldirs $@
+
+uninstall: uninstall.data
+
+uninstall.data:
+ -cd $(INSTALL_PREFIX)$(ticdir) && rm -rf *
+ -cd $(INSTALL_PREFIX)$(tabsetdir) && rm -rf *
+
+tags:
+
+TAGS:
+
+mostlyclean:
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+
+clean :: mostlyclean
+
+distclean: clean
+ -rm -f Makefile
+
+realclean: distclean
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/contrib/ncurses/misc/chkdef.cmd b/contrib/ncurses/misc/chkdef.cmd
new file mode 100644
index 000000000000..c8d743356d6c
--- /dev/null
+++ b/contrib/ncurses/misc/chkdef.cmd
@@ -0,0 +1,86 @@
+/*
+ * $Id: chkdef.cmd,v 1.2 1998/08/29 21:45:58 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/contrib/ncurses/misc/cleantic.cmd b/contrib/ncurses/misc/cleantic.cmd
new file mode 100644
index 000000000000..ab6a40a4fc88
--- /dev/null
+++ b/contrib/ncurses/misc/cleantic.cmd
@@ -0,0 +1,16 @@
+/*
+ * $Id: cleantic.cmd,v 1.3 1998/08/29 21:43:19 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/contrib/ncurses/misc/cmpdef.cmd b/contrib/ncurses/misc/cmpdef.cmd
new file mode 100644
index 000000000000..7cc9c95cc475
--- /dev/null
+++ b/contrib/ncurses/misc/cmpdef.cmd
@@ -0,0 +1,106 @@
+/*
+ * $Id: cmpdef.cmd,v 1.2 1998/08/29 21:44:47 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/contrib/ncurses/misc/emx.src b/contrib/ncurses/misc/emx.src
new file mode 100644
index 000000000000..7319f5d83cf8
--- /dev/null
+++ b/contrib/ncurses/misc/emx.src
@@ -0,0 +1,812 @@
+# $Id: emx.src,v 1.6 1999/08/15 01:56:54 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,
+
+# 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,
+
+# 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,
+ 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,
+
+#### 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
+# doen'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,
+ bw,
+ 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 atributes
+#
+# On my terminal, \E[4m looks dim.
+ansi|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,
+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|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,
+# nice colors for Emacs (white on black, mode line black on cyan)
+ansi-color-3|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,
+
+#### 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|vs100|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~,
+ 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=\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,
+
+# 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,
+ cvvis=\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,
diff --git a/contrib/ncurses/misc/form.def b/contrib/ncurses/misc/form.def
new file mode 100644
index 000000000000..9014cf6b0441
--- /dev/null
+++ b/contrib/ncurses/misc/form.def
@@ -0,0 +1,105 @@
+LIBRARY form4 INITINSTANCE TERMINSTANCE
+DESCRIPTION "NCurses-4-2-981212, 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
+ "_nc_ada_getvarg" @29 NONAME
+ "_nc_ada_normalize_field_opts" @61 NONAME
+ "_nc_ada_normalize_form_opts" @62 NONAME
+ "_nc_get_field" @63 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" @64 NONAME
+ "form_request_name" @65 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/contrib/ncurses/misc/form.ref b/contrib/ncurses/misc/form.ref
new file mode 100644
index 000000000000..18e65a680192
--- /dev/null
+++ b/contrib/ncurses/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/contrib/ncurses/misc/hackguide.doc b/contrib/ncurses/misc/hackguide.doc
new file mode 100644
index 000000000000..ea7a70c6f2fa
--- /dev/null
+++ b/contrib/ncurses/misc/hackguide.doc
@@ -0,0 +1,694 @@
+
+ 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's 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's (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 don't 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 don't 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've taken these steps at the head of our queue. This means
+ that if you don't, you'll 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're using a traditional
+ asynchronous terminal or PC-based terminal emulator, rather than
+ xterm or a UNIX console entry.
+ It's therefore extremely helpful if you can tell us whether or not
+ your problem reproduces on other terminal types. Usually you'll
+ 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've 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's 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'll find terminfo problems at this stage by noticing that
+ the escape sequences put out for various capabilities are wrong.
+ If not, you're 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'll
+ 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 can't
+ characterize and fix yourself.
+ If you're still stuck, at least you'll 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 doesn't
+ throw away any information (actually they're better than
+ un-munched ones because they're 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've reproduced the bug --
+ and every terminal on which you can't. Ideally, sent 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've 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.
+
+ There's one other interactive tester, tctest, that exercises
+ translation between termcap and terminfo formats. If you have a
+ serious need to run this, you probably belong on our development team!
+
+ 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 reasoon.
+
+ 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's probably here.
+ We'll 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'll 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 don't 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 isn't actually used by any
+ historic terminal type or curses implementation we know of. Best guess
+ is it's a relic of some forgotten experiment in-house at Bell Labs
+ that didn't 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 posible.
+
+ 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 isn't
+ 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'll have more to say
+ about this in the section on Source-Form Translation.
+
+Use Capability Resolution
+
+ The background problem that makes tic tricky isn't the capability
+ translation itself, it's 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 won't 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 can't 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're 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'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.
+
+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's 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.
+
+ Don't try to auto-detect OS features in the main body of the C code.
+ That's 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's still preferable to ad-hoc code --
+ that's 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/contrib/ncurses/misc/hackguide.html b/contrib/ncurses/misc/hackguide.html
new file mode 100644
index 000000000000..417399a68365
--- /dev/null
+++ b/contrib/ncurses/misc/hackguide.html
@@ -0,0 +1,883 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<!--
+ $Id: hackguide.html,v 1.23 1999/01/17 00:15:48 tom Exp $
+-->
+<HTML>
+<HEAD>
+<TITLE>A Hacker's Guide to Ncurses Internals</TITLE>
+<link rev="made" href="mailto:bugs-ncurses@gnu.org">
+<!--
+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>A Hacker's Guide to NCURSES</H1>
+
+<H1>Contents</H1>
+<UL>
+<LI><A HREF="#abstract">Abstract</A>
+<P>
+<LI><A HREF="#objective">Objective of the Package</A>
+<UL>
+<LI><A HREF="#whysvr4">Why System V Curses?</A>
+<LI><A HREF="#extensions">How to Design Extensions</A>
+</UL>
+<LI><A HREF="#portability">Portability and Configuration</A><UL>
+</UL>
+<LI><A HREF="#documentation">Documentation Conventions</A>
+<P>
+<LI><A HREF="#bugtrack">How to Report Bugs</A>
+<P>
+<LI><A HREF="#ncurslib">A Tour of the Ncurses Library</A>
+<UL>
+<LI><A HREF="#loverview">Library Overview</A>
+<LI><A HREF="#engine">The Engine Room</A>
+<LI><A HREF="#input">Keyboard Input</A>
+<LI><A HREF="#mouse">Mouse Events</A>
+<LI><A HREF="#output">Output and Screen Updating</A>
+</UL>
+<LI><A HREF="#fmnote">The Forms and Menu Libraries</A>
+<P>
+<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><A HREF="#uses">Use Capability Resolution</A>
+<LI><A HREF="#translation">Source-Form Translation</A>
+</UL>
+<LI><A HREF="#utils">Other Utilities</A>
+<P>
+<LI><A HREF="#style">Style Tips for Developers</A>
+<P>
+<LI><A HREF="#port">Porting Hints</A>
+</UL>
+
+<H1><A NAME="abstract">Abstract</A></H1>
+
+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>
+
+<H1><A NAME="objective">Objective of the Package</A></H1>
+
+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.
+<P>
+<LI>Conformant with the XSI Curses standard issued as part of XPG4 by
+ X/Open.
+<P>
+<LI>High-quality -- stable and reliable code, wide portability, good
+ packaging, superior documentation.
+<P>
+<LI>Featureful -- should eliminate as much of the drudgery of C interface
+ programming as possible, freeing programmers to think at a higher
+ level of design.
+</UL>
+
+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. <P>
+
+<H2><A NAME="whysvr4">Why System V Curses?</A></H2>
+
+We used System V curses as a model, reverse-engineering their API, in
+order to fulfill the first two objectives. <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>
+
+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>
+
+<H2><A NAME="extensions">How to Design Extensions</A></H2>
+
+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>
+
+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>
+
+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>
+
+<H1><A NAME="portability">Portability and Configuration</A></H1>
+
+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>
+
+We encourage (but do not require) developers to make the code friendly
+to less-capable UNIX environments wherever possible. <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.
+<P>
+<LI>Adding such implementation methods does not introduce incompatibilities
+ in the <STRONG>ncurses</STRONG> API between platforms.
+</UL>
+
+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>
+
+<H1><A NAME="documentation">Documentation Conventions</A></H1>
+
+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>Manual pages.
+<LI>Everything else (i.e., narrative documentation).
+</UL>
+
+Our conventions are simple: <P>
+<OL>
+<LI><STRONG>Maintain package-internal files in plain text.</STRONG>
+ The expected viewer for them <EM>more(1)</EM> or an editor window; there's
+ no point in elaborate mark-up. <P>
+
+<LI><STRONG>Mark up manual pages in the man macros.</STRONG> These have to be viewable
+ through traditional <EM>man(1)</EM> programs. <P>
+
+<LI><STRONG>Write everything else in HTML.</STRONG>
+</OL>
+
+When in doubt, HTMLize a master and use <EM>lynx(1)</EM> to generate
+plain ASCII (as we do for the announcement document). <P>
+
+The reason for choosing HTML is that it's (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 don't 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>
+
+<H1><A NAME="bugtrack">How to Report Bugs</A></H1>
+
+The <A NAME="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:
+<PRE>
+ subscribe &lt;name&gt;@&lt;host.domain&gt;
+</PRE>
+
+The <CODE>ncurses</CODE> code is maintained by a small group of
+volunteers. While we try our best to fix bugs promptly, we simply
+don't 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>
+
+In order to use our bug-fixing time efficiently, we put people who
+show us they've taken these steps at the head of our queue. This
+means that if you don't, you'll probably end up at the tail end and
+have to wait a while. <P>
+
+<OL>
+<LI>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 --
+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>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're using a traditional
+asynchronous terminal or PC-based terminal emulator, rather than xterm
+or a UNIX console entry. <P>
+
+It's therefore extremely helpful if you can tell us whether or not your
+problem reproduces on other terminal types. Usually you'll have both
+a console type and xterm available; please tell us whether or not your
+bug reproduces on both. <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 -- a surprising number of the bugs we've seen
+are either triggered or masked by these. <P>
+
+<LI>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>
+
+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>
+
+If the virtual-screen dumps look correct but the bug persists, it's
+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>
+
+Often you'll find terminfo problems at this stage by noticing that the
+escape sequences put out for various capabilities are wrong. If not,
+you're likely to learn enough to be able to characterize any bug in
+the screen-update logic quite exactly. <P>
+
+<LI>Report details and symptoms, not just interpretations. <P>
+
+If you do the preceding two steps, it is very likely that you'll 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 can't characterize and fix yourself. <P>
+
+If you're still stuck, at least you'll 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>
+
+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 doesn't throw
+away any information (actually they're better than un-munched ones because
+they're easier to read). <P>
+
+If your bug produces a core-dump, please include a symbolic stack trace
+generated by gdb(1) or your local equivalent. <P>
+
+Tell us about every terminal on which you've reproduced the bug -- and
+every terminal on which you can't. Ideally, sent us terminfo sources
+for all of these (yours might differ from ours). <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.
+</OL>
+
+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>
+
+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've got
+a bad capability identified, you can disable it and test again. The
+program is command-driven and has on-line help. <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>
+
+There's one other interactive tester, <CODE>tctest</CODE>, that exercises
+translation between termcap and terminfo formats. If you have a serious
+need to run this, you probably belong on our development team! <P>
+
+<H1><A NAME="ncurslib">A Tour of the Ncurses Library</A></H1>
+
+<H2><A NAME="loverview">Library Overview</A></H2>
+
+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
+<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>
+are all in this category. They are very
+unlikely to need change, barring bugs or some fundamental
+reorganization in the underlying data structures. <P>
+
+These files are used only for debugging support:
+<blockquote><code>
+lib_trace.c
+lib_traceatr.c
+lib_tracebits.c
+lib_tracechr.c
+lib_tracedmp.c
+lib_tracemse.c
+trace_buf.c
+</blockquote></code>
+It is rather unlikely you will ever need to change these, unless
+you want to introduce a new debug trace level for some reasoon.<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:
+<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.
+</blockquote></code>
+They are likely to need revision only if
+ncurses is being ported to an environment without an underlying
+terminfo capability representation. <P>
+
+These files
+have serious hooks into
+the tty driver and signal facilities:
+<blockquote><code>
+lib_kernel.c
+lib_baudrate.c
+lib_raw.c
+lib_tstp.c
+lib_twait.c
+</blockquote></code>
+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>
+
+Almost all of the real work is done in the files
+<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
+</blockquote></code>
+Most of the algorithmic complexity in the
+library lives in these files.
+If there is a real bug in <STRONG>ncurses</STRONG> itself, it's probably here.
+We'll tour some of these files in detail
+below (see <A HREF="#engine">The Engine Room</A>). <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
+<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
+</blockquote></code>
+We'll discuss these in the compiler tour. <P>
+
+<H2><A NAME="engine">The Engine Room</A></H2>
+
+<H3><A NAME="input">Keyboard Input</A></H3>
+
+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>
+
+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>
+
+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>
+
+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 don't return a reliable
+time-left value. The function <CODE>timed_wait()</CODE> effectively
+simulates a System V select. <P>
+
+<H3><A NAME="mouse">Mouse Events</A></H3>
+
+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>
+
+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>
+
+This kluge only works because <STRONG>kmous</STRONG> isn't actually used by any
+historic terminal type or curses implementation we know of. Best
+guess is it's a relic of some forgotten experiment in-house at Bell
+Labs that didn't 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>
+
+Here are some more details about mouse event handling: <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>
+
+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>
+
+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>
+
+<H3><A NAME="output">Output and Screen Updating</A></H3>
+
+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>
+
+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>
+
+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>
+
+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>
+
+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>
+
+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 posible. <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>
+
+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>
+
+<H1><A NAME="fmnote">The Forms and Menu Libraries</A></H1>
+
+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>
+
+The configuration code prefers the POSIX regex facility, modeled on
+System V's, but will settle for BSD regexps if the former isn't available. <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>
+
+<H1><A NAME="tic">A Tour of the Terminfo Compiler</A></H1>
+
+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>
+
+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 `,' 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". <P>
+
+<H2><A NAME="nonuse">Translation of Non-<STRONG>use</STRONG> Capabilities</A></H2>
+
+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>
+
+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>
+
+Thus, adding a new capability is usually pretty trivial, just a matter
+of adding one line to the <CODE>include/Caps</CODE> file. We'll have more
+to say about this in the section on <A HREF="#translation">Source-Form
+Translation</A>. <P>
+
+<H2><A NAME="uses">Use Capability Resolution</A></H2>
+
+The background problem that makes <STRONG>tic</STRONG> tricky isn't the capability
+translation itself, it's 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>
+
+This won't 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 can't go promiscuously writing
+everything it translates out to disk -- for one thing, it will typically
+be running with non-root permissions. <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're written out easy to do. <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>
+
+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>
+
+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's OK;
+the resolution code will fetch it off disk when it can't find it in
+core. <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>
+
+<H2><A NAME="translation">Source-Form Translation</A></H2>
+
+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>
+
+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>
+
+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's possible to set up capability aliasing
+or tell the compiler to plain ignore a given capability without writing
+any C code at all. <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>
+
+<H1><A NAME="utils">Other Utilities</A></H1>
+
+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>
+
+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>
+
+<H1><A NAME="style">Style Tips for Developers</A></H1>
+
+See the TO-DO file in the top-level directory of the source distribution
+for additions that would be particularly useful. <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>
+
+Look for the string <CODE>FIXME</CODE> in source files to tag minor bugs
+and potential problems that could use fixing. <P>
+
+Don't try to auto-detect OS features in the main body of the C code.
+That's the job of the configuration system. <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's still
+preferable to ad-hoc code -- that's why the fifth field (flags) is
+there. <P>
+
+Have fun! <P>
+
+<H1><A NAME="port">Porting Hints</A></H1>
+
+The following notes are intended to be a first step towards DOS and Macintosh
+ports of the ncurses libraries. <P>
+
+The following library modules are `pure curses'; 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
+</blockquote></code>
+<P>
+
+This module is pure curses, but calls outstr(): <P>
+
+<blockquote><code>
+lib_getstr.c
+</blockquote></code>
+<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
+</blockquote></code>
+<P>
+
+This modules assist in POSIX emulation on non-POSIX systems: <P>
+<DL>
+<DT> sigaction.c
+<DD> signal calls
+</DL>
+
+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
+</blockquote></code>
+<P>
+
+The following modules will use open()/read()/write()/close()/lseek() on files,
+but no other OS calls. <P>
+
+<DL>
+<DT>lib_screen.c
+<DD>used to read/write screen dumps
+<DT>lib_trace.c
+<DD>used to write trace data to the logfile
+</DL>
+
+Modules that would have to be modified for a port start here: <P>
+
+The following modules are `pure curses' but contain assumptions inappropriate
+for a memory-mapped port. <P>
+
+<dl>
+<dt>lib_longname.c<dd>assumes there may be multiple terminals
+<dt>lib_acs.c<dd>assumes acs_map as a double indirection
+<dt>lib_mvcur.c<dd>assumes cursor moves have variable cost
+<dt>lib_termcap.c<dd>assumes there may be multiple terminals
+<dt>lib_ti.c<dd>assumes there may be multiple terminals
+</dl>
+
+The following modules use UNIX-specific calls:
+
+<dl>
+<dt>lib_doupdate.c<dd>input checking
+<dt>lib_getch.c<dd>read()
+<dt>lib_initscr.c<dd>getenv()
+<dt>lib_newterm.c
+<dt>lib_baudrate.c
+<dt>lib_kernel.c<dd>various tty-manipulation and system calls
+<dt>lib_raw.c<dd>various tty-manipulation calls
+<dt>lib_setup.c<dd>various tty-manipulation calls
+<dt>lib_restart.c<dd>various tty-manipulation calls
+<dt>lib_tstp.c<dd>signal-manipulation calls
+<dt>lib_twait.c<dd>gettimeofday(), select().
+</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/contrib/ncurses/misc/makedef.cmd b/contrib/ncurses/misc/makedef.cmd
new file mode 100644
index 000000000000..f3d9740eff68
--- /dev/null
+++ b/contrib/ncurses/misc/makedef.cmd
@@ -0,0 +1,151 @@
+/*
+ * $Id: makedef.cmd,v 1.4 1998/11/22 03:14:08 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's 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's 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/contrib/ncurses/misc/makellib b/contrib/ncurses/misc/makellib
new file mode 100755
index 000000000000..fe9f99f18517
--- /dev/null
+++ b/contrib/ncurses/misc/makellib
@@ -0,0 +1,162 @@
+#!/bin/sh
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# $Id: makellib,v 1.7 1998/02/11 12:13:50 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's 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
+ ;;
+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/contrib/ncurses/misc/menu.def b/contrib/ncurses/misc/menu.def
new file mode 100644
index 000000000000..7121083ffc6e
--- /dev/null
+++ b/contrib/ncurses/misc/menu.def
@@ -0,0 +1,84 @@
+LIBRARY menu4 INITINSTANCE TERMINSTANCE
+DESCRIPTION "NCurses-4-2-981212, 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_ada_normalize_item_opts" @72 NONAME
+ "_nc_ada_normalize_menu_opts" @73 NONAME
+ "_nc_get_item" @74 NONAME
+ "_nc_menu_cursor_pos" @75 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" @76 NONAME
+ "menu_request_name" @77 NONAME
+ "menu_spacing" @78 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" @79 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/contrib/ncurses/misc/menu.ref b/contrib/ncurses/misc/menu.ref
new file mode 100644
index 000000000000..cee964f7df1b
--- /dev/null
+++ b/contrib/ncurses/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/contrib/ncurses/misc/ncurses-intro.doc b/contrib/ncurses/misc/ncurses-intro.doc
new file mode 100644
index 000000000000..e45ca3530f20
--- /dev/null
+++ b/contrib/ncurses/misc/ncurses-intro.doc
@@ -0,0 +1,2530 @@
+
+ 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 game rogue; these used the
+ already-existing termcap database facility for describing terminal
+ capabilities. These routines were abstracted into a documented library
+ and first released with the early BSD UNIX versions.
+
+ System III UNIX from Bell Labs featured a rewritten and much-improved
+ curses library. It introduced the terminfo format. 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. Jürgen
+ Pfeifer wrote all of the menu and forms code as well as the Ada95
+ binding. Ongoing work is being done by Thomas Dickey and Jürgen
+ Pfeifer. Florian La Roche acts as the maintainer for the Free Software
+ Foundation, which holds the copyright on ncurses. 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 doesn't bear
+ any necessary relation to what is really on the terminal screen; it's
+ 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 `w'indow-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 <curses.h>
+#include <signal.h>
+
+static void finish(int sig);
+
+main(int argc, char *argv[])
+{
+ /* 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) noecho(); /* don't echo input */
+
+ if (has_colors())
+ {
+ start_color();
+
+ /*
+ * Simple color assignment, often all we need.
+ */
+ 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);
+ }
+
+ for (;;)
+ {
+ int c = getch(); /* refresh, accept single keystroke of input */
+
+ /* process the command keystroke */
+ }
+
+ finish(0); /* we're 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 isn't 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-or'ed
+ 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've 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.
+ * 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'll
+ 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 don't 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(), ripofflines(), 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. 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'll 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's 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). Don't
+ 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 ncurses library provides an experimental signal
+ handler, but in general does not catch this signal, because it cannot
+ know how you want the screen re-painted. You will usually have to
+ write the SIGWINCH handler yourself. Ncurses can give you some help.
+
+ The easiest way to code your SIGWINCH handler is to have it 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.
+
+ Finally, ncurses can be configured to provide its own SIGWINCH
+ handler, based on resizeterm.
+
+ 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 doesn't contain any control characters.
+ Try to make attribute changes infrequent on your screens. Don't 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 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's 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 wnoutrfresh() 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'll
+ 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 doesn't 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 isn't sufficient because it doesn't 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'll generate a lot of unnecessary refresh activity and
+ screen flicker.
+
+Panels, Input, and the Standard Screen
+
+ You shouldn't 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's 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's 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 menu_post().
+ 5. Refresh the screen.
+ 6. Process user requests via an input loop.
+ 7. Unpost the menu using menu_unpost().
+ 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 menu_post(), you write the menu to its subwindow. When
+ you call menu_unpost(), 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'll
+ 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 form_post().
+ 5. Refresh the screen.
+ 6. Process user requests via an input loop.
+ 7. Unpost the form using form_unpost().
+ 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've done an explicit set_form_window() 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 isn't 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 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.
+
+ 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'll want
+ to set this to the field width; if it's 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'll want to set this to the field width; if it's 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's 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 isn't 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'll 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's 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'll 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's 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/contrib/ncurses/misc/ncurses-intro.html b/contrib/ncurses/misc/ncurses-intro.html
new file mode 100644
index 000000000000..d01c65e6e52d
--- /dev/null
+++ b/contrib/ncurses/misc/ncurses-intro.html
@@ -0,0 +1,2682 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
+<!--
+ $Id: ncurses-intro.html,v 1.31 1999/05/16 17:02:31 juergen Exp $
+-->
+<HTML>
+<HEAD>
+<TITLE>Writing Programs with NCURSES</TITLE>
+<link rev="made" href="mailto:bugs-ncurses@gnu.org">
+</HEAD>
+<BODY>
+
+<H1>Writing Programs with NCURSES</H1>
+
+<BLOCKQUOTE>
+by Eric S. Raymond and Zeyd M. Ben-Halim<BR>
+updates since release 1.9.9e by Thomas Dickey
+</BLOCKQUOTE>
+
+<H1>Contents</H1>
+<UL>
+<LI><A HREF="#introduction">Introduction</A>
+<UL>
+<LI><A HREF="#history">A Brief History of Curses</A>
+<LI><A HREF="#scope">Scope of This Document</A>
+<LI><A HREF="#terminology">Terminology</A>
+</UL>
+<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><A HREF="#updating">Updating the Screen</A>
+<LI><A HREF="#stdscr">Standard Windows and Function Naming Conventions</A>
+<LI><A HREF="#variables">Variables</A>
+</UL>
+<LI><A HREF="#using">Using the Library</A>
+<UL>
+<LI><A HREF="#starting">Starting up</A>
+<LI><A HREF="#output">Output</A>
+<LI><A HREF="#input">Input</A>
+<LI><A HREF="#formschars">Using Forms Characters</A>
+<LI><A HREF="#attributes">Character Attributes and Color</A>
+<LI><A HREF="#mouse">Mouse Interfacing</A>
+<LI><A HREF="#finishing">Finishing Up</A>
+</UL>
+<LI><A HREF="#functions">Function Descriptions</A>
+<UL>
+<LI><A HREF="#init">Initialization and Wrapup</A>
+<LI><A HREF="#flush">Causing Output to the Terminal</A>
+<LI><A HREF="#lowlevel">Low-Level Capability Access</A>
+<LI><A HREF="#debugging">Debugging</A>
+</UL>
+<LI><A HREF="#hints">Hints, Tips, and Tricks</A>
+<UL>
+<LI><A HREF="#caution">Some Notes of Caution</A>
+<LI><A HREF="#leaving">Temporarily Leaving ncurses Mode</A>
+<LI><A HREF="#xterm">Using <CODE>ncurses</CODE> under <CODE>xterm</CODE></A>
+<LI><A HREF="#screens">Handling Multiple Terminal Screens</A>
+<LI><A HREF="#testing">Testing for Terminal Capabilities</A>
+<LI><A HREF="#tuning">Tuning for Speed</A>
+<LI><A HREF="#special">Special Features of <CODE>ncurses</CODE></A>
+</UL>
+<LI><A HREF="#compat">Compatibility with Older Versions</A>
+<UL>
+<LI><A HREF="#refbug">Refresh of Overlapping Windows</A>
+<LI><A HREF="#backbug">Background Erase</A>
+</UL>
+<LI><A HREF="#xsifuncs">XSI Curses Conformance</A>
+</UL>
+<LI><A HREF="#panels">The Panels Library</A>
+<UL>
+<LI><A HREF="#pcompile">Compiling With the Panels Library</A>
+<LI><A HREF="#poverview">Overview of Panels</A>
+<LI><A HREF="#pstdscr">Panels, Input, and the Standard Screen</A>
+<LI><A HREF="#hiding">Hiding Panels</A>
+<LI><A HREF="#pmisc">Miscellaneous Other Facilities</A>
+</UL>
+<LI><A HREF="#menu">The Menu Library</A>
+<UL>
+<LI><A HREF="#mcompile">Compiling with the menu Library</A>
+<LI><A HREF="#moverview">Overview of Menus</A>
+<LI><A HREF="#mselect">Selecting items</A>
+<LI><A HREF="#mdisplay">Menu Display</A>
+<LI><A HREF="#mwindows">Menu Windows</A>
+<LI><A HREF="#minput">Processing Menu Input</A>
+<LI><A HREF="#mmisc">Miscellaneous Other Features</A>
+</UL>
+<LI><A HREF="#form">The Forms Library</A>
+<UL>
+<LI><A HREF="#fcompile">Compiling with the forms Library</A>
+<LI><A HREF="#foverview">Overview of Forms</A>
+<LI><A HREF="#fcreate">Creating and Freeing Fields and Forms</A>
+<LI><A HREF="#fattributes">Fetching and Changing Field Attributes</A>
+<UL>
+<LI><A HREF="#fsizes">Fetching Size and Location Data</A>
+<LI><A HREF="#flocation">Changing the Field Location</A>
+<LI><A HREF="#fjust">The Justification Attribute</A>
+<LI><A HREF="#fdispatts">Field Display Attributes</A>
+<LI><A HREF="#foptions">Field Option Bits</A>
+<LI><A HREF="#fstatus">Field Status</A>
+<LI><A HREF="#fuser">Field User Pointer</A>
+</UL>
+<LI><A HREF="#fdynamic">Variable-Sized Fields</A>
+<LI><A HREF="#fvalidation">Field Validation</A>
+<UL>
+<LI><A HREF="#ftype_alpha">TYPE_ALPHA</A>
+<LI><A HREF="#ftype_alnum">TYPE_ALNUM</A>
+<LI><A HREF="#ftype_enum">TYPE_ENUM</A>
+<LI><A HREF="#ftype_integer">TYPE_INTEGER</A>
+<LI><A HREF="#ftype_numeric">TYPE_NUMERIC</A>
+<LI><A HREF="#ftype_regexp">TYPE_REGEXP</A>
+</UL>
+<LI><A HREF="#fbuffer">Direct Field Buffer Manipulation</A>
+<LI><A HREF="#formattrs">Attributes of Forms</A>
+<LI><A HREF="#fdisplay">Control of Form Display</A>
+<LI><A HREF="#fdriver">Input Processing in the Forms Driver</A>
+<UL>
+<LI><A HREF="#fpage">Page Navigation Requests</A>
+<LI><A HREF="#ffield">Inter-Field Navigation Requests</A>
+<LI><A HREF="#fifield">Intra-Field Navigation Requests</A>
+<LI><A HREF="#fscroll">Scrolling Requests</A>
+<LI><A HREF="#fedit">Field Editing Requests</A>
+<LI><A HREF="#forder">Order Requests</A>
+<LI><A HREF="#fappcmds">Application Commands</A>
+</UL>
+<LI><A HREF="#fhooks">Field Change Hooks</A>
+<LI><A HREF="#ffocus">Field Change Commands</A>
+<LI><A HREF="#frmoptions">Form Options</A>
+<LI><A HREF="#fcustom">Custom Validation Types</A>
+<UL>
+<LI><A HREF="#flinktypes">Union Types</A>
+<LI><A HREF="#fnewtypes">New Field Types</A>
+<LI><A HREF="#fcheckargs">Validation Function Arguments</A>
+<LI><A HREF="#fcustorder">Order Functions For Custom Types</A>
+<LI><A HREF="#fcustprobs">Avoiding Problems</A>
+</UL>
+</UL>
+</UL>
+
+<HR>
+<H1><A NAME="introduction">Introduction</A></H1>
+
+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>
+
+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>
+
+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>
+
+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>
+
+<H2><A NAME="history">A Brief History of Curses</A></H2>
+
+Historically, the first ancestor of <CODE>curses</CODE> was the routines written to
+provide screen-handling for the game <CODE>rogue</CODE>; these used the
+already-existing <CODE>termcap</CODE> database facility for describing terminal
+capabilities. These routines were abstracted into a documented library and
+first released with the early BSD UNIX versions. <P>
+
+System III UNIX from Bell Labs featured a rewritten and much-improved
+<CODE>curses</CODE> library. It introduced the terminfo format. 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>
+
+<H2><A NAME="scope">Scope of This Document</A></H2>
+
+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 `standout' highlight, usually reverse-video). <P>
+<LI>Support for line- and box-drawing using forms characters. <P>
+<LI>Recognition of function keys on input. <P>
+<LI>Color support. <P>
+<LI>Support for pads (windows of larger than screen size on which the
+screen or a subwindow defines a viewport).
+</UL>
+
+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. <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>
+
+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.
+<A HREF="mailto:juergen.pfeifer@gmx.net">J&uuml;rgen Pfeifer</A>
+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@clark.net">Thomas Dickey</A>
+and
+<A HREF="mailto:juergen.pfeifer@gmx.net">J&uuml;rgen Pfeifer</A>.
+<A HREF="mailto:florian@gnu.org">Florian La Roche</A>
+acts as the maintainer for the Free Software Foundation, which holds the
+copyright on ncurses.
+Contact the current maintainers at
+<A HREF="mailto:bug-ncurses@gnu.org">bug-ncurses@gnu.org</A>.
+<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>
+
+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>
+
+
+<H2><A NAME="terminology">Terminology</A></H2>
+
+In this document, the following terminology is used with reasonable
+consistency:
+
+<DL>
+<DT> window
+<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. <P>
+<DT> screens
+<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. <P>
+<DT> terminal screen
+<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.
+</DL>
+
+<H1><A NAME="curses">The Curses Library</A></H1>
+
+<H2><A NAME="overview">An Overview of Curses</A></H2>
+
+<H3><A NAME="compiling">Compiling Programs using Curses</A></H3>
+
+In order to use the library, it is necessary to have certain types and
+variables defined. Therefore, the programmer must have a line:
+
+<PRE>
+ #include &lt;curses.h&gt;
+</PRE>
+
+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.
+
+<H3><A NAME="updating">Updating the Screen</A></H3>
+
+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>
+
+A window is a purely internal representation. It is used to build and store a
+potential image of a portion of the terminal. It doesn't bear any necessary
+relation to what is really on the terminal screen; it's more like a
+scratchpad or write buffer. <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>
+
+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. <P>
+
+<H3><A NAME="stdscr">Standard Windows and Function Naming Conventions</A></H3>
+
+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>
+
+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 `w'indow-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. <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 'mv' and
+the desired (y, x) coordinates prepended to the arguments to the function. For
+example, the calls
+
+<PRE>
+ move(y, x);
+ addch(ch);
+</PRE>
+
+can be replaced by
+
+<PRE>
+ mvaddch(y, x, ch);
+</PRE>
+
+and
+
+<PRE>
+ wmove(win, y, x);
+ waddch(win, ch);
+</PRE>
+
+can be replaced by
+
+<PRE>
+ mvwaddch(win, y, x, ch);
+</PRE>
+
+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>
+
+<H3><A NAME="variables">Variables</A></H3>
+
+The <CODE>curses</CODE> library sets some variables describing the terminal
+capabilities.
+
+<PRE>
+ type name description
+ ------------------------------------------------------------------
+ int LINES number of lines on the terminal
+ int COLS number of columns on the terminal
+</PRE>
+
+The <CODE>curses.h</CODE> also introduces some <CODE>#define</CODE> constants and types
+of general usefulness:
+
+<DL>
+<DT> <CODE>bool</CODE>
+<DD> boolean type, actually a `char' (e.g., <CODE>bool doneit;</CODE>)
+<DT> <CODE>TRUE</CODE>
+<DD> boolean `true' flag (1).
+<DT> <CODE>FALSE</CODE>
+<DD> boolean `false' flag (0).
+<DT> <CODE>ERR</CODE>
+<DD> error flag returned by routines on a failure (-1).
+<DT> <CODE>OK</CODE>
+<DD> error flag returned by routines when things go right.
+</DL>
+
+<H2><A NAME="using">Using the Library</A></H2>
+
+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>
+
+Here is a sample program to motivate the discussion: <P>
+
+<PRE>
+#include &lt;curses.h&gt;
+#include &lt;signal.h&gt;
+
+static void finish(int sig);
+
+main(int argc, char *argv[])
+{
+ /* 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) noecho(); /* don't echo input */
+
+ if (has_colors())
+ {
+ start_color();
+
+ /*
+ * Simple color assignment, often all we need.
+ */
+ 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);
+ }
+
+ for (;;)
+ {
+ int c = getch(); /* refresh, accept single keystroke of input */
+
+ /* process the command keystroke */
+ }
+
+ finish(0); /* we're done */
+}
+
+static void finish(int sig)
+{
+ endwin();
+
+ /* do your non-curses wrapup here */
+
+ exit(0);
+}
+</PRE>
+
+<H3><A NAME="starting">Starting up</A></H3>
+
+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>
+
+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 isn't done,
+<CODE>refresh()</CODE> will move the cursor to the window's current (y, x)
+coordinates after updating it. <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>
+
+<H3><A NAME="output">Output</A></H3>
+
+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>
+
+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>
+
+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>
+
+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>
+
+<H3><A NAME="input">Input</A></H3>
+
+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 ``cooked'' mode,
+one or the other has to changed before calling <CODE>getch()</CODE>; otherwise,
+the program's output will be unpredictable. <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>
+
+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>
+
+<H3><A NAME="formschars">Using Forms Characters</A></H3>
+
+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>
+
+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>
+
+<H3><A NAME="attributes">Character Attributes and Color</A></H3>
+
+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>
+
+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>
+
+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>
+
+The other is to set the current-highlight value. This is logical-or'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>
+
+Once you've 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>
+
+<H3><A NAME="mouse">Mouse Interfacing</A></H3>
+
+The <CODE>ncurses</CODE> library also provides a mouse interface.
+<!-- The 'note' tag is not portable enough -->
+<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>
+
+Presently, mouse event reporting works in the following environments:
+<ul>
+<li>xterm and similar programs such as rxvt.
+<li>Linux console, when configured with <CODE>gpm</CODE>(1), Alessandro
+Rubini's mouse server.
+<li>OS/2 EMX
+</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>
+
+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>
+
+Each call to <CODE>getmouse()</CODE> fills a structure (the address of which you'll
+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>
+
+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>
+
+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 don't 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>
+
+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>
+
+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>
+
+See the manual page <CODE>curs_mouse(3X)</CODE> for full details of the
+mouse-interface functions. <P>
+
+<H3><A NAME="finishing">Finishing Up</A></H3>
+
+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>
+
+<H2><A NAME="functions">Function Descriptions</A></H2>
+
+We describe the detailed behavior of some important curses functions here, as a
+supplement to the manual page descriptions.
+
+<H3><A NAME="init">Initialization and Wrapup</A></H3>
+
+<DL>
+<DT> <CODE>initscr()</CODE>
+<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>ripofflines()</CODE>, <CODE>use_env()</CODE>, and, if you are using multiple
+terminals, <CODE>newterm()</CODE>.) <P>
+<DT> <CODE>endwin()</CODE>
+<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. <P>
+<DT> <CODE>newterm(type, ofp, ifp)</CODE>
+<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. 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. <P>
+<DT> <CODE>set_term(new)</CODE>
+<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. <P>
+<DT> <CODE>delscreen(sp)</CODE>
+<DD> The inverse of <CODE>newterm()</CODE>; deallocates the data structures
+associated with a given <CODE>SCREEN</CODE> reference.
+</DL>
+
+<H3><A NAME="flush">Causing Output to the Terminal</A></H3>
+
+<DL>
+<DT> <CODE>refresh()</CODE> and <CODE>wrefresh(win)</CODE>
+<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. <P>
+<DT> <CODE>doupdate()</CODE> and <CODE>wnoutrefresh(win)</CODE>
+<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).
+</DL>
+
+<H3><A NAME="lowlevel">Low-Level Capability Access</A></H3>
+
+<DL>
+<DT> <CODE>setupterm(term, filenum, errret)</CODE>
+<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>
+
+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'll have to save it
+yourself if need be.
+</DL>
+
+<H3><A NAME="debugging">Debugging</A></H3>
+
+<!-- The 'note' tag is not portable enough -->
+<blockquote>
+<strong>NOTE:</strong> These functions are not part of the standard curses API!
+</blockquote>
+
+<DL>
+<DT> <CODE>trace()</CODE>
+<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 `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 <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>).
+<DT> <CODE>_tracef()</CODE>
+<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.
+</DL>
+
+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>
+
+<H2><A NAME="hints">Hints, Tips, and Tricks</A></H2>
+
+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>
+
+<H3><A NAME="caution">Some Notes of Caution</A></H3>
+
+If you find yourself thinking you need to use <CODE>noraw()</CODE> or
+<CODE>nocbreak()</CODE>, think again and move carefully. It's 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>
+
+Bear in mind that <CODE>refresh()</CODE> is a synonym for <CODE>wrefresh(stdscr)</CODE>.
+Don't 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>
+
+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>
+
+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>
+
+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>
+
+<H3><A NAME="leaving">Temporarily Leaving NCURSES Mode</A></H3>
+
+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 <CODE>ncurses</CODE>. <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>
+
+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>
+
+Here is some sample code for shellout:
+
+<PRE>
+ 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>
+
+<H3><A NAME="xterm">Using NCURSES under XTERM</A></H3>
+
+A resize operation in X sends SIGWINCH to the application running under xterm.
+The <CODE>ncurses</CODE> library provides an experimental signal
+handler, but in general does not catch this signal, because it cannot
+know how you want the screen re-painted. You will usually have to write the
+SIGWINCH handler yourself. Ncurses can give you some help. <P>
+
+The easiest way to code your SIGWINCH handler is to have it 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>
+
+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>
+
+Finally, ncurses can be configured to provide its own SIGWINCH handler,
+based on <CODE>resizeterm</CODE>.
+
+<H3><A NAME="screens">Handling Multiple Terminal Screens</A></H3>
+
+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>
+
+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>
+
+<H3><A NAME="testing">Testing for Terminal Capabilities</A></H3>
+
+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>
+
+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 <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>
+
+<H3><A NAME="tuning">Tuning for Speed</A></H3>
+
+Use the <CODE>addchstr()</CODE> family of functions for fast
+screen-painting of text when you know the text doesn't contain any
+control characters. Try to make attribute changes infrequent on your
+screens. Don't use the <CODE>immedok()</CODE> option! <P>
+
+<H3><A NAME="special">Special Features of NCURSES</A></H3>
+
+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>
+
+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>
+
+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>
+
+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.
+
+<H2><A NAME="compat">Compatibility with Older Versions</A></H2>
+
+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.
+
+<H3><A NAME="refbug">Refresh of Overlapping Windows</A></H3>
+
+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>
+
+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 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>
+
+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>
+
+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>
+
+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's 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>
+
+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>
+
+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>wnoutrfresh()</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>
+
+<H3><A NAME="backbug">Background Erase</A></H3>
+
+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>
+
+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>
+
+This change in behavior conforms <CODE>ncurses</CODE> to System V Release 4 and
+the XSI Curses standard. <P>
+
+<H2><A NAME="xsifuncs">XSI Curses Conformance</A></H2>
+
+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>
+
+One effect of XSI conformance is the change in behavior described under
+<A HREF="#backbug">"Background Erase -- Compatibility with Old Versions"</A>. <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>
+
+<H1><A NAME="panels">The Panels Library</A></H1>
+
+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>
+
+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>
+
+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>.
+
+<H2><A NAME="pcompile">Compiling With the Panels Library</A></H2>
+
+Your panels-using modules must import the panels library declarations with
+
+<PRE>
+ #include &lt;panel.h&gt;
+</PRE>
+
+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.
+
+<H2><A NAME="poverview">Overview of Panels</A></H2>
+
+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>
+
+Details on the panels functions are available in the man pages. We'll just
+hit the highlights here. <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>
+
+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 doesn't
+change the panel's position in the deck. <P>
+
+To move a panel's window, use <CODE>move_panel()</CODE>. The
+<CODE>mvwin()</CODE> function on the panel's window isn't sufficient because it
+doesn't update the panels library's representation of where the windows are.
+This operation leaves the panel's depth, contents, and size unchanged. <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>
+
+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>
+
+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'll generate a lot of unnecessary refresh
+activity and screen flicker. <P>
+
+<H2><A NAME="pstdscr">Panels, Input, and the Standard Screen</A></H2>
+
+You shouldn't 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>
+
+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>
+
+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>
+
+There is presently no way to display changes to one obscured panel without
+repainting all panels. <P>
+
+<H2><A NAME="hiding">Hiding Panels</A></H2>
+
+It's 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>
+
+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>
+
+<H2><A NAME="pmisc">Miscellaneous Other Facilities</A></H2>
+
+It's 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>
+
+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>
+
+<H1><A NAME="menu">The Menu Library</A></H1>
+
+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>
+
+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>
+
+<H2><A NAME="mcompile">Compiling With the menu Library</A></H2>
+
+Your menu-using modules must import the menu library declarations with
+
+<PRE>
+ #include &lt;menu.h&gt;
+</PRE>
+
+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.
+
+<H2><A NAME="moverview">Overview of Menus</A></H2>
+
+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>
+
+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>
+
+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>
+
+The general flow of control of a menu program looks like this:
+
+<OL>
+<LI>Initialize <CODE>curses</CODE>.
+<LI>Create the menu items, using <CODE>new_item()</CODE>.
+<LI>Create the menu using <CODE>new_menu()</CODE>.
+<LI>Post the menu using <CODE>menu_post()</CODE>.
+<LI>Refresh the screen.
+<LI>Process user requests via an input loop.
+<LI>Unpost the menu using <CODE>menu_unpost()</CODE>.
+<LI>Free the menu, using <CODE>free_menu()</CODE>.
+<LI>Free the items using <CODE>free_item()</CODE>.
+<LI>Terminate <CODE>curses</CODE>.
+</OL>
+
+<H2><A NAME="mselect">Selecting items</A></H2>
+
+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>
+
+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>
+
+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>
+
+<H2><A NAME="mdisplay">Menu Display</A></H2>
+
+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>Whether the O_ROWMAJOR option is enabled
+<LI>Whether display of descriptions is enabled
+<LI>Whatever menu format may have been set by the programmer
+<LI>The length of the menu mark string used for highlighting selected items
+</UL>
+
+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>
+
+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. <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>
+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>
+
+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>
+
+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>
+
+<H2><A NAME="mwindows">Menu Windows</A></H2>
+
+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>
+
+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>
+
+By default, both windows are <CODE>stdscr</CODE>. You can set them with the
+functions in <CODE>menu_win(3x)</CODE>. <P>
+
+When you call <CODE>menu_post()</CODE>, you write the menu to its
+subwindow. When you call <CODE>menu_unpost()</CODE>, you erase the
+subwindow, However, neither of these actually modifies the screen. To
+do that, call <CODE>wrefresh()</CODE> or some equivalent. <P>
+
+<H2><A NAME="minput">Processing Menu Input</A></H2>
+
+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>
+
+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>
+
+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>
+
+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'll get an error return (<CODE>E_REQUEST_DENIED</CODE>). <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>
+
+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>
+
+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>
+
+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>.
+
+<H2><A NAME="mmisc">Miscellaneous Other Features</A></H2>
+
+Various menu options can affect the processing and visual appearance
+and input processing of menus. See <CODE>menu_opts(3x) for
+details.</CODE> <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>
+
+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>
+
+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>
+
+<H1><A NAME="form">The Forms Library</A></H1>
+
+The <CODE>form</CODE> library is a curses extension that supports easy
+programming of on-screen forms for data entry and program control. <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>
+
+<H2><A NAME="fcompile">Compiling With the form Library</A></H2>
+
+Your form-using modules must import the form library declarations with
+
+<PRE>
+ #include &lt;form.h&gt;
+</PRE>
+
+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>
+
+<H2><A NAME="foverview">Overview of Forms</A></H2>
+
+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>
+To make forms, you create groups of fields and connect them with form
+frame objects; the form library makes this relatively simple. <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>
+
+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>
+
+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>
+
+The general flow of control of a form program looks like this:
+
+<OL>
+<LI>Initialize <CODE>curses</CODE>.
+<LI>Create the form fields, using <CODE>new_field()</CODE>.
+<LI>Create the form using <CODE>new_form()</CODE>.
+<LI>Post the form using <CODE>form_post()</CODE>.
+<LI>Refresh the screen.
+<LI>Process user requests via an input loop.
+<LI>Unpost the form using <CODE>form_unpost()</CODE>.
+<LI>Free the form, using <CODE>free_form()</CODE>.
+<LI>Free the fields using <CODE>free_field()</CODE>.
+<LI>Terminate <CODE>curses</CODE>.
+</OL>
+
+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>
+
+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. <P>
+
+<H2><A NAME="fcreate">Creating and Freeing Fields and Forms</A></H2>
+
+The basic function for creating fields is <CODE>new_field()</CODE>: <P>
+
+<PRE>
+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>
+
+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>
+
+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've done an explicit
+<CODE>set_form_window()</CODE> call. <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>
+
+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>
+FIELD *dup_field(FIELD *field, /* field to copy */
+ int top, int left); /* location of new copy */
+</PRE>
+
+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>
+FIELD *link_field(FIELD *field, /* field to copy */
+ int top, int left); /* location of new copy */
+</PRE>
+
+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>
+
+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>
+
+As with duplicated fields, linked fields have attribute bits separate
+from the original. <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>
+
+To connect fields to a form, use <P>
+
+<PRE>
+FORM *new_form(FIELD **fields);
+</PRE>
+
+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>
+
+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>
+
+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>
+
+<H2><A NAME="fattributes">Fetching and Changing Field Attributes</A></H2>
+
+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>
+
+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>
+
+<H3><A NAME="fsizes">Fetching Size and Location Data</A></H3>
+
+You can retrieve field sizes and locations through: <P>
+
+<PRE>
+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>
+
+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>
+
+<H3><A NAME="flocation">Changing the Field Location</A></H3>
+
+It is possible to move a field's location on the screen: <P>
+
+<PRE>
+int move_field(FIELD *field, /* field to alter */
+ int top, int left); /* new upper-left corner */
+</PRE>
+
+You can, of course. query the current location through <CODE>field_info()</CODE>.
+
+<H3><A NAME="fjust">The Justification Attribute</A></H3>
+
+One-line fields may be unjustified, justified right, justified left,
+or centered. Here is how you manipulate this attribute: <P>
+
+<PRE>
+int set_field_just(FIELD *field, /* field to alter */
+ int justmode); /* mode to set */
+
+int field_just(FIELD *field); /* fetch mode of field */
+</PRE>
+
+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>
+
+<H3><A NAME="fdispatts">Field Display Attributes</A></H3>
+
+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>
+
+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>
+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>
+
+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>
+
+<H3><A NAME="foptions">Field Option Bits</A></H3>
+
+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:
+
+<PRE>
+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>
+
+By default, all options are on. Here are the available option bits:
+<DL>
+<DT> O_VISIBLE
+<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.
+<DT> O_ACTIVE
+<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.
+<DT> O_PUBLIC
+<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.
+<DT> O_EDIT
+<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.
+<DT> O_WRAP
+<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.
+<DT> O_BLANK
+<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).
+<DT> O_AUTOSKIP
+<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.
+<DT> O_NULLOK
+<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.
+<DT> O_PASSOK
+<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.
+<DT> O_STATIC
+<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.
+</DL>
+
+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>
+
+The option values are bit-masks and can be composed with logical-or in
+the obvious way. <P>
+
+<H2><A NAME="fstatus">Field Status</A></H2>
+
+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>
+int set_field_status(FIELD *field, /* field to alter */
+ int status); /* mode to set */
+
+int field_status(FIELD *field); /* fetch mode of field */
+</PRE>
+
+Setting this flag under program control can be useful if you use the same
+form repeatedly, looking for modified fields each time. <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 isn't 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>
+
+<H2><A NAME="fuser">Field User Pointer</A></H2>
+
+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:
+
+<PRE>
+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>
+
+<H2><A NAME="fdynamic">Variable-Sized Fields</A></H2>
+
+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>
+
+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>
+
+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>
+int set_max_field(FIELD *field, /* field to alter (may not be NULL) */
+ int max_size); /* upper limit on field size */
+</PRE>
+
+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>
+
+The following properties of a field change when it becomes dynamic:
+
+<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>Field justification will be ignored (though whatever justification is
+set up will be retained internally and can be queried).
+<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>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.
+</UL>
+
+<H2><A NAME="fvalidation">Field Validation</A></H2>
+
+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 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>
+
+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>
+
+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>
+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>
+
+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>
+
+Here are the pre-defined validation types: <P>
+
+<H3><A NAME="ftype_alpha">TYPE_ALPHA</A></H3>
+
+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>
+int set_field_type(FIELD *field, /* field to alter */
+ TYPE_ALPHA, /* type to associate */
+ int width); /* maximum width of field */
+</PRE>
+
+The <CODE>width</CODE> argument sets a minimum width of data. Typically
+you'll want to set this to the field width; if it's greater than the
+field width, the validation check will always fail. A minimum width
+of zero makes field completion optional. <P>
+
+<H3><A NAME="ftype_alnum">TYPE_ALNUM</A></H3>
+
+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>
+int set_field_type(FIELD *field, /* field to alter */
+ TYPE_ALNUM, /* type to associate */
+ int width); /* maximum width of field */
+</PRE>
+
+The <CODE>width</CODE> argument sets a minimum width of data. As with
+TYPE_ALPHA, typically you'll want to set this to the field width; if it's
+greater than the field width, the validation check will always fail. A
+minimum width of zero makes field completion optional. <P>
+
+<H3><A NAME="ftype_enum">TYPE_ENUM</A></H3>
+
+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>
+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>
+
+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>
+
+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>
+
+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>
+
+The <CODE>REQ_NEXT_CHOICE</CODE> and <CODE>REQ_PREV_CHOICE</CODE> input requests
+can be particularly useful with these fields. <P>
+
+<H3><A NAME="ftype_integer">TYPE_INTEGER</A></H3>
+
+This field type accepts an integer. It is set up as follows: <P>
+
+<PRE>
+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>
+
+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>
+
+If the value passes its range check, it is padded with as many leading
+zero digits as necessary to meet the padding argument. <P>
+
+A <CODE>TYPE_INTEGER</CODE> value buffer can conveniently be interpreted
+with the C library function <CODE>atoi(3)</CODE>.
+
+<H3><A NAME="ftype_numeric">TYPE_NUMERIC</A></H3>
+
+This field type accepts a decimal number. It is set up as follows: <P>
+
+<PRE>
+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>
+
+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>
+
+If the value passes its range check, it is padded with as many trailing
+zero digits as necessary to meet the padding argument. <P>
+
+A <CODE>TYPE_NUMERIC</CODE> value buffer can conveniently be interpreted
+with the C library function <CODE>atof(3)</CODE>.
+
+<H3><A NAME="ftype_regexp">TYPE_REGEXP</A></H3>
+
+This field type accepts data matching a regular expression. It is set up
+as follows: <P>
+
+<PRE>
+int set_field_type(FIELD *field, /* field to alter */
+ TYPE_REGEXP, /* type to associate */
+ char *regexp); /* expression to match */
+</PRE>
+
+The syntax for regular expressions is that of <CODE>regcomp(3)</CODE>.
+The check for regular-expression match is performed on exit.
+
+<H2><A NAME="fbuffer">Direct Field Buffer Manipulation</A></H2>
+
+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>
+char *field_buffer(FIELD *field, /* field to query */
+ int bufindex); /* number of buffer to query */
+</PRE>
+
+Normally, the state of the zero-numbered buffer for each field is set by
+the user's editing actions on that field. It's sometimes useful to be able
+to set the value of the zero-numbered (or some other) buffer from your
+application:
+
+<PRE>
+int set_field_buffer(FIELD *field, /* field to alter */
+ int bufindex, /* number of buffer to alter */
+ char *value); /* string value to set */
+</PRE>
+
+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>
+
+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 isn't 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>
+
+<H2><A NAME="formattrs">Attributes of Forms</A></H2>
+
+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>
+
+The principal attribute of a form is its field list. You can query
+and change this list with: <P>
+
+<PRE>
+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>
+
+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>
+
+It may also be null, in which case the old fields are disconnected
+(and not freed) but no new ones are connected. <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>
+
+<H2><A NAME="fdisplay">Control of Form Display</A></H2>
+
+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>
+
+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>
+
+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>
+
+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>
+
+In order to declare your own frame window for a form, you'll need to
+know the size of the form's bounding rectangle. You can get this
+information with: <P>
+
+<PRE>
+int scale_form(FORM *form, /* form to query */
+ int *rows, /* form rows */
+ int *cols); /* form cols */
+</PRE>
+
+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:
+
+<PRE>
+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>
+
+Note that curses operations, including <CODE>refresh()</CODE>, on the form,
+should be done on the frame window, not the form subwindow. <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>
+int data_ahead(FORM *form); /* form to be queried */
+
+int data_behind(FORM *form); /* form to be queried */
+</PRE>
+
+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>
+
+The function <CODE>data_behind()</CODE> returns TRUE if the first (upper
+left hand) character position is off-screen (not being displayed). <P>
+
+Finally, there is a function to restore the form window's cursor to the
+value expected by the forms driver: <P>
+
+<PRE>
+int pos_form_cursor(FORM *) /* form to be queried */
+</PRE>
+
+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>
+
+<H2><A NAME="fdriver">Input Processing in the Forms Driver</A></H2>
+
+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>
+int form_driver(FORM *form, /* form to pass input to */
+ int request); /* form request code */
+</PRE>
+
+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>
+
+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>
+
+<H3><A NAME="fpage">Page Navigation Requests</A></H3>
+
+These requests cause page-level moves through the form,
+triggering display of a new form screen. <P>
+
+<DL>
+<DT> <CODE>REQ_NEXT_PAGE</CODE>
+<DD> Move to the next form page.
+<DT> <CODE>REQ_PREV_PAGE</CODE>
+<DD> Move to the previous form page.
+<DT> <CODE>REQ_FIRST_PAGE</CODE>
+<DD> Move to the first form page.
+<DT> <CODE>REQ_LAST_PAGE</CODE>
+<DD> Move to the last form page.
+</DL>
+
+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>
+
+<H3><A NAME="#ffield">Inter-Field Navigation Requests</A></H3>
+
+These requests handle navigation between fields on the same page. <P>
+
+<DL>
+<DT> <CODE>REQ_NEXT_FIELD</CODE>
+<DD> Move to next field.
+<DT> <CODE>REQ_PREV_FIELD</CODE>
+<DD> Move to previous field.
+<DT> <CODE>REQ_FIRST_FIELD</CODE>
+<DD> Move to the first field.
+<DT> <CODE>REQ_LAST_FIELD</CODE>
+<DD> Move to the last field.
+<P>
+<DT> <CODE>REQ_SNEXT_FIELD</CODE>
+<DD> Move to sorted next field.
+<DT> <CODE>REQ_SPREV_FIELD</CODE>
+<DD> Move to sorted previous field.
+<DT> <CODE>REQ_SFIRST_FIELD</CODE>
+<DD> Move to the sorted first field.
+<DT> <CODE>REQ_SLAST_FIELD</CODE>
+<DD> Move to the sorted last field.
+<P>
+<DT> <CODE>REQ_LEFT_FIELD</CODE>
+<DD> Move left to field.
+<DT> <CODE>REQ_RIGHT_FIELD</CODE>
+<DD> Move right to field.
+<DT> <CODE>REQ_UP_FIELD</CODE>
+<DD> Move up to field.
+<DT> <CODE>REQ_DOWN_FIELD</CODE>
+<DD> Move down to field.
+</DL>
+
+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>
+
+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>
+
+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>
+
+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>
+
+<H3><A NAME="#fifield">Intra-Field Navigation Requests</A></H3>
+
+These requests drive movement of the edit cursor within the currently
+selected field. <P>
+
+<DL>
+<DT> <CODE>REQ_NEXT_CHAR</CODE>
+<DD> Move to next character.
+<DT> <CODE>REQ_PREV_CHAR</CODE>
+<DD> Move to previous character.
+<DT> <CODE>REQ_NEXT_LINE</CODE>
+<DD> Move to next line.
+<DT> <CODE>REQ_PREV_LINE</CODE>
+<DD> Move to previous line.
+<DT> <CODE>REQ_NEXT_WORD</CODE>
+<DD> Move to next word.
+<DT> <CODE>REQ_PREV_WORD</CODE>
+<DD> Move to previous word.
+<DT> <CODE>REQ_BEG_FIELD</CODE>
+<DD> Move to beginning of field.
+<DT> <CODE>REQ_END_FIELD</CODE>
+<DD> Move to end of field.
+<DT> <CODE>REQ_BEG_LINE</CODE>
+<DD> Move to beginning of line.
+<DT> <CODE>REQ_END_LINE</CODE>
+<DD> Move to end of line.
+<DT> <CODE>REQ_LEFT_CHAR</CODE>
+<DD> Move left in field.
+<DT> <CODE>REQ_RIGHT_CHAR</CODE>
+<DD> Move right in field.
+<DT> <CODE>REQ_UP_CHAR</CODE>
+<DD> Move up in field.
+<DT> <CODE>REQ_DOWN_CHAR</CODE>
+<DD> Move down in field.
+</DL>
+
+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>
+
+<H3><A NAME="fscroll">Scrolling Requests</A></H3>
+
+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>
+<DD> Scroll vertically forward a line.
+<DT> <CODE>REQ_SCR_BLINE</CODE>
+<DD> Scroll vertically backward a line.
+<DT> <CODE>REQ_SCR_FPAGE</CODE>
+<DD> Scroll vertically forward a page.
+<DT> <CODE>REQ_SCR_BPAGE</CODE>
+<DD> Scroll vertically backward a page.
+<DT> <CODE>REQ_SCR_FHPAGE</CODE>
+<DD> Scroll vertically forward half a page.
+<DT> <CODE>REQ_SCR_BHPAGE</CODE>
+<DD> Scroll vertically backward half a page.
+<DT> <CODE>REQ_SCR_FCHAR</CODE>
+<DD> Scroll horizontally forward a character.
+<DT> <CODE>REQ_SCR_BCHAR</CODE>
+<DD> Scroll horizontally backward a character.
+<DT> <CODE>REQ_SCR_HFLINE</CODE>
+<DD> Scroll horizontally one field width forward.
+<DT> <CODE>REQ_SCR_HBLINE</CODE>
+<DD> Scroll horizontally one field width backward.
+<DT> <CODE>REQ_SCR_HFHALF</CODE>
+<DD> Scroll horizontally one half field width forward.
+<DT> <CODE>REQ_SCR_HBHALF</CODE>
+<DD> Scroll horizontally one half field width backward.
+</DL>
+
+For scrolling purposes, a <EM>page</EM> of a field is the height
+of its visible part. <P>
+
+<H3><A NAME="fedit">Editing Requests</A></H3>
+
+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>
+
+The following requests support editing the field and changing the edit
+mode: <P>
+
+<DL>
+<DT> <CODE>REQ_INS_MODE</CODE>
+<DD> Set insertion mode.
+<DT> <CODE>REQ_OVL_MODE</CODE>
+<DD> Set overlay mode.
+<DT> <CODE>REQ_NEW_LINE</CODE>
+<DD> New line request (see below for explanation).
+<DT> <CODE>REQ_INS_CHAR</CODE>
+<DD> Insert space at character location.
+<DT> <CODE>REQ_INS_LINE</CODE>
+<DD> Insert blank line at character location.
+<DT> <CODE>REQ_DEL_CHAR</CODE>
+<DD> Delete character at cursor.
+<DT> <CODE>REQ_DEL_PREV</CODE>
+<DD> Delete previous word at cursor.
+<DT> <CODE>REQ_DEL_LINE</CODE>
+<DD> Delete line at cursor.
+<DT> <CODE>REQ_DEL_WORD</CODE>
+<DD> Delete word at cursor.
+<DT> <CODE>REQ_CLR_EOL</CODE>
+<DD> Clear to end of line.
+<DT> <CODE>REQ_CLR_EOF</CODE>
+<DD> Clear to end of field.
+<DT> <CODE>REQ_CLEAR_FIELD</CODE>
+<DD> Clear entire field.
+</DL>
+
+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>
+
+First, we consider <CODE>REQ_NEW_LINE</CODE>: <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>
+
+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>
+
+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>
+
+Now, let us consider <CODE>REQ_DEL_PREV</CODE>: <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>
+
+However, <CODE>REQ_DEL_PREV</CODE> at the beginning of a field is instead
+treated as a <CODE>REQ_PREV_FIELD</CODE>. <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>
+
+See <A HREF="#frmoptions">Form Options</A> for discussion of how to set
+and clear the overload options. <P>
+
+<H3><A NAME="forder">Order Requests</A></H3>
+
+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>
+<DD> Place the successor value of the current value in the buffer.
+<DT> <CODE>REQ_PREV_CHOICE</CODE>
+<DD> Place the predecessor value of the current value in the buffer.
+</DL>
+
+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>
+
+<H3><A NAME="fappcmds">Application Commands</A></H3>
+
+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>
+
+<H2><A NAME="fhooks">Field Change Hooks</A></H2>
+
+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>
+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>
+
+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
+<DD> This hook is called when the form is posted; also, just after
+each page change operation.
+<DT> field_init
+<DD> This hook is called when the form is posted; also, just after
+each field change
+<DT> field_term
+<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. <P>
+<DT> form_term
+<DD> This hook is called when the form is unposted; also, just before
+each page change operation.
+</DL>
+
+Calls to these hooks may be triggered
+<OL>
+<LI>When user editing requests are processed by the forms driver
+<LI>When the current page is changed by <CODE>set_current_field()</CODE> call
+<LI>When the current field is changed by a <CODE>set_form_page()</CODE> call
+</OL>
+
+See <A NAME="ffocus">Field Change Commands</A> for discussion of the latter
+two cases. <P>
+
+You can set a default hook for all fields by passing one of the set functions
+a NULL first argument. <P>
+
+You can disable any of these hooks by (re)setting them to NULL, the default
+value. <P>
+
+<H2><A HREF="#ffocus">Field Change Commands</A></H2>
+
+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>
+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>
+
+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>
+
+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>
+
+It is also possible to move around by pages. <P>
+
+<PRE>
+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>
+
+The initial page of a newly-created form is 0. The function
+<CODE>set_form_fields()</CODE> resets this. <P>
+
+<H2><A NAME="frmoptions">Form Options</A></H2>
+
+Like fields, forms may have control option bits. They can be changed
+or queried with these functions: <P>
+
+<PRE>
+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>
+
+By default, all options are on. Here are the available option bits:
+
+<DL>
+<DT> O_NL_OVERLOAD
+<DD> Enable overloading of <CODE>REQ_NEW_LINE</CODE> as described in <A
+NAME="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.
+<DT> O_BS_OVERLOAD
+<DD> Enable overloading of <CODE>REQ_DEL_PREV</CODE> as described in
+<A NAME="fedit">Editing Requests</A>.
+</DL>
+
+The option values are bit-masks and can be composed with logical-or in
+the obvious way. <P>
+
+<H2><A NAME="fcustom">Custom Validation Types</A></H2>
+
+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>
+
+<H3><A NAME="flinktypes">Union Types</A></H3>
+
+The simplest way to create a custom data type is to compose it from two
+preexisting ones: <P>
+
+<PRE>
+FIELD *link_fieldtype(FIELDTYPE *type1,
+ FIELDTYPE *type2);
+</PRE>
+
+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>
+
+<H3><A NAME="fnewtypes">New Field Types</A></H3>
+
+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>A field-validation function to be applied on exit from the field.
+</UL>
+
+Here's how you do that: <P>
+<PRE>
+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>
+
+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>
+
+The function <CODE>free_fieldtype()</CODE> deallocates the argument
+fieldtype, freeing all storage associated with it. <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>
+
+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>
+
+<H3><A NAME="fcheckargs">Validation Function Arguments</A></H3>
+
+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'll 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>
+
+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>
+
+Here is how you make the association: <P>
+
+<PRE>
+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>
+
+Here is how the storage-management hooks are used: <P>
+
+<DL>
+<DT> <CODE>make_str</CODE>
+<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.
+<DT> <CODE>copy_str</CODE>
+<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.
+<DT> <CODE>free_str</CODE>
+<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.
+</DL>
+
+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>
+
+<H3><A NAME="fcustorder">Order Functions For Custom Types</A></H3>
+
+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's how: <P>
+
+<PRE>
+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>
+
+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>
+
+<H3><A NAME="fcustprobs">Avoiding Problems</A></H3>
+
+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>
+
+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>
+
+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.
+</BODY>
+</HTML>
diff --git a/contrib/ncurses/misc/ncurses.def b/contrib/ncurses/misc/ncurses.def
new file mode 100644
index 000000000000..82170f16ffb8
--- /dev/null
+++ b/contrib/ncurses/misc/ncurses.def
@@ -0,0 +1,442 @@
+LIBRARY ncurses4 INITINSTANCE TERMINSTANCE
+DESCRIPTION "NCurses-4-2-981212, 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_ada_getbegyx" @7 NONAME
+ "_nc_ada_getmaxyx" @8 NONAME
+ "_nc_ada_getparyx" @9 NONAME
+ "_nc_ada_getyx" @10 NONAME
+ "_nc_ada_isscroll" @15 NONAME
+ "_nc_ada_mouse_event" @16 NONAME
+ "_nc_ada_mouse_mask" @22 NONAME
+ "_nc_ada_vcheck" @23 NONAME
+ "_nc_add_to_try" @25 NONAME
+ "_nc_background" @27 NONAME
+ "_nc_cap_hash_table" @805 NONAME
+ "_nc_capalias_table" @806 NONAME
+ "_nc_capcmp" @707 NONAME
+ "_nc_captoinfo" @829 NONAME
+ "_nc_comment_end" @819 NONAME
+ "_nc_comment_start" @818 NONAME
+ "_nc_curr_col" @816 NONAME
+ "_nc_curr_file_pos" @817 NONAME
+ "_nc_curr_line" @815 NONAME
+ "_nc_curr_token" @803 NONAME
+ "_nc_do_color" @1037 NONAME
+ "_nc_doalloc" @51 NONAME
+ "_nc_entry_match" @710 NONAME
+ "_nc_err_abort" @826 NONAME
+ "_nc_expand_try" @54 NONAME
+ "_nc_expanded" @58 NONAME
+ "_nc_fallback" @625 NONAME
+ "_nc_find_entry" @809 NONAME
+ "_nc_find_type_entry" @810 NONAME
+ "_nc_first_name" @622 NONAME
+ "_nc_free_entries" @712 NONAME
+ "_nc_freeall" @59 NONAME
+ "_nc_freewin" @60 NONAME
+ "_nc_get_curterm" @63 NONAME
+ "_nc_get_table" @808 NONAME
+ "_nc_get_token" @811 NONAME
+ "_nc_get_type" @823 NONAME
+ "_nc_getenv_num" @65 NONAME
+ "_nc_has_mouse" @67 NONAME
+ "_nc_hash_map" @73 NONAME
+ "_nc_head" @700 NONAME
+ "_nc_home_terminfo" @84 NONAME
+ "_nc_info_hash_table" @804 NONAME
+ "_nc_infoalias_table" @807 NONAME
+ "_nc_infotocap" @830 NONAME
+ "_nc_init_entry" @702 NONAME
+ "_nc_keypad" @1024 NONAME
+ "_nc_lib_traceatr" @91 NONAME
+ "_nc_lib_tracedmp" @92 NONAME
+ "_nc_make_oldhash" @93 NONAME
+ "_nc_makenew" @1025 NONAME
+ "_nc_memmove" @95 NONAME
+ "_nc_merge_entry" @704 NONAME
+ "_nc_msec_cost" @96 NONAME
+ "_nc_mvcur_init" @1014 NONAME
+ "_nc_mvcur_resume" @97 NONAME
+ "_nc_mvcur_wrap" @1015 NONAME
+ "_nc_name_match" @623 NONAME
+ "_nc_nulls_sent" @98 NONAME
+ "_nc_oldnums" @103 NONAME
+ "_nc_outch" @1026 NONAME
+ "_nc_outstr" @1033 NONAME
+ "_nc_panelhook" @106 NONAME
+ "_nc_panic_mode" @814 NONAME
+ "_nc_parse_entry" @706 NONAME
+ "_nc_printf_string" @116 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" @117 NONAME
+ "_nc_remove_key" @118 NONAME
+ "_nc_render" @1027 NONAME
+ "_nc_reset_input" @813 NONAME
+ "_nc_resolve_uses" @711 NONAME
+ "_nc_ripoffline" @119 NONAME
+ "_nc_save_str" @703 NONAME
+ "_nc_screen_chain" @120 NONAME
+ "_nc_screen_init" @127 NONAME
+ "_nc_screen_resume" @129 NONAME
+ "_nc_screen_wrap" @130 NONAME
+ "_nc_scroll_oldhash" @132 NONAME
+ "_nc_scroll_optimize" @1029 NONAME
+ "_nc_scroll_window" @1030 NONAME
+ "_nc_scrolln" @137 NONAME
+ "_nc_set_buffer" @142 NONAME
+ "_nc_set_curterm" @143 NONAME
+ "_nc_set_source" @822 NONAME
+ "_nc_set_type" @824 NONAME
+ "_nc_set_writedir" @144 NONAME
+ "_nc_setupscreen" @1031 NONAME
+ "_nc_sigaction" @145 NONAME
+ "_nc_signal_handler" @1034 NONAME
+ "_nc_slk_format" @146 NONAME
+ "_nc_slk_initialize" @147 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" @148 NONAME
+ "_nc_tic_expand" @152 NONAME
+ "_nc_tic_written" @158 NONAME
+ "_nc_timed_wait" @1036 NONAME
+ "_nc_trace_buf" @159 NONAME
+ "_nc_tracebits" @160 NONAME
+ "_nc_tracing" @1010 NONAME
+ "_nc_trans_string" @161 NONAME
+ "_nc_visbuf" @1012 NONAME
+ "_nc_visbuf2" @162 NONAME
+ "_nc_vsscanf" @167 NONAME
+ "_nc_waddch_nosync" @1028 NONAME
+ "_nc_warning" @827 NONAME
+ "_nc_wrap_entry" @705 NONAME
+ "_nc_write_entry" @708 NONAME
+ "_tracechar" @403 NONAME
+ "_tracemouse" @404 NONAME
+ "acs_map" @506 NONAME
+ "addch" @1 NONAME
+ "addchnstr" @2 NONAME
+ "addchstr" @3 NONAME
+ "addnstr" @4 NONAME
+ "addstr" @5 NONAME
+ "attr_get" @14 NONAME
+ "attr_off" @169 NONAME
+ "attr_on" @170 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" @172 NONAME
+ "copywin" @37 NONAME
+ "cur_term" @515 NONAME
+ "curs_set" @38 NONAME
+ "curscr" @501 NONAME
+ "def_prog_mode" @39 NONAME
+ "def_shell_mode" @40 NONAME
+ "define_key" @178 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
+ "erasechar" @53 NONAME
+ "filter" @55 NONAME
+ "flash" @56 NONAME
+ "flushinp" @57 NONAME
+ "getbkgd" @183 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" @184 NONAME
+ "hline" @72 NONAME
+ "idcok" @74 NONAME
+ "idlok" @75 NONAME
+ "immedok" @76 NONAME
+ "inch" @77 NONAME
+ "inchnstr" @78 NONAME
+ "inchstr" @79 NONAME
+ "init_acs" @1013 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
+ "key_names" @185 NONAME
+ "keyname" @102 NONAME
+ "keyok" @186 NONAME
+ "keypad" @104 NONAME
+ "killchar" @105 NONAME
+ "leaveok" @107 NONAME
+ "longname" @108 NONAME
+ "mcprint" @187 NONAME
+ "meta" @109 NONAME
+ "mouse_trafo" @188 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" @189 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" @193 NONAME
+ "slk_attr_set" @211 NONAME
+ "slk_attroff" @237 NONAME
+ "slk_attron" @239 NONAME
+ "slk_attrset" @241 NONAME
+ "slk_clear" @243 NONAME
+ "slk_color" @234 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" @238 NONAME
+ "tparm" @653 NONAME
+ "tputs" @655 NONAME
+ "trace" @405 NONAME
+ "ttytype" @514 NONAME
+ "typeahead" @264 NONAME
+ "unctrl" @361 NONAME
+ "ungetch" @265 NONAME
+ "ungetmouse" @357 NONAME
+ "untouchwin" @267 NONAME
+ "use_default_colors" @240 NONAME
+ "use_env" @268 NONAME
+ "vidattr" @269 NONAME
+ "vidputs" @271 NONAME
+ "vline" @273 NONAME
+ "vw_printw" @242 NONAME
+ "vw_scanw" @251 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" @263 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" @266 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" @270 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/contrib/ncurses/misc/ncurses.ref b/contrib/ncurses/misc/ncurses.ref
new file mode 100644
index 000000000000..cf4de7d59243
--- /dev/null
+++ b/contrib/ncurses/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/contrib/ncurses/misc/panel.def b/contrib/ncurses/misc/panel.def
new file mode 100644
index 000000000000..868813c4f102
--- /dev/null
+++ b/contrib/ncurses/misc/panel.def
@@ -0,0 +1,25 @@
+LIBRARY panel4 INITINSTANCE TERMINSTANCE
+DESCRIPTION "NCurses-4-2-981212, module panel"
+CODE LOADONCALL
+DATA LOADONCALL NONSHARED MULTIPLE
+EXPORTS
+ "_nc_calculate_obscure" @16 NONAME
+ "_nc_free_obscure" @17 NONAME
+ "_nc_override" @18 NONAME
+ "_nc_panel_is_linked" @19 NONAME
+ "_nc_panel_link_bottom" @20 NONAME
+ "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/contrib/ncurses/misc/panel.ref b/contrib/ncurses/misc/panel.ref
new file mode 100644
index 000000000000..e84045a1047d
--- /dev/null
+++ b/contrib/ncurses/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/contrib/ncurses/misc/run_tic.sh b/contrib/ncurses/misc/run_tic.sh
new file mode 100755
index 000000000000..a5170773b09c
--- /dev/null
+++ b/contrib/ncurses/misc/run_tic.sh
@@ -0,0 +1,159 @@
+#!/bin/sh
+##############################################################################
+# Copyright (c) 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> 1996
+#
+# $Id: run_tic.sh,v 1.10 1998/05/31 00:29:34 mooney Exp $
+# 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.
+#
+# Parameters:
+# $1 = nominal directory in which to find 'tic', i.e., $(bindir).
+# $2 = source-directory, i.e., $(srcdir)
+# $3 = destination-directory path, i.e., $(ticdir)
+# $4 = install-prefix, if any
+#
+# Assumes:
+# The leaf directory names (bin, lib, shared, tabset, terminfo)
+#
+echo '** Building terminfo database, please wait...'
+#
+# Parameter parsing is primarily for debugging. The script is designed to
+# be run from the misc/Makefile as
+# make install.data
+prefix=/usr/local
+if test $# != 0 ; then
+ bindir=$1
+ shift
+ PREFIX=`echo $bindir | sed -e 's/\/bin$//'`
+ test -n "$PREFIX" && test "x$PREFIX" != "x$bindir" && prefix=$PREFIX
+else
+ bindir=$prefix/bin
+fi
+
+if test $# != 0 ; then
+ srcdir=$1
+ shift
+else
+ srcdir=.
+fi
+
+if test $# != 0 ; then
+ ticdir=$1
+ shift
+else
+ ticdir=$prefix/share/terminfo
+fi
+
+if test $# != 0 ; then
+ IP=$1
+ shift
+else
+ IP=""
+fi
+
+# Allow tic to run either from the install-path, or from the build-directory
+case "$PATH" in
+:*) PATH=../progs:$IP$bindir$PATH ;;
+*) PATH=../progs:$IP$bindir:$PATH ;;
+esac
+export PATH
+
+#
+# set another env var that doesn't get reset when `shlib' runs, so `shlib' uses
+# the PATH we just set.
+#
+NEWPATH=$PATH
+export NEWPATH
+PROG_BIN_DIR=$IP$bindir
+export PROG_BIN_DIR
+
+TERMINFO=$IP$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\//'`
+
+# 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.
+( rm -fr $TERMINFO/[0-9A-Za-z] 2>/dev/null )
+
+# 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=`echo $ticdir | sed -e 's/\/terminfo$/\/tabset/'`
+SRC=$srcdir/terminfo.src
+if test "x$TABSET" != "x/usr/share/tabset" ; then
+ echo '** adjusting tabset paths'
+ TMP=${TMPDIR-/tmp}/$$
+ sed -e s:/usr/share/tabset:$TABSET:g $SRC >$TMP
+ trap "rm -f $TMP" 0 1 2 5 15
+ SRC=$TMP
+fi
+
+if ( $srcdir/shlib tic -s $SRC )
+then
+ echo '** built new '$TERMINFO
+else
+ echo '? tic could not build '$TERMINFO
+ exit 1
+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
+ 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 $IP$prefix
+ # 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 '** linked '$TICDIR' for compatibility'
+ fi
+ fi
+fi
diff --git a/contrib/ncurses/misc/shlib b/contrib/ncurses/misc/shlib
new file mode 100755
index 000000000000..ee55062283f7
--- /dev/null
+++ b/contrib/ncurses/misc/shlib
@@ -0,0 +1,82 @@
+#!/bin/sh
+##############################################################################
+# Copyright (c) 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> 1996
+#
+# $Id: shlib,v 1.5 1998/05/31 00:29:38 mooney 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.
+#
+
+#
+# Make sure that we use the PATH that was set in run_tic.sh
+#
+if test X$NEWPATH != X ; then
+ PATH=$NEWPATH
+ export PATH
+fi
+
+q=""
+for p in lib ../lib
+do
+ if test -d $p; then
+ q="$p"
+ fi
+done
+if test -n "$q" ; then
+ if test -n "$LD_LIBRARY_PATH"; then
+ LD_LIBRARY_PATH="$q:$LD_LIBRARY_PATH"
+ else
+ LD_LIBRARY_PATH="$q"
+ fi
+ export LD_LIBRARY_PATH
+fi
+eval "$*"
diff --git a/contrib/ncurses/misc/tabset/std b/contrib/ncurses/misc/tabset/std
new file mode 100644
index 000000000000..e93f737f0e35
--- /dev/null
+++ b/contrib/ncurses/misc/tabset/std
@@ -0,0 +1 @@
+ 3 1 1 1 1 1 1 1 1 1 1 1 1 1
diff --git a/contrib/ncurses/misc/tabset/stdcrt b/contrib/ncurses/misc/tabset/stdcrt
new file mode 100644
index 000000000000..66ba12f64da5
--- /dev/null
+++ b/contrib/ncurses/misc/tabset/stdcrt
@@ -0,0 +1 @@
+ 3 1 1 1 1 1 1 1 1 1 \ No newline at end of file
diff --git a/contrib/ncurses/misc/tabset/vt100 b/contrib/ncurses/misc/tabset/vt100
new file mode 100644
index 000000000000..8828d19da748
--- /dev/null
+++ b/contrib/ncurses/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/contrib/ncurses/misc/tabset/vt300 b/contrib/ncurses/misc/tabset/vt300
new file mode 100644
index 000000000000..b1f9ce16d134
--- /dev/null
+++ b/contrib/ncurses/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/contrib/ncurses/misc/tdlint b/contrib/ncurses/misc/tdlint
new file mode 100755
index 000000000000..869a34bf9222
--- /dev/null
+++ b/contrib/ncurses/misc/tdlint
@@ -0,0 +1,111 @@
+#!/bin/sh
+##############################################################################
+# Copyright (c) 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> 1996
+#
+# $Id: tdlint,v 1.4 1998/02/11 12:13:50 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
+ ;;
+ 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
+ echo -n testing $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
+#
+eval lint $OPT $FILES $LIBS
diff --git a/contrib/ncurses/misc/terminfo.src b/contrib/ncurses/misc/terminfo.src
new file mode 100644
index 000000000000..3ef04c95d389
--- /dev/null
+++ b/contrib/ncurses/misc/terminfo.src
@@ -0,0 +1,17257 @@
+######## TERMINAL TYPE DESCRIPTIONS SOURCE FILE
+#
+# This version of terminfo.src is distributed with ncurses.
+#
+# Version 10.2.1
+# $Date: 1999/08/22 00:05:28 $
+# terminfo syntax
+#
+# Eric S. Raymond (current maintainer)
+# John Kunze, Berkeley
+# Craig Leres, Berkeley
+#
+# Please e-mail changes to terminfo@ccil.org; the old termcap@berkeley.edu
+# address is no longer valid. The latest version can always be found at
+# <http://earthspace.net/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://earthspace.net/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 tac(1m), the terminfo action checker soon
+# to be distributed with ncurses.
+#
+# 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, free-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 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,
+ 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, 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, 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,
+ colors#8, ncv#3, pairs#64,
+ op=\E[39;49m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+
+# Attribute control for ECMA-48-compatible terminals
+ecma+sgr|attribute capabilities for true ECMA-48 terminals,
+ rmso=\E[27m, rmul=\E[24m,
+ use=klone+sgr,
+
+# 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, cud=\E[%p1%dB,
+ cuf=\E[%p1%dC, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+ dch=\E[%p1%dP, dispc=\E=%p1%dg, ech=\E[%p1%dX,
+ hpa=\E[%i%p1%dG, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL,
+ indn=\E[%p1%dS, rc=\E7, rin=\E[%p1%dT, rmam=\E[?7l, sc=\E7,
+ smam=\E[?7h, tbc=\E[g, vpa=\E[%i%p1%dd,
+
+#### 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 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.
+#
+ansi77|ansi 3.64 standard 1977 version,
+ am, mir,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=\E[;H\E[2J, cr=^M, 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=^M\ED, ri=\EM,
+ rmir=\E[4l, rmso=\E[m, rmul=\E[m, 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),
+ am, mir, msgr,
+ cols#80, it#8, lines#24,
+ bel=^G, cbt=\E[Z, clear=\E[H\E[J, cr=^M, 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=^J, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+ kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, tbc=\E[2g,
+ 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, indn=\E[%p1%dS, 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, rin=\E[%p1%dT, s0ds=\E(B,
+ s1ds=\E)B, s2ds=\E*B, s3ds=\E+B, tbc=\E[2g,
+ vpa=\E[%i%p1%dd, use=pcansi-m,
+
+# 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,
+ u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c,
+ u9=\E[c,
+ use=ecma+color, use=klone+sgr, use=ansi-m,
+
+#### 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
+# doen'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+sgr,
+ansi.sys|ANSI.SYS 3.1 and later versions,
+ el=\E[K, 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 PC-DOS 3.1 ANSI.SYS with keypad redefined for vi 9-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 PC-DOS Public Domain NANSI.SYS with keypad redefined for vi 9-29-86\n\E[;75;8p,
+ use=ansi.sysk,
+
+#### ANSI console types
+#
+
+#### 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, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=^M,
+ 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, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
+ el=\E[K, flash=\E[?5h\E[?5l$<200/>, 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=^J, invis=\E[8m, kb2=\E[G,
+ kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+ kend=\E[4~, 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~,
+ khome=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, kspd=^Z,
+ nel=^M^J, op=\E[m, rc=\E8, rev=\E[7m, ri=\EM, rmir=\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,
+ smso=\E[7m, smul=\E[4m, u6=\E[%i%p1%d;%p2%dR, u7=\E[6n,
+ u8=\E[?6c, u9=\E[c, vpa=\E[%i%p1%dd,
+
+#### Linux consoles
+#
+
+# 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. *
+# * *
+# ***************************************************************************
+#
+# 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 back-portable to SV curses and not supported in ncurses versions before
+# 1.9.9. All linux kernels since 1.2.13 (at least) set the screen size
+# themselves; this entry assumes that capability.
+#
+# 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>.
+linux|linux console,
+ am, bce, eo, mir, msgr, xenl, xon,
+ it#8, ncv#2,
+ 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, civis=\E[?25l\E[?1c, clear=\E[H\E[J,
+ cnorm=\E[?25h\E[?0c, cr=^M, csr=\E[%i%p1%d;%p2%dr,
+ cub1=^H, cud1=^J, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+ cuu1=\E[A, cvvis=\E[?25h\E[?8c, 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\E[?5l$<200/>, 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=^J, kb2=\E[G, kbs=\177,
+ kcbt=\E[Z, 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=^M^J, rc=\E8, rev=\E[7m, ri=\EM, 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%;%?%p7%t;8%;%?%p9%t;11%;m,
+ smir=\E[4h, smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR,
+ u7=\E[6n, u8=\E[?6c, u9=\E[c, vpa=\E[%i%p1%dd,
+ use=klone+sgr, use=ecma+color,
+linux-m|Linux console no color,
+ colors@, pairs@,
+ setab@, setaf@, setb@, setf@, use=linux,
+linux-c-nc|linux console 1.3.x hack for ncurses only,
+ ccc,
+ initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,
+ oc=\E]R,
+ use=linux,
+# From: Dennis Henriksen <opus@osrl.dk>, 9 July 1996
+linux-c|linux console 1.3.6+ with private palette for each virtual console,
+ ccc,
+ colors#8, pairs#64,
+ initc=\E]P%?%p1%{9}%>%t%p1%{10}%-%'a'%+%c%e%p1%d%;%p2%{255}%&%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}%&%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}%&%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,
+
+# 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,
+ kbs=^H, kcub1=^H, kcud1=^J,
+ use=linux, use=klone+koi8acs,
+
+# From: Matthew Vernon <mcv21@pick.sel.cam.ac.uk>
+mach|Mach Console,
+ am, km,
+ cols#80, it#8, lines#25,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\Ec, cr=^M,
+ 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, 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,
+ kbs=^H, 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, nel=^M^J, rev=\E[7m, rmso=\E[0m, sgr0=\E[0m,
+ smso=\E[7m,
+mach-bold|Mach Console with bold instead of underline,
+ rmul=\E[0m, smul=\E[1m,
+ use=mach,
+
+# 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,
+
+# 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)
+#
+# 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
+scoansi|SCO Extended ANSI standard crt,
+ am, eo, xon,
+ cols#80, it#8, lines#25,
+ blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J,
+ 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=\E[S, kbs=^H, kcub1=\E[D,
+ kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kend=\E[F, kf1=\E[M,
+ kf10=\E[V, kf12=\E[W, 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[\014kf46=\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, krdo=\E[F,
+ ri=\E[T,
+ use=klone+sgr-dumb,
+
+# 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=^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, 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,
+ indn=\E[%p1%dS, 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, rin=\E[%p1%dT, 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[2g, vpa=\E[%i%p1%dd,
+ use=klone+color,
+# (pc6300plus: removed ":KM=/usr/lib/ua/kmap.s5:"; renamed BO/EE/CI/CV -- esr)
+pc6300plus|AT&T 6300 plus,
+ 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=^M, 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=^J,
+ 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=^M^J, 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=^M, 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=^J, 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,
+
+# 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 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=^M, cub=\E[%p1%dD,
+ cub1=\E[D, 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, 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=\177,
+ kend=\E[146q, kent=^M, 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, ritm=\E[23m,
+ rmul=\E[24m, rs1=\Ec,
+ rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
+ sitm=\E[3m, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
+ use=klone+color, use=iris-ansi-ap,
+
+# 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,
+ 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+sgr,
+
+
+# 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=^M, cub1=^H, cud1=^J, 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=^J, 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[,
+
+# 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,
+
+#### 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``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz~~,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[H\E[J, cnorm=\E[?25h, cr=^M,
+ 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, indn=\E[%p1%dS,
+ is1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, kbs=\177,
+ 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, rin=\E[%p1%dT, 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,
+
+# 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,
+
+# 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=^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$<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=^J,
+ 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[6m$<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%;,
+ 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 Japenese 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,
+
+#### FreeBSD console entries
+#
+# 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.
+#
+
+# 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.
+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#5, pairs#64,
+ bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+ cr=^M, 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, 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,
+ indn=\E[%p1%dS, kb2=\E[E, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+ kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\177, 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, rev=\E[7m, ri=\E[T, rin=\E[%p1%dT,
+ rmso=\E[m, rs1=\E[x\E[m\Ec, setab=\E[4%p1%dm,
+ setaf=\E[3%p1%dm, sgr0=\E[m, smso=\E[7m, vpa=\E[%i%p1%dd,
+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-m|ansis-mono|ansi80x25-mono|freebsd console (25-line mono ansi mode),
+ colors@, pairs@,
+ bold@, dim@, op@, rmul=\E[m, setab@, setaf@, 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@, 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@, 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,
+
+#### 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,
+ 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,
+ km,
+ lines#25,
+ bel=^G, bold=\E[=15F, cr=^M, cud1=^J, dim=\E[=8F, dl1=\E[M,
+ ht=^I, il1=\E[L, ind=^J, 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=^M^J, 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-nobold|BSD/OS PC console w/o bold,
+ am, eo, km, xon,
+ cols#80, it#8, lines#25,
+ bel=^G, clear=\Ec, cr=^M, 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,
+ 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, 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=^M^J, 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+sgr, use=klone+color,
+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,
+
+# 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 VT100 and compatibles
+#
+# DEC terminals from the vt100 forward (and the vt52, way obsolete but still
+# the basis of some emulations) 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.
+#
+
+# (<acsc>/<rmacs>/<smacs> capabilities aren't in DEC's official entry -- esr)
+vt52|dec vt52,
+ cols#80, it#8, lines#24,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, clear=\EH\EJ, cr=^M, cub1=\ED, cud1=\EB, cuf1=\EC,
+ cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+ el=\EK, home=\EH, ht=^I, ind=^J, kbs=^H, kcub1=\ED, kcud1=\EB,
+ kcuf1=\EC, kcuu1=\EA, nel=^M^J, ri=\EI, rmacs=\EG, smacs=\EF,
+
+# 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.
+#
+# 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_|
+#
+# 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),
+ am, 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=^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$<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=^J, ka1=\EOq,
+ ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD,
+ kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy,
+ kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
+ kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, 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%;,
+ 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,
+vt100nam|vt100-nam|vt100 no automargins,
+ am@, xenl@, use=vt100-am,
+vt100-vb|dec vt100 (w/advanced video) & no beep,
+ bel@, flash=\E[?5h\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,
+ mir,
+ 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
+vt125|vt125 graphics terminal,
+ 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,
+ 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=^M, csr=\E[%i%p1%d;%p2%dr,
+ cub1=^H, cud1=^J, 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=^M^J, 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,
+
+# vt220:
+# 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.
+#
+vt220|vt200|DEC VT220 in vt100 emulation mode,
+ am, mir, xenl, xon,
+ cols#80, lines#24, vt#3,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, civis=\E[?25l,
+ clear=\E[H\E[2J$<50>, cnorm=\E[?25h, cr=^M,
+ 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, kdch1=\E[3~, kend=\E[4~, 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~,
+ khome=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, 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%;,
+ sgr0=\E[m$<2>, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h,
+ smso=\E[7m, smul=\E[4m,
+vt220-w|vt200-w|DEC vt220 in wide mode,
+ cols#132,
+ rs3=\E[?3h, use=vt220,
+
+#
+# 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,
+
+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,
+
+# This is misnamed (see xterm-8bit for an example of 8-bit controls)
+vt220-8|dec vt220 8 bit terminal,
+ am, mc5i, mir, msgr, xenl, xon,
+ cols#80, it#8, lines#24,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, 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,
+ 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[?1h\E F\E[?4l, kbs=^H, 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~,
+ 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~, kfnd=\E[1~, khlp=\E[28~,
+ khome=\E[H, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, krdo=\E[29~,
+ kslt=\E[4~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, mc0=\E[i,
+ mc4=\E[4i, mc5=\E[5i, nel=\EE, rc=\E8, rev=\E[7m, ri=\EM,
+ rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmso=\E[27m,
+ rmul=\E[24m, rs1=\E[?3l, sc=\E7, sgr0=\E[m, smacs=^N,
+ smam=\E[?7h, smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+
+# 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
+vt200-js|vt220-js|dec vt200 series with jump scroll,
+ am,
+ cols#80,
+ bel=^G, clear=\E[H\E[J, cr=^M, csr=\E[%i%p1%d;%p2%dr,
+ cub1=^H, cud1=^J, 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[?1l\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=^M\ED,
+ rf=/usr/lib/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, smdc=,
+ smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m$<5/>, smul=\E[4m,
+
+# 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,
+
+# 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 <thompson@xanth.magic.mb.ca> Sept 10 1995
+# (vt320: uncommented <fsl> --esr)
+vt320|vt300|dec vt320 7 bit terminal,
+ am, eslok, hs, mir, msgr, xenl,
+ cols#80, lines#24, wsl#80,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[H\E[2J, cnorm=\E[?25h, 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,
+ ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, fsl=\E[0$},
+ 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[5?l\E[?7h\E[?8h\E[1;24r\E[24;1H,
+ ka1=\EOw, ka3=\EOy, kb2=\EOu, kbs=\177, kc1=\EOq, kc3=\EOs,
+ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+ kdch1=\E[3~, kel=\E[4~, kent=\EOM, 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~,
+ khome=\E[1~, kich1=\E[2~, knp=\E[6~, knxt=^I, kpp=\E[5~,
+ kprv=\E[Z, kslt=\E[4~, mc0=\E[i, mc4=\E[?4i, mc5=\E[?5i,
+ 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[5?l\E[?7h\E[?8h\E[1;24r\E[24;1H,
+ 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$}\E[H\E[K,
+vt320-nam|vt300-nam|dec vt320 7 bit terminal with no am to make SAS happy,
+ am@,
+ is2=\E>\E[?3l\E[?4l\E[5?l\E[?7l\E[?8h\E[1;24r\E[24;1H,
+ rs2=\E>\E[?3l\E[?4l\E[5?l\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[5?l\E[?7h\E[?8h\E[1;24r\E[24;1H,
+ rs2=\E>\E[?3h\E[?4l\E[5?l\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[5?l\E[?7l\E[?8h\E[1;24r\E[24;1H,
+ rs2=\E>\E[?3h\E[?4l\E[5?l\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 latter has only 2 planes and a monochrome
+# monitor, the former 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, civis=\E[?25l, clear=\E[H\E[J,
+ cnorm=\E[?25h, 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, cvvis=\E[?25h, 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\E[?5l$<200/>, 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 F\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=^M\ED, rc=\E8, rev=\E[7m,
+ rf=/usr/share/tabset/vt300, 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,
+
+# 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 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 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, hs, mir, msgr, xenl, xon,
+ cols#80, it#8, lines#24, vt#3,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[H\E[J$<10/>, cnorm=\E[?25h, 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,
+ cvvis=\E[?25h, 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\E[?5l$<200/>, 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 F\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=^M\ED, rc=\E8, rev=\E[7m,
+ rf=/usr/share/tabset/vt300, ri=\EM, rmacs=^O,
+ 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, 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,
+
+# (vt420: I removed <kf0>, it collided with <kf10>. I also restored
+# a missing <sc> -- esr)
+vt420|DEC VT420,
+ am, mir, xenl, xon,
+ cols#80, lines#24, vt#3,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+ clear=\E[H\E[2J$<50>, cr=^M, 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/vt300, 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,
+ kdch1=\E[3~, 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~, kfnd=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+ kslt=\E[4~, 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[m, rmul=\E[m, 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%;,
+ sgr0=\E[m$<2>, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h,
+ smkx=\E=, smso=\E[7m, smul=\E[4m,
+
+#
+# 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=\177, 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=%?%p2%{19}%=%t\E\023\021%e%p2%{32}%<%t\E%p2%c%e%p2%{127}%=%t\E\177%e%p2%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=\177, 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: I added <rmam>/<smam> based on the init string, also <sc> -- esr)
+vt520|DEC VT520,
+ am, mir, xenl, xon,
+ cols#80, lines#24, vt#3,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+ clear=\E[H\E[2J$<50>, cr=^M, 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/vt300, 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,
+ kdch1=\E[3~, kf0=\E[29~, 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~, kfnd=\E[1~, kich1=\E[2~, knp=\E[6~,
+ kpp=\E[5~, kslt=\E[4~,
+ 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\\,
+ rc=\E8, rev=\E[7m$<2>, rf=/usr/share/tabset/vt300,
+ ri=\EM, rmacs=\E(B$<4>, rmam=\E[?7l, rmir=\E[4l,
+ rmsc=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+ rmso=\E[m, rmul=\E[m, 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%;,
+ sgr0=\E[m$<2>, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h,
+ smso=\E[7m, smul=\E[4m,
+
+# (vt525: I added <rmam>/<smam> based on the init string;
+# removed <rmso>=\E[m, <rmul>=\E[m, added <sc> -- esr)
+vt525|DEC VT525,
+ am, mir, xenl, xon,
+ cols#80, lines#24, vt#3,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
+ clear=\E[H\E[2J$<50>, cr=^M, 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/vt300, 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,
+ kdch1=\E[3~, kf0=\E[29~, 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~, kfnd=\E[1~, kich1=\E[2~, knp=\E[6~,
+ kpp=\E[5~, kslt=\E[4~,
+ 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\\,
+ rc=\E8, rev=\E[7m$<2>, rf=/usr/share/tabset/vt300,
+ ri=\EM, rmacs=\E(B$<4>, rmam=\E[?7l, rmir=\E[4l,
+ rmsc=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
+ rmso=\E[m, rmul=\E[m, 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%;,
+ sgr0=\E[m$<2>, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h,
+ smso=\E[7m, smul=\E[4m,
+
+#### 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 <thompson@xanth.magic.mb.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,
+
+# CRT is shareware. It implements some xterm features, including mouse.
+crt|crt-vt220|CRT 2.3 emulating VT220,
+ bce, msgr,
+ colors#8, pairs#64,
+ hts=\EH, op=\E[39;49m, setab=\E[4%p1%dm,
+ setaf=\E[3%p1%dm, setb=\E[4%p1%dm, setf=\E[3%p1%dm,
+ u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
+ use=vt220,
+
+# 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.
+teraterm|Tera Term Pro,
+ km, xon@,
+ 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, civis=\E[?25l, clear=\E[H\E[J,
+ cnorm=\E[?25h, 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\E[?5l$<200/>, hpa=\E[%i%p1%dG,
+ il=\E[%p1%dL, il1=\E[L, kdch1=\E[3~, 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~, kich1=\E[2~, knp=\E[6~,
+ kpp=\E[5~, kslt=\E[4~, op=\E[100m, rev=\E[7m, ri=\EM,
+ rmso=\E[27m, rmul=\E[24m, sgr0=\E[m, smso=\E[7m,
+ smul=\E[4m, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
+ vpa=\E[%i%p1%dd,
+ use=klone+color, use=vt100,
+
+# Tested with WinNT 4.0, the telnet application assumes the screensize is
+# 25x80. This entry uses the 'Terminal' font, to get line-drawing characters.
+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,
+ tbc@, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?6c, u9=\E[c,
+ use=vt100,
+
+#### X terminal emulators
+#
+# 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),
+ 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,
+# Compatible with the R5 xterm
+# (from the XFree86 3.2 distribution, <blink=@> removed)
+# added khome/kend, rmir/smir, rmul/smul based on the R5 xterm code - TD
+# corrected typos in rs2 string - TD
+xterm-r5|xterm R5 version,
+ am, km, msgr, xenl,
+ cols#80, it#8, lines#24,
+ 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, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
+ il=\E[%p1%dL, il1=\E[L, ind=^J, kbs=^H, kcub1=\EOD,
+ kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~,
+ kdl1=\E[31~, kel=\E[8~, kend=\E[4~, 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~, kich1=\E[2~,
+ kil1=\E[30~, kmous=\E[M, knp=\E[6~, kpp=\E[5~, 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,
+# Compatible with the R6 xterm
+# (from XFree86 3.2 distribution, <acsc> and <it> added, <blink@> removed)
+# added khome/kend - TD
+xterm-r6|xterm-old|xterm X11R6 version,
+ am, km, mir, msgr, xenl,
+ cols#80, it#8, lines#24,
+ acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ 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)0, home=\E[H, ht=^I, il=\E[%p1%dL,
+ il1=\E[L, ind=^J,
+ is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>, kbs=^H,
+ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+ kdch1=\E[3~, 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~, kfnd=\E[1~,
+ 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,
+ rmcup=\E[2J\E[?47l\E8, rmir=\E[4l, rmkx=\E[?1l\E>,
+ rmso=\E[m, rmul=\E[m,
+ rs2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>, sc=\E7,
+ sgr0=\E[m, smacs=^N, smcup=\E7\E[?47h, smir=\E[4h,
+ smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+ u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
+# 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),
+ am, bce, km, mir, msgr, xenl,
+ colors#8, cols#80, it#8, lines#24, pairs#64,
+ acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
+ clear=\E[H\E[2J, cnorm=\E[?25h, 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,
+ cvvis=\E[?25h, 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\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=^J,
+ is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>,
+ ka1=\EOw, ka3=\EOu, kb2=\EOy, kbeg=\EOE, kbs=^H, kc1=\EOq,
+ kc3=\EOs, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+ kdch1=\177, kend=\EOF, 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=\EOH, kich1=\E[2~,
+ kmous=\E[M, knp=\E[6~, kpp=\E[5~, kslt=\E[4~, meml=\El,
+ memu=\Em, op=\E[39;49m, 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[27m, rmul=\E[24m, rs1=^O,
+ rs2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\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=\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, smcup=\E7\E[?47h,
+ smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+ tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
+ vpa=\E[%i%p1%dd,
+
+# 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.
+xterm-xf86-v333|xterm terminal emulator (XFree86 3.3.3 Window System),
+ mc5i,
+ blink=\E[5m, ich1@, invis=\E[8m,
+ is2=\E[!p\E[?3;4l\E[4l\E>, kdch1=\E[3~, kend=\E[4~,
+ kfnd@, khome=\E[1~, kslt@, mc0=\E[i, mc4=\E[4i, mc5=\E[5i,
+ 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=xterm-xf86-v33,
+
+# This beta version will probably be released in XFree86 4.0.
+xterm-xf86-v40|xterm terminal emulator (XFree86 4.0 Window System),
+ ka1=\EOH, ka3=\E[5~, kb2=\EOE, kc1=\EOF, kc3=\E[6~,
+ kdch1=\177, kend=\EOF, khome=\EOH, rmcup=\E[?1049l,
+ smcup=\E[?1049h,
+ use=xterm-xf86-v333,
+
+xterm-xfree86|xterm-new|xterm terminal emulator (XFree86 4.0 Window System),
+ use=xterm-xf86-v40,
+
+# From: David J. MacKenzie <djm@va.pubnix.com>, 14 Nov 1997
+xterm-xi|xterm on XI Graphics Accelerated X under BSD/OS 3.1,
+ rmso=\E[m, rmul=\E[m,
+ use=xterm-xf86-v33,
+
+# This is one of the variants of XFree86 3.3 xterm, updated for 4.0 (T.Dickey)
+xterm-16color|xterm with 16 colors like aixterm,
+ colors#16, ncv#32, pairs#256,
+ 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,
+ use=xterm-xf86-v40,
+
+# 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),
+ am, bce, km, mc5i, mir, msgr, xenl,
+ 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?25h, cr=^M,
+ csr=\233%i%p1%d;%p2%dr, cub=\233%p1%dD, cub1=^H,
+ cud=\233%p1%dB, cud1=^J, cuf=\233%p1%dC, cuf1=\233C,
+ cup=\233%i%p1%d;%p2%dH, cuu=\233%p1%dA, cuu1=\233A,
+ cvvis=\233?25h, dch=\233%p1%dP, dch1=\233P,
+ dl=\233%p1%dM, dl1=\233M, ech=\233%p1%dX, ed=\233J,
+ el=\233K, el1=\2331K, enacs=\E(B\E)0,
+ flash=\233?5h\233?5l, home=\233H, hpa=\233%i%p1%dG,
+ ht=^I, hts=\210, ich=\233%p1%d@, il=\233%p1%dL, il1=\233L,
+ ind=^J, invis=\2338m,
+ is2=\E7\E G\233r\233m\233?7h\233?1;3;4;6l\2334l\E8\E>,
+ ka1=\217w, ka3=\217u, kb2=\217y, kbeg=\217E, kbs=^H,
+ kc1=\217q, kc3=\217s, 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=^O, rmam=\233?7l, rmcup=\233?1049l,
+ rmir=\2334l, rmkx=\233?1l\E>, rmso=\23327m, rmul=\23324m,
+ rs1=\Ec,
+ rs2=\E7\E[62"p\E G\233r\233m\233?7h\233?1;3;4;6l\2334l\E8\E>,
+ 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%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+ sgr0=\233m^O, smacs=^N, smam=\233?7h, smcup=\233?1049h,
+ smir=\2334h, smkx=\233?1h\E=, smso=\2337m, smul=\2334m,
+ tbc=\2333g, u6=\233[%i%d;%dR, u7=\E[6n, u8=\233[?1;2c,
+ u9=\E[c, vpa=\233%i%p1%dd,
+
+xterm-24|vs100|xterms|xterm terminal emulator (X Window System),
+ lines#24, use=xterm,
+
+# This is xterm for ncurses.
+xterm|xterm terminal emulator (X Window System),
+ acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ kmous=\E[M, u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
+ use=xterm-r6,
+
+# These entries allow access to the X titlebar and icon name as a status line.
+# Note that 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 it.
+xterm+sl|access X title line and icon name,
+ hs,
+ wsl#40,
+ dsl=\E]0;\007, fsl=^G, tsl=\E]0;, use=xterm,
+xterm+sl-twm|access X title line (pacify twm-descended window managers),
+ hs,
+ wsl#40,
+ dsl=\E]2;\007, fsl=^G, tsl=\E]2;, use=xterm,
+
+#
+# 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,
+ smso=\E[7m, smul=\E[1m,
+ use=xterm,
+# (kterm: this had extension capabilities ":KJ:TY=ascii:" -- esr)
+# (kterm should not invoke DEC Graphics as the alternate character set
+# -- Kenji Rikitake)
+kterm|kterm kanji terminal emulator (X window system),
+ eslok, hs,
+ acsc@, csr=\E[%i%p1%d;%p2%dr, dsl=\E[?H, enacs@, fsl=\E[?F,
+ kmous=\E[M, op=\E[39;49m, rc=\E8, rmacs@, sc=\E7, smacs@,
+ tsl=\E[?E\E[?%i%dT,
+ use=xterm-r6, use=klone+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,
+# From: Mark Sheppard <kimble@mistral.co.uk>, 4 May 1996
+xterm1|xterm terminal emulator ignoring the alternate screen buffer,
+ rmcup@, smcup@,
+ use=xterm,
+
+# This describes the capabilities of color_xterm, an xterm variant from
+# before ECMA-64 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,
+ am, km, mir, msgr, xenl,
+ colors#8, cols#80, it#8, lines#65, pairs#64,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ 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, 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=^J,
+ is1=\E[r\E[m\E[?7h\E[?4;6l\E[4l, ka1=\EOw, ka3=\EOy,
+ kb2=\EOu, kbs=^H, kc1=\EOq, kc3=\EOs, kcub1=\EOD, kcud1=\EOB,
+ kcuf1=\EOC, kcuu1=\EOA, kend=\E[8~, kent=\EOM, 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~, op=\E[39;49m, 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, 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, smacs=^N, smam=\E[?7h,
+ smcup=\E[?1;41s\E[?1;41h\E=, smir=\E[4h, smso=\E[7m,
+ smul=\E[4m,
+
+# The 'nxterm' distributed with Redhat Linux 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.
+nxterm|xterm-color|generic color xterm,
+ ncv@,
+ op=\E[m, use=xterm-r6, use=klone+color,
+
+# 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" (monochrome) and "rxvt-color".
+rxvt-basic|rxvt terminal base (X Window System),
+ am, bce, eo, km, mir, msgr, xenl, xon,
+ cols#80, it#8, lines#24,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[H\E[2J, cnorm=\E[?25h, 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,
+ cvvis=\E[?25h, 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\E[?5l, home=\E[H, ht=^I, hts=\EH,
+ ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=^J,
+ 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$, kLFT=\E[d, kNXT=\E[6$,
+ kPRV=\E[5$, kRIT=\E[c, ka1=\EOw, ka3=\EOy, kb2=\EOu, kbs=^H,
+ kc1=\EOq, kc3=\EOs, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B,
+ kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, 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~, 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=\E[7~, kich1=\E[2~,
+ kmous=\E[M, knp=\E[6~, kpp=\E[5~, kslt=\E[4~, rc=\E8,
+ rev=\E[7m, ri=\EM, rmacs=^O, rmcup=\E[2J\E[?47l\E8,
+ 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>,
+ s0ds=\E(B, s1ds=\E(0, sc=\E7, sgr0=\E[0m\017, smacs=^N,
+ smcup=\E7\E[?47h, smir=\E[4h, smkx=\E=, smso=\E[7m,
+ smul=\E[4m, tbc=\E[3g,
+rxvt|rxvt terminal emulator (X Window System),
+ colors#8, pairs#64,
+ op=\E[39;49m, setab=\E[%p1%{40}%+%dm,
+ setaf=\E[%p1%{30}%+%dm, sgr0=\E[m\017, use=rxvt-basic,
+
+# 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 (monocrome),
+ 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=^M,
+ csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\E[1D,
+ 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, 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=^J, ka1=\EOq, ka3=\EOs, kb2=\EOr,
+ kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB,
+ kcuf1=\EOC, kcuu1=\EOA, kend=\E[Y, kent=\EOM, kf0=\EOy,
+ 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, 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,
+
+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,
+ bold=\E[1m\E[43m, rev=\E[7m\E[34m, smso=\E[7m\E[31m,
+ smul=\E[4m\E[42m,
+ use=xterm+sl, use=xterm-r6,
+
+# HP ships this, 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,
+ am, da, db, mir, xhp,
+ 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=^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%{115}%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+%p5%{8}%*%+%{64}%+%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, cvvis=\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,
+
+#### 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,
+ bel=^G, bold=\E2n, civis=\E9h, clear=^L, cnorm=\Eh, cr=^M,
+ 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=^J, kbs=^H, kcub1=\E[D, kcud1=\E[B,
+ kcuf1=\E[C, kcuu1=\E[A, nel=^M^J, 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=\E197z, 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,
+
+######## 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,
+ am, da, db,
+ cols#80, lines#24, lm#0,
+ bel=^G, clear=\EL, cr=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\EG%p2%c%p1%c, cuu1=\EA, dch1=\EM, dl1=\EN, ed=\EL,
+ el=\EK, ich1=\EO, il1=\EP, ind=^J, 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,
+
+# 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=^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, el1=\E[1K, home=\E[H, ht=^I, ich=\E[%p1%d@,
+ il=\E[%p1%dL, il1=\E[L, ind=^J, rev=\E[7m,
+ rmcup=\E[2J\E[?47l\E8, rmir=\E[4l, rmso=\E[m, rmul=\E[m,
+ sgr0=\E[m, smcup=\E7\E[?47h, smir=\E[4h, smso=\E[7m,
+ smul=\E[4m,
+
+# Entries for use by the FSF's `screen' program. 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|VT 100/ANSI X3.64 virtual terminal,
+ am, km, mir, msgr, xenl,
+ colors#8, cols#80, it#8, lines#24, pairs#64,
+ acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ 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=^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=\EM,
+ cvvis=\E[34l, 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=\Eg, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@,
+ il=\E[%p1%dL, il1=\E[L, ind=^J, is2=\E)0, kbs=^H, kcub1=\EOD,
+ kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdch1=\E[3~, 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~, kich1=\E[2~, kll=\E[4~, knp=\E[6~,
+ kpp=\E[5~, 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, sc=\E7, sgr0=\E[m, smacs=^N, smir=\E[4h,
+ smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g,
+ use=ecma+color,
+
+screen-w|VT 100/ANSI X3.64 virtual terminal with 132 cols,
+ cols#132, use=screen,
+
+screen2|old VT 100/ANSI X3.64 virtual terminal,
+ cols#80, it#8, lines#24,
+ cbt=\E[Z, clear=\E[2J\E[H, cr=^M, 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=^J, 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=^M^J, 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|older VT 100/ANSI X3.64 virtual terminal,
+ 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=^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=\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=^J, 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,
+
+# 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. 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.
+#
+# 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|ncsa-vt220-8|NCSA Telnet 2.6 for Macintosh in vt220-8 mode,
+ am, hs, km, mir, msgr, xenl,
+ acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[H\E[2J, cnorm=\E[?25h, 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,
+ dsl=\E]0;\007, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0,
+ flash=\E[?5h\E[?5l, fsl=^G, home=\E[H, ht=^I, hts=\EH,
+ ich=\E[%p1%d@, if=/usr/share/tabset/vt100,
+ il=\E[%p1%dL, il1=\E[L, ind=^J,
+ 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=\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[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=^O, rmam=\E[?7l, rmcup=\E[2J\E8, rmir=\E[4l,
+ rmso=\E[27m, rmul=\E[24m,
+ rs2=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\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\017, smacs=^N, smam=\E[?7h, smcup=\E7,
+ smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[3g, tsl=\E]0;,
+ u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?62;1;6c, u9=\E[c,
+ncsa|NCSA Telnet 2.7 for Macintosh in vt220-8 mode,
+ use=ncsa-m, use=klone+color,
+ncsa-ns|NCSA Telnet 2.7 for Macintosh in vt220-8 mode,
+ hs@,
+ dsl@, fsl@, tsl@, use=ncsa,
+ncsa-m-ns|NCSA Telnet 2.6 for Macintosh in vt220-8 mode,
+ hs@,
+ dsl@, fsl@, tsl@, use=ncsa-m,
+
+#### Pilot Pro Palm-Top
+#
+# From: Jason Downs <downsj@downsj.com>, 15 Jun 1997 (Top Gun Telnet's author)
+pilot|tgtelnet|Top Gun Telnet on the Palm Pilot Professional,
+ am, xenl,
+ cols#39, lines#16,
+ bel=^G, clear=\Ec, cr=^M, cub1=^H, cud1=^J,
+ cup=\Em%p1%{32}%+%c%p2%{32}%+%c, home=\Em\s\s, ht=^I,
+ ind=^J, kbs=^H, kcub1=^H, kcud1=^J, knp=^L, kpp=^K, nel=\Em~\s,
+ rmso=\EB, smso=\Eb,
+
+######## 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=^M, cub1=^H, cud1=^J, 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=^M^J, 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,
+ am, km, mir, msgr,
+ cols#80, it#8, lines#34,
+ bel=^G, clear=^L, cr=^M, 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=^J,
+ 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, bold@, clear=^L, cr=^M, 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, ht=^I,
+ ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=^J,
+ kb2=\E[218z, kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
+ kcuu1=\E[A, kdch1=\177, 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,
+ 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%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m,
+ sgr0=\E[m, smso=\E[7m, smul@, u8=\E[1t, u9=\E[11t,
+# On a SparcStation 5, <il1>/<il> flake out on the last line.
+# Unfortunately, without them the terminal has no way to scroll.
+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,
+
+# From: <john@ucbrenoir> Tue Sep 24 13:14:44 1985
+sun-s|Sun Microsystems Workstation window with status line,
+ hs,
+ dsl=\E]l\E\\, fsl=\E\\, tsl=\E]l, use=sun,
+sun-e-s|sun-s-e|Sun Microsystems Workstation with status hacked for emacs,
+ hs,
+ dsl=\E]l\E\\, fsl=\E\\, tsl=\E]l, 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=^M, 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,
+
+#### 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),
+ am,
+ cols#80, it#8, lines#40,
+ 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=^J, 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,
+ 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),
+ 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=^M, cub1=^H, cud1=^J, cuf1=\E[C,
+ cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H,
+ ht=^I, ind=^J, kbs=^H, kcub1=^H, kcud1=^J, nel=^M^J,
+ rmso=\E[4;1m, sgr0=\E[m, smso=\E[4;2m,
+nextshell|NeXT Shell application,
+ am,
+ cols#80,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, ht=^I, kbs=^H, kcub1=^H,
+ kcud1=^J, nel=^M^J,
+
+#### Sony NEWS workstations
+#
+
+# (news-unk: this had :KB=news: -- esr)
+news-unk|SONY NEWS vt100 emulator common entry,
+ am, xenl,
+ cols#80,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
+ csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^J, 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/lib/tabset/vt100, il=\E[%p1%dL, il1=\E[L,
+ is2=\E[?7h\E[?1l\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, sc=\E7, sgr0=\E[m,
+ smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m,
+#
+# (news-29: this had :TY=ascii: --esr)
+news-29,
+ lines#29, use=news-unk,
+# (news-29-euc: this had :TY=euc: --esr)
+news-29-euc,
+ use=news-29,
+# (news-29-sjis: this had :TY=sjis: --esr)
+news-29-sjis,
+ use=news-29,
+#
+# (news-33: this had :TY=ascii: --esr)
+news-33,
+ lines#33, use=news-unk,
+# (news-33-euc: this had :TY=euc: --esr)
+news-33-euc,
+ use=news-33,
+# (news-33-sjis: this had :TY=sjis: --esr)
+news-33-sjis,
+ use=news-33,
+#
+# (news-42: this had :TY=ascii: --esr)
+news-42,
+ lines#42, use=news-unk,
+# (news-42-euc: this had :TY=euc: --esr)
+news-42-euc,
+ use=news-42,
+# (news-42-sjis: this had :TY=sjis: --esr)
+news-42-sjis,
+ use=news-42,
+#
+# NEWS-OS old termcap entry
+#
+# (news-old-unk: this had :KB=news:TY=sjis: --esr)
+news-old-unk|SONY NEWS vt100 emulator common entry,
+ am, xenl,
+ cols#80, vt#3,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J, cr=^M,
+ csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^J, 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/lib/tabset/vt100, 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, 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|sony vt100 emulator 40 lines,
+ lines#40,
+ is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;40r\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|sony vt100 emulator 42 line,
+ lines#42,
+ is2=\E[?7h\E[?1l\E[?3l\E7\E[1;42r\E8, use=news-old-unk,
+#
+# (nwp-512-o: this had :KB=nwp410:DE=^H: I interpret the latter as <OTbs>. --esr)
+nwp512-o|nwp514-o|news-o|news40-o|vt100-bm-o|sony vt100 emulator 40 lines,
+ lines#40,
+ is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;40r\E8, use=news-old-unk,
+#
+# (nwp513: this had :DE=^H: and the alias vt100-bm --esr)
+nwp513|nwp518|nwe501|newscbm|news31|sony vt100 emulator 33 lines,
+ lines#31,
+ is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;31r\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|sony vt100 emulator 33 lines,
+ lines#33,
+ is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;33r\E8, use=news-old-unk,
+#
+# (nwp513-o: had :DE=^H:, I think that's <OTbs>; also the alias vt100-bm --esr)
+nwp513-o|nwp518-o|nwe501-o|nwp251-o|newscbm-o|news31-o|sony vt100 emulator 33 lines,
+ lines#31,
+ is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;31r\E8, use=news-old-unk,
+#
+# (news28: this had :DE=^H:, I think that's <OTbs>, and :KB=nws1200: --esr)
+news28|sony vt100 emulator 28 lines,
+ lines#28,
+ is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;28r\E8, use=news-old-unk,
+#
+# (news29: this had :TY=ascii:KB=nws1200:\ --esr)
+news29|news28-a|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;29r\E8, use=news-old-unk,
+#
+# (news511: this had :TY=sjis: --esr)
+nwp511|nwp-511|nwp-511 vt100,
+ am, xenl,
+ cols#80, lines#24,
+ clear=\E[;H\E[2J$<20/>, 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/>,
+ 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,
+ 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=vt200,
+# (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,
+ dsl=\E[1$~, fsl=\E[0$},
+ is2=\E7\E[r\E8\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h,
+ tsl=\E[1$}\E[;%df,
+ use=vt200,
+
+#### 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,
+ colors#8, cols#80, it#8, lines#24, lm#0, pairs#64,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[H\E[J, cnorm=\E[?25h, 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, 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,
+ kdch1=\E[3~, 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~, khlp=\E[28~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+ kslt=\E[4~, nel=\EE, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM,
+ rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmso=\E[22;27m,
+ rmul=\E[24m, sc=\E7, setab=\E[%p1%{40}%+%dm,
+ setaf=\E[%p1%{30}%+%dm,
+ 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,
+
+#### Non-Unix Consoles
+#
+
+# 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, xenl, xon,
+ colors#16, cols#80, it#8, lines#25, pairs#64,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[1;33;44m\E[H\E[J, cnorm=\E[?25h, cr=^M, cub1=^H,
+ cud1=^J, 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\E[?5l,
+ home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, ind=^J,
+ 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, kspd=^Z, nel=^M^J, 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,
+ansi-color-2-emx|ANSI.SYS color 2,
+ am, bce, eo, mir, msgr, xenl, xon,
+ colors#16, cols#80, it#8, lines#25, pairs#64,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[0;37;44m\E[H\E[J, cnorm=\E[?25h, cr=^M, cub1=^H,
+ cud1=^J, 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\E[?5l,
+ home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, ind=^J,
+ 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, kspd=^Z, nel=^M^J, rev=\E[1;37;46m,
+ rmir=\E[4l, rmpch=\E[10m, rmso=\E[0;37;44m,
+ rmul=\E[0;37;44m, rs1=\Ec, setab=\E[4%p1%dm,
+ setaf=\E[3%p1%dm, sgr0=\E[0;37;44m, smir=\E[4h,
+ smpch=\E[11m, smso=\E[1;37;46m, smul=\E[1;36;44m,
+ tbc=\E[3g, u8=\E[?6c, u9=\E[c,
+ansi-color-3-emx|ANSI.SYS color 3,
+ am, bce, eo, mir, msgr, xenl, xon,
+ colors#16, cols#80, it#8, lines#25, pairs#64,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[0;37;40m\E[H\E[J, cnorm=\E[?25h, cr=^M, cub1=^H,
+ cud1=^J, 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\E[?5l,
+ home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, ind=^J,
+ 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, kspd=^Z, nel=^M^J, rev=\E[1;37;46m,
+ rmir=\E[4l, rmpch=\E[10m, rmso=\E[0;37;40m,
+ rmul=\E[0;37;40m, rs1=\Ec, setab=\E[4%p1%dm,
+ setaf=\E[3%p1%dm, sgr0=\E[0;10m, smir=\E[4h,
+ smpch=\E[11m, smso=\E[1;37;46m, smul=\E[0;36;40m,
+ tbc=\E[3g, u8=\E[?6c, u9=\E[c,
+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=^M^J, rev=\E[7m,
+ sgr0=\E[0m,
+
+# 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
+# <http://www.nentug.org/unix-to-nt/ntposix.htm>.
+#
+# 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=^M, cub1=^H, cud1=^J, 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,
+
+######## 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=^M, cub1=^H, cud1=\E[1B, cuf1=\E[1C,
+ cup=\E[%i%p1%d;%p2%dH, cuu1=\E[1A, dch1=\E[P, dl=\E[M,
+ ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich1=\E[@,
+ if=/usr/share/tabset/vt100, il1=\E[L, ind=^J,
+ 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=^M^J, 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=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+ dim=\EGp, dl=\ER, ed=\EY, el=\ET, home=^^, ht=^I, il1=\EE,
+ ind=^J, 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=^J, 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=^M^J, 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)
+#
+
+# Generic HP terminal - this should (hopefully) work on any HP terminal.
+hpgeneric|hp|hewlett-packard generic terminal,
+ am, da, db, mir, xhp,
+ cols#80, lines#24, lm#0, vt#6,
+ bel=^G, clear=\EH\EJ, cr=^M, cub1=^H, cud1=^J, 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=^J, 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|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|hp2621p 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|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 \E&w0f115n1I \E&w0f1n2I \E&w2f1i0d0u22l0S \E&w2f2i0d23u23l0S \E&w7f2p1I \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 \E&w0f118n1I \E&w0f1n2I \E&w2f1i0d0u23l0S \E&w3f2I \E&w7f2p1I \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=^M, cud1=^J, ht=^I, ind=^J,
+ is2=\E&v0m1a0b0c1x1y1z1i0a0b1c1x1y1z0i0S\E&j@\r\E3\r,
+ kbs=^H, kcub1=^H, kcud1=^J, nel=^M^J, rmul=\E&v0S\E&d@,
+ smul=\E&dD\E&v1S,
+ use=hp2621-nl,
+hp2627a|hp 2627 color terminal with no labels,
+ cr=^M, cud1=^J, ht=^I, ind=^J,
+ is2=\E&v0m1a1b0c1i0a1b1c2i1a0b0c0i0S\E&j@\r\E3\r,
+ kbs=^H, kcub1=^H, kcud1=^J, nel=^M^J, 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=^M, cud1=^J, ht=^I, ind=^J,
+ is2=\E&v0m1a0b0c2i1a1b0c1i0a1b1c0i0S\E&j@\r\E3\r,
+ kbs=^H, kcub1=^H, kcud1=^J, nel=^M^J,
+ 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=^M, cub1=^H, cud1=^J, 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=^J,
+ is2=\EE$<500/>, kbs=^H, kcub1=^H, kcud1=^J, nel=^M^J,
+ 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,
+ 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 %;%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=^M, cub1=^H,
+ cud1=^J, cuf1=\EC, cuu1=\EA, dch1=\EP$<2>, dim=\E&dH,
+ dl1=\EM, ed=\EJ, el=\EK, ht=\011$<2>, hts=\E1, il1=\EL, ind=^J,
+ invis=\E&dS, ip=$<2>, is1=\E&jB$<8>, nel=^M^J,
+ 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 %;%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&v1a1c5I\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, civis=\E[?25l, clear=\E[2J\E[H,
+ cnorm=\E[?25h, cr=^M, 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=^J,
+ 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,
+#
+# (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=^M, 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=^J,
+ 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 capabilites,
+ cr=^M, cud1=^J, cup=\E&a%p1%dy%p2%dC, ht=^I, ind=^J, kbs=^H,
+ kcub1=^H, kcud1=^J, nel=^M^J, 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=^M, 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=^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, 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@, smir=\EQ, smkx=\E&s1A, smln=\E&jB, smso=\E&dB,
+ smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY,
+
+# HP 236 console
+# From: <ddavis@ic.berkeley.edu>
+hp236|hp236 internal terminal emulator,
+ 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,
+ am, da, db, mir, xhp,
+ cols#128, lines#51, lm#0, xmc#0,
+ bel=^G, 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,
+ dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I,
+ if=/usr/share/tabset/stdcrt, il1=\EL, ind=^J, 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,
+ 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=^J, 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,
+ am, da, db, eo, mir, xhp,
+ cols#80, lines#21,
+ clear=\EH\EJ, 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,
+ 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=^M, cub1=^H, cud1=^J, 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=^J, invis=\E&ds,
+ 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, 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,
+# 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|HP700/41 emulating wyse30,
+ am, bw, mir, msgr,
+ cols#80, it#8, lines#24, xmc#1,
+ cbt=\EI, clear=^Z, cr=^M, 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=\177, 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: added empty <acsc> to avoid warnings re <smacs>/<rmacs> --esr)
+hp70092|hp70092a|hp70092A|HP 700/92,
+ am, da, db, xhp,
+ cols#80, lh#2, lines#24, lm#0, lw#8, nlab#8,
+ acsc=, bel=^G, blink=\E&dA, 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, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL,
+ 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, 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,
+
+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=^M, cub1=^H, cud1=\EB, cuf1=\EC,
+ cup=\E&a%dy%dC$<6/>, cuu1=\EA, dch1=\EP, dl1=\EM$<10*/>,
+ ed=\EJ, el=\EK, hpa=\E&a%dC$<6/>, ht=^I, il1=\EL$<10*/>,
+ ind=^J, kbs=^H, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA,
+ khome=\Eh, nel=^M^J, 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%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=^M, cub1=^H, cud1=^J,
+ 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=^J, nel=^M^J,
+ 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,
+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=^M, 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=^J, kbs=^H, kcub1=^Y,
+ kcud1=^K, kcuf1=^X, kcuu1=^Z, khome=^], nel=^M^J,
+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 (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=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, home=^^,
+ ind=^J,
+adm2|lsi adm2,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\E;, cr=^M, cub1=^H, cud1=^J, 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=^J,
+ kcub1=^H, kcud1=^J, kcuf1=^L, kcuu1=^K, khome=^^,
+# (adm3: removed obsolete ":ma=^K^P:" -- esr)
+adm3|lsi adm3,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^Z, cr=^M, cub1=^H, cud1=^J, ind=^J,
+# 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,
+ 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, kcub1=^H, kcud1=^J, kcuf1=^L, kcuu1=^K, rs1=^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=^M, cud1=^J, 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,
+ am, hs,
+ cols#80, lines#24,
+ bel=^G, blink=\EG2, clear=\E*, cr=^M, cub1=^H, cud1=^J,
+ 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=^J, 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=^M^J, 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,
+ am, mir,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=^Z, cr=^M, cub1=^H, cud1=^J, 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 \E1 \E1 \E1 \E1 \E1 \E1 \E1 \E1,
+ kcub1=^H, kcud1=^J, 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,
+ am,
+ cols#80, it#8, lines#24,
+ bel=^G, cbt=\EI, clear=^Z, cr=^M, 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=^M, cud1=^J, dch1=\EW, dl1=30*\ER, ed=\EY, el=\ET,
+ ich1=\EQ, il1=30*\EE, ind=^J, invis@, kbs=^H, kcub1=^H,
+ kcud1=^J, 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, cbt=\EI, clear=\E+, cr=^M, cub1=^H, cud1=^J, 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=^J, 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 conjuction 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,
+ am, mir,
+ cols#80, lines#24,
+ bel=^G, clear=\E*, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+ dl1=\ER, ed=\EY, el=\ET, home=^^, il1=\EE, ind=^J, is2=\Eu\E0,
+ kcub1=^H, kcud1=^J, 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,
+ if=/usr/lib/tabset/vt100,
+ is2=\E<\E>\E[6;?2;?7;?8h\E[4;20;?1;?3;?4;?5;?6;?18;?19l, use=vt100,
+# (adm42: removed obsolete ":ma=^K^P:" -- esr)
+adm42|lsi adm42,
+ am,
+ cols#80, lines#24,
+ bel=^G, cbt=\EI, clear=\E;, cr=^M, cub1=^H, cud1=^J, 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=^J, invis@, ip=$<6*>, kcub1=^H, kcud1=^J,
+ kcuf1=^L, kcuu1=^K, khome=^^, pad=\177, 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=^M, cub1=^H, cud1=^J,
+ 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=^J, ip=$<6*/>, kbs=^H, kcub1=^H,
+ kcud1=^J, nel=^M^J, pad=\177, 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=^M, 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, dl=\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=^J, kbs=^H, kcub1=\E[D,
+ kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E$A, nel=^M^J,
+ 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[>12l\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?)
+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=^M, cub1=^H, cud1=^J,
+ 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=^M, home=^^, ht=^I, hts=\E1,
+ ich1=\EQ, il1=\EE, ind=^J, invis@, kbs=^H, kcbt=\EI, kcub1=^H,
+ kcud1=^J, kcuf1=^L, kcuu1=^K, 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=^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$<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=^J, 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,
+ 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=^M, cub1=^H,
+ cud1=^J, 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=^M, home=^^, ht=^I,
+ hts=\E1, il1=\EE, ind=^J, is2=\EDF\EC\EG0\Er\E(\E%EX,
+ kbs=^H, kcub1=^H, kcud1=^J, 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
+#
+#
+# There are some tvi terminals that require incredible amounts of padding and
+# some that don't. I'm assuming tvi912 and tvi920 are the old slow ones, and
+# tvi912b, tvi912c, tvi920b, tvi920c are the new ones that don't need 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,
+ am, msgr,
+ cols#80, it#8, lines#24, xmc#1,
+ bel=^G, cbt=\EI, clear=^Z, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EY, el=\ET,
+ home=\E=\001\001, hpa=\E]%p1%{32}%+%c, ht=^I,
+ if=/usr/share/tabset/stdcrt, ind=^J, invis@, kbs=^H,
+ kcub1=^H, kcud1=^J, 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|old televideo 912/914/920,
+ am, msgr,
+ cols#80, it#8, lines#24, xmc#1,
+ bel=^G, clear=^Z, cr=^M, cub1=^H, cud1=^J, 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=^J, kbs=^H, kcub1=^H, kcud1=^J, 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,
+# the 912 has a <funct> key that's like shift: <funct>8 xmits "^A8\r".
+# The 920 has this plus real function keys that xmit different things.
+# Terminfo makes you use the funct key on the 912 but the real keys on the 920.
+tvi912c|tvi912b|new televideo 912,
+ dl1=\ER$<5*>, il1=\EE$<5*>, use=tvi912,
+# set to page 1 when entering curses application (\E-17 )
+# reset to page 0 when exiting curses application (\E-07 )
+tvi912-2p|tvi920-2p|tvi-2p|televideo w/2 pages,
+ rmcup=\E-07\s, smcup=\E-17\s, use=tvi912,
+# 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,
+
+# Here are the switch settings for the tvi920c:
+#
+# 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.
+#
+tvi920b|tvi920c|new televideo 920,
+ dl1=\ER$<5*>, il1=\EE$<5*>, 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,
+ use=tvi912,
+
+# 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,
+ am, hs, xenl, xhp,
+ cols#80, lines#24, xmc#0,
+ acsc=, clear=^Z, cnorm=\E.3, cr=^M, 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=^J, 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=^M^J, 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=^M, 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=^J,
+ 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=^M^J, 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=^M, 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=^J,
+ 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,
+ am, bw, hs, ul,
+ cols#80, lines#24, xmc#1,
+ bel=^G, cbt=\EI, clear=^Z, cnorm=\E.4, cr=^M, 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=^M\Eg, home=^^, ht=^I, hts=\E1,
+ ich1=\EQ, il1=\EE, ind=^J, 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=^J, 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)
+tvi950|televideo 950,
+ am, hs, mir, msgr, xenl, xon,
+ cols#80, it#8, lines#24, xmc#1,
+ acsc=b\011c\014d\re\ni\013, bel=^G, cbt=\EI, clear=\E*,
+ cr=^M, cub1=^H, cud1=^J, 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=^M, home=^^, ht=^I, hts=\E1, ich1=\EQ, il1=\EE, ind=^J,
+ invis@,
+ is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \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, 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=^^,
+ kich1=\EQ, kil1=\EE, mc4=\Ea, mc5=\E`, ri=\Ej, rmacs=^X,
+ rmir=\Er, smacs=^U, smir=\Eq, tbc=\E3, tsl=\Eg\Ef,
+ 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|televideo950 w/2 pages,
+ is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \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 \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|televideo950 w/4 pages,
+ is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \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 \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|televideo950 rev video,
+ flash=\Ed$<200/>\Eb,
+ is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \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|televideo950 rev video w/2 pages,
+ flash=\Ed$<200/>\Eb,
+ is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \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|televideo950 rev video w/4 pages,
+ flash=\Ed$<200/>\Eb,
+ is2=\EDF\EC\Eb\EG0\Er\EO\E'\E(\E%\Ew\EX\Ee \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,
+ 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 \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|televideo955 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|televideo955 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,
+ 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,
+ 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=^J,
+ 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=^M, 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=^M, home=^^, ht=^I, hts=\E1,
+ ich=\E[%p1%d@, if=/usr/share/tabset/stdcrt,
+ il=\E[%p1%dL, il1=\EE, ind=^J, indn=\E[%p1%dS, 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=^M^J,
+ 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, rin=\E[%p1%dT,
+ 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[=13.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 \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%;%?%p9%t\E$%e\E%%%;,
+ sgr0=\EG0, 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,
+
+#### 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,
+ am, da, db, msgr,
+ cols#80, it#8, lines#24,
+ bel=^G, cbt=\Ez$<4/>, clear=\EH\EJ, cr=^M, 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=^J, 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=^M^J,
+ 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=^M, cub1=^H, cud1=^J, 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=^J, kbs=^H,
+ kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome=\EH,
+ rmso=\ET, smso=\EU,
+# From: Jeff Siegal <jbs@athena.mit.edu>
+vi55|Visual 55,
+ am, mir, msgr,
+ cols#80, it#8, lines#24,
+ clear=\Ev, csr=\E_%p1%{65}%+%c%p2%{65}%+%c, cub1=^H,
+ cud1=^J, 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,
+ am, mir, msgr,
+ cols#80, it#8, lines#24,
+ acsc=, bel=^G, cbt=\Ez, clear=\Ev, cnorm=\Ec, cr=^M, cub1=^H,
+ cud1=^J, 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=^J, 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=^M, 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=^J,
+ 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=^M,
+ 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=^J,
+ 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=^M^J, 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, smir=\E[4h, smso=\E[7m, smul=\E[4m, tsl=\EP2~,
+ use=vt100,
+
+#### 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
+# <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, hs, mc5i, mir, msgr, xon,
+ cols#80, lh#1, lines#24, lw#8, ma#1, nlab#8, wsl#45,
+ acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, cbt=\EI,
+ civis=\E`0, clear=\E+$<80>, cnorm=\E`1, cr=^M, cub1=^H,
+ cud1=^J, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+ cuu1=^K, dch1=\EW$<10>, dim=\E`7\E), dl1=\ER$<1>,
+ dsl=\EF\r, ed=\EY$<80>, el=\ET, flash=\E`8$<100/>\E`9,
+ fsl=^M, 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=^J, 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=^M^J, 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, tsl=\EF,
+#
+# 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, hs, mc5i, mir, msgr, xon,
+ cols#80, lh#1, lines#24, lw#8, ma#1, nlab#8, wsl#45,
+ acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, cbt=\EI,
+ civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=^M, cub1=^H,
+ cud1=^J, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c,
+ cuu1=^K, dch1=\EW$<1>, dim=\E`7\E), dl1=\ER, dsl=\EF\r,
+ ed=\EY$<20>, el=\ET, flash=\E`8$<100/>\E`9, fsl=^M,
+ 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=^J, 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=^M^J,
+ 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, 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, hs, mc5i, mir, xon,
+ colors#8, cols#80, lh#1, lines#24, lw#8, ncv#55, nlab#8, pairs#8,
+ wsl#45, xmc#1,
+ acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2,
+ cbt=\EI, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=^M,
+ cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<1>,
+ dim=\EGp, dl1=\ER, dsl=\EF\r, ed=\EY$<20>, el=\ET,
+ flash=\E`8$<100/>\E`9, fsl=^M, 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=^J, 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=^M^J, 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, tsl=\EF,
+ use=adm+sgr,
+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=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+ dl1=\ER, dsl=\EA31, ed=\EY, el=\ET, fsl=^M, il1=\EE, ind=^J,
+ invis@, is2=\Eu\E0, kbs=^H, kcub1=^H, kcud1=^J, 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, hs, km, mc5i, mir, msgr, xon,
+ cols#80, it#8, lh#1, lines#24, lw#8, nlab#8, pb#9601, wsl#45,
+ acsc=+/\,.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+ bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<50>,
+ cnorm=\E`1, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<7>,
+ dim=\EGp, dl1=\ER$<3>, dsl=\EF\r, ed=\EY$<50>, el=\ET$<4>,
+ flash=\E`8$<100/>\E`9, fsl=^M, 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=^J, 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, tsl=\EF,
+ use=adm+sgr,
+#
+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, hs, km, mc5i, mir, msgr,
+ cols#80, lh#1, lines#24, lw#8, nlab#8, wsl#45,
+ acsc=+/\,.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+ bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<100>,
+ cnorm=\E`1, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+ dch1=\EW$<11>, dclk=\E`b, dim=\EGp, dl1=\ER$<5>, dsl=\EF\r,
+ ed=\EY$<100>, el=\ET, flash=\E`8$<100/>\E`9, fsl=^M,
+ 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=^J, 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, tsl=\EF,
+ use=adm+sgr,
+#
+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=^M,
+ 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, hs, km, mc5i, mir, msgr, xon,
+ cols#80, it#8, lines#25, wsl#46,
+ acsc='x+y.wI~_vj(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=^M, 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, dsl=\EF\r,
+ ed=\EY$<8*>, el=\ET$<8>, enacs=\Ec@1J$<2000>,
+ flash=\E\^1$<30/>\E\^0, fsl=^M, home=^^, ht=^I, il1=\EE,
+ ind=^J, 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=^J, 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, tsl=\EF,
+
+# 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, hs, km, mc5i, mir, msgr,
+ cols#80, lh#1, lines#24, lw#8, nlab#8, wsl#38,
+ acsc=+/\,.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+ bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<30>,
+ cnorm=\E`1, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<5>,
+ dclk=\E`b, dim=\EGp, dl1=\ER$<1>, dsl=\EF\r, ed=\EY$<30>,
+ el=\ET$<5>, flash=\E`8$<100/>\E`9, fsl=^M, 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=^J, 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, tsl=\EF,
+ use=adm+sgr,
+#
+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, civis=\E[?25l, clear=\E[H\E[J$<30>,
+ cnorm=\E[?25h, cr=^M, csr=\E[%i%p1%d;%p2%dr$<2>,
+ 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$<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\,\E[30l$<250>, 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, ka1=\EOw, ka3=\EOy,
+ kb2=\EOu, kbs=^H, kc1=\EOq, kc3=\EOs, kcub1=\E[D, kcud1=\E[B,
+ kcuf1=\E[C, kcuu1=\E[A, kdl1=\E[M, kel=\E[K, kent=\EOM,
+ 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,
+#
+# 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, civis=\E[?25l,
+ clear=\E[H\E[J$<110>, cnorm=\E[?25h, 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$<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\,\E[30l$<300>,
+ 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=\E[D, kcud1=\E[B,
+ kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, kent=\EOM, 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~,
+ kfnd=\E[1~, khlp=\E[28~, khome=\E[26~, kich1=\E[2~,
+ knp=\E[6~, kpp=\E[5~, kslt=\E[4~, 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,
+#
+# Wyse 85 with visual bell.
+wy85-vb|wyse85-vb|wyse 85 with visible bell,
+ bel@, flash=\E[30h\E\,\E[30l$<300>, 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\E[?3h$<70>, 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,
+#
+# 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=^M,
+ csr=\E[%i%p1%d;%p2%dr$<20>, 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,
+ 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\,\E[30l$<100>, 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, ka1=\EOw, ka3=\EOy, kb2=\EOu,
+ kbs=^H, kc1=\EOq, kc3=\EOs, kcbt=\E[Z, kcub1=\E[D,
+ kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, kent=\EOM,
+ 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~, kfnd=\E[1~, khlp=\E[28~,
+ khome=\E[26~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~,
+ kslt=\E[4~, 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,
+#
+# 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, hs, mc5i, mir,
+ cols#80, lh#1, lines#24, lw#8, nlab#8, pb#9601, wsl#45,
+ acsc=+/\,.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~,
+ bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<50>,
+ cnorm=\E`1, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<7>,
+ dim=\EGp, dl1=\ER$<3>, dsl=\EF\r, ed=\EY$<50>, el=\ET$<4>,
+ flash=\E`8$<100/>\E`9, fsl=^M, 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=^J, 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,
+ tsl=\EF,
+ use=adm+sgr,
+
+#
+# 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|wy325 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=^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$<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\,\E[30l$<300>, 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,
+#
+# 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,
+ ka1=\EOw, ka3=\EOy, kb2=\EOu, kbs=^H, kc1=\EOq, kc3=\EOs,
+ kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A,
+ kdch1=\E[3~, kent=\EOM, 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~, kfnd=\E[1~,
+ khlp=\E[28~, khome=\E[26~, kich1=\E[2~, knp=\E[6~,
+ kpp=\E[5~, kslt=\E[4~, lf1=PF1, lf2=PF2, lf3=PF3, lf4=PF4,
+ use=wy370-nk,
+#
+# 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\,\E[30l$<300>,
+ 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=^M, cub1=^H, cud1=^J, 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=^M^J, 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=^M, cub1=^H, cud1=^J, 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=^J, kcuf1=^I, kcuu1=^K,
+ nel=^M^J, 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=^M,
+ csr=\E[%i%p1%d;%p2%dr$<20>, 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,
+ 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, ka1=\EOw, ka3=\EOu, kb2=\EOy,
+ kbs=^H, kc1=\EOq, kc3=\EOs, kcbt=\E[Z, kcub1=\E[D,
+ kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, ked=\E[1~,
+ kel=\E[4~, kent=\EOM, 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~, kfnd=\E[1~,
+ khlp=\E[28~, khome=\E[26~, kich1=\E[2~, knp=\E[6~,
+ kpp=\E[5~, kslt=\E[4~, 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,
+#
+# 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\,\E[30l$<100>, 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\,\E[30l$<100>,
+ 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=\177, 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,
+ 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,
+ flash=\E[30h\E\,\E[30l$<100>,
+ 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,
+ flash=\E[30h\E\,\E[30l$<100>,
+ 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,
+ 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,
+ 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,
+ 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,
+ am,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, 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=^J,
+ is2=\E`\:\E`9\017\Er, kbs=^H, kcub1=^U, kcud1=^J, kcuf1=^F,
+ kcuu1=^Z, khome=^A, ll=^A^Z, nel=^M^J, 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,
+ cols#80, lines#24, xmc#1,
+ cbt=\EI, clear=^Z, cub1=^H, cud1=^J, 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=^J,
+ 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,
+ cols#80, lines#24,
+ clear=\EE, cub1=^H, 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=^J, 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 K3 UCB IBMPC Kermit 1.20 12-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,
+ 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 K4 MS Kermit 2.27 for the IBMPC 3-17-85\n,
+ kcub1=^H, kcud1=^J, 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 K5 MS Kermit 2.27 +automatic margins 3-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 K6 MS Kermit 2.27 UCB 227.14 IBM PC 3-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, civis=\E[?25l,
+ clear=\E[H\E[J, cmdch=\E, cnorm=\E[?25h, cr=^M,
+ csr=\E[%i%p1%d;%p1%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;%p1%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\E[?5l\E[?5h\E[?5l\E[?5h\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=^J,
+ is2=\E>\E F\E[?1l\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=^M^J, 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 F\E[4;20l\E[12h\E[?1;5;6;38;42l\E[?7;25h\E4i\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,
+# 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, civis=\E[?25l,
+ clear=\E[;H\E[2J, cnorm=\E[?25h, 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,
+ cvvis=\E[?25h, 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\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=^M\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,
+
+######## 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 idiosyncracies, 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 poition 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.)
+avatar0|avatar terminal emulator level 0,
+ am, bce, msgr,
+ cols#80, it#8, lines#25,
+ blink=^A^V\177, bold=^V^A^P, cr=^M, cub1=^V^E, cud1=^V^D,
+ cuf1=^V^F, cup=\026\010%p1%c%p2%c, cuu1=^V^C, el=^V^G,
+ ind=^J, invis=^V^A\0, rep=\031%p1%c%p2%d, rev=^A^Vp,
+ rs2=^L,
+ sgr=\026\001%{0}%?%p1%t%{112}%|%;%?%p2%t%{1}%|%;%?%p3%t%{112}%|%;%?%p4%t{128}%|%;%?%p6%t%{16}%|%;,
+ sgr0=^V^A^G, smacs=, smso=^A^Vp, smul=^V^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, civis=\E[?25l,
+ clear=^L, cnorm=\E[?25h, cr=^M, csr=\E[%i%p1%d;%p2%dr,
+ cub1=^H, cud1=^C, cuf1=^B,
+ cup=\037%p2%{32}%+%c%p1%{32}%+%c, cuu1=^^,
+ cvvis=\E[?25h, 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=^M\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,
+rbcomm-nam|IBM PC with RBcomm without autowrap,
+ am@,
+ bel=^G, cr=^M, cud1=^J, ht=^I, ind=^J,
+ is2=\017\035\E(B\E)0\E[?7l\E[?3l\E[>8g, kbs=^H,
+ kcub1=^H, kcud1=^J, nel=^M^J,
+ use=rbcomm,
+rbcomm-w|IBM PC with RBcomm in 132 column mode,
+ cols#132,
+ bel=^G, cr=^M, cud1=^J, ht=^I, ind=^J,
+ is2=\017\035\E(B\E)0\E[?7h\E[?3h\E[>8g, kbs=^H,
+ kcub1=^H, kcud1=^J, nel=^M^J,
+ use=rbcomm,
+
+######## 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=^M, 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, el1=\E[1K, home=\E[H, ht=^I, ich=\E[%p1%d@,
+ il=\E[%p1%dL, il1=\E[L, ind=^J, 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,
+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``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m, bold=\E[2;7m, clear=\E[H\E[J, cr=^M,
+ 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=^J, invis=\E[8m, is1=\E[?3l\E)0,
+ is3=\E[1;03q f1 \EOP\E[2;03q f2 \EOQ\E[3;03q f3 \EOR\E[4;03q f4 \EOS\E[5;03q f5 \EOT\E[6;03q f6 \EOU\E[7;03q f7 \EOV\E[8;03q f8 \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=^M^J,
+ pfx=\E[%p1%1d;%p2%l%2.2dq f%p1%1d %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%|%t;2%;%?%p2%p6%|%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,
+ 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=^M, csr=\E[%i%p1%d;%p2%dr,
+ cub1=^H, cud1=^J, 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=^J, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=^H,
+ kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+ kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP, kf10=\EOx,
+ kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt, kf6=\EOu, kf7=\EOv,
+ kf8=\EOl, kf9=\EOw, 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%;,
+ 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,
+
+#
+# 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,
+ 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%|%t;2%;%?%p2%p6%|%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6%|%t;7%;%?%p7%t;8%;m%?%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 F%p1%d %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,
+ cud1=\E[1B, cuf=\E[%p1%dC, cuf1=\E[1C,
+ cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, 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=^J, 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=^J, 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=^M^J,
+ pfx=\E[%p1%d;%p2%l%02dq F%p1%d %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%;,
+ 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,
+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=^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[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=^J,
+ 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,
+ 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,
+ am, xon,
+ cols#80, lines#24,
+ acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E3, bold=\E3, cbt=\EO, 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=\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=^J, 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=\E[%?%p1%t7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p6%p4%|%t;5%;%?%p5%t;0%;m,
+ 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=^M, cub1=^H, cud1=^J, 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=^J, 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=^M^J, 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=^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,
+ 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=^J, 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=^M^J,
+ 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%?%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%;,
+ 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,
+
+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=^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=\EA, 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=^J, indn=\E[%p1%dS,
+ 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=^M^J, rc=\E8, rev=\E[7m, ri=\ET, rin=\E[%p1%dT,
+ 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,
+
+# 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=^M,
+ cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=\E[1B,
+ 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=^J, 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,
+
+# 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=^M, cub=\E[%p1%dD,
+ cub1=^H, cud=\E[%p1%dB, cud1=\E[1B, 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=^J, indn=\E[%p1%dS,
+ 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,
+ rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, ri=\EM,
+ rin=\E[%p1%dT, 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,
+
+# (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=^M,
+ csr=%i\E[%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,
+ 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=^J,
+ 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 F%p1%d %p2%s,
+ pfloc=\E[%p1%d;%p2%l%d;2;0p F%p1%d %p2%s,
+ pfx=\E[%p1%d;%p2%l%d;1;0p F%p1%d %p2%s,
+ pln=\E[%p1%dp%p2%:-16s, rc=\E8,
+ rep=%p1%c\E[%p2%{1}%-%db, 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%|%t;2%;%?%p2%p6%|%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,
+
+# 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#8192, 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=^M,
+ csnm=%?%p1%{0}%=%tusascii%e%p1%{1}%=%tenglish%e%p1%{2}%=%tfinnish%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}%=%tsecurity%e%p1%{13}%=%tebcdic%e%p1%{14}%=%tapl%e%p1%{15}%=%tmosaic%;,
+ cud=\E[%p1%de, cud1=^J, 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=^M, 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, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL,
+ il1=\E[L, ind=^J, indn=\E[%p1%dS, 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=^M^J, rc=\E8, ri=\E[T, rin=\E[%p1%dT,
+ rs1=\Ec, sc=\E7,
+
+# 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|5620 terminal 88 columns,
+ am, msgr, npc, xon,
+ cols#88, it#8, lines#70,
+ bel=^G, bold=\E[2m, clear=\E[H\E[J, cr=^M, 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,
+ indn=\E[%p1%dS, 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=^J,
+ pfx=\E[%p1%d;%p2%l%dq%p2%s, rc=\E8, rev=\E[7m, ri=\E[T,
+ rin=\E[%p1%dT, rmso=\E[0m, rmul=\E[0m, rs1=\Ec, sc=\E7,
+ sgr0=\E[0m, smso=\E[7m, smul=\E[4m,
+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|5620 S layer,
+ am,
+ cols#80, it#8, lines#72,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J,
+ cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=^K, dl1=\ED,
+ el=\EK, flash=\E^G, ht=^I, il1=\EI, ind=^J, 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=^M, 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=^J, 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,
+att605-pc|ATT 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[@, il=\E[L, 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=400\E[50;0|, smsc=250\E[?11l\E[50;1|, 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, civis=\E[?25l,
+ clear=\E[H\E[J, cnorm=\E[?25h\E[?12l, cr=^M,
+ 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,
+ indn=\E[%p1%dS, 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, rin=\E[%p1%dT, 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,
+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=^M,
+ 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, civis=\E[?25l,
+ clear=\E[H\E[J, cnorm=\E[?25h\E[?12l, cr=^M,
+ 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,
+ indn=\E[%p1%dS, 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, rin=\E[%p1%dT, 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%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\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,
+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=^M,
+ 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,
+ 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=^M,
+ 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, indn=\E[%p1%dS, 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=^M,
+ 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=^M^J, pfx=\E[%p1%d;%p2%l%dq%p2%s, rc=\E8,
+ rev=\E[7m, ri=\EM, rin=\E[%p1%dT, rmir=\E[4l, rmso=\E[m,
+ rmul=\E[m, rs2=\Ec, sc=\E7,
+ sgr=\E[0%?%p2%t;4%;%?%p1%p3%|%p4%|%p5%|%t;7%;m,
+ sgr0=\E[m, smir=\E[4h, smso=\E[7m, smul=\E[4m,
+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, civis=\E[?25l,
+ clear=\E[H\E[J, cnorm=\E[?25h\E[?12l, cr=^M,
+ 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 F%p1%1d %;%p2%s,
+ pln=\E[%p1%d;0;0;0q%p2%:-16.16s, rc=\E8,
+ rep=%p1%c\E[%p2%{1}%-%db, 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,
+
+# 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, civis=\E[?25l,
+ clear=\E[H\E[J, cnorm=\E[?25h\E[?12l, cr=^M,
+ 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 SYS F%p1%:-2d %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,
+ rep=%p1%c\E[%p2%{1}%-%db, 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,
+att730-41|730MTG-41|AT&T 730-41 windowing terminal Version,
+ lines#41, use=att730,
+att730-24|730MTG-24|AT&T 730-24 windowing terminal Version,
+ lines#24, use=att730,
+att730r|730MTGr|AT&T 730 rev video windowing terminal Version,
+ 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 Version,
+ lines#41, use=att730r,
+att730r-24|730MTGr-24|AT&T 730r-24 rev video windowing terminal Version,
+ 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=^M, 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=\E2K, home=\E[H, ht=^I,
+ il=\E[%p1%dL, il1=\E[L, ind=^J,
+ 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=\E24s, kf26=\E26s,
+ 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,
+
+# 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,
+tt505-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,
+ am, bw, ul,
+ cols#80, it#8, lines#24,
+ bel=^G, cbt=\EI, clear=\E*$<75>, cr=^M, cub1=^H, cud1=^J,
+ 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=^J, 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=^M, cub1=^H, cud1=^J, 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=^J,
+ is2=\EX\EA\EF, kcub1=^H, kcud1=^J, 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,
+ 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=^M,
+ 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=^J,
+ 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=^M, cud1=^J, ind=^J,
+ 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 irrelevent 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,
+ am,
+ cols#80, lines#40,
+ bel=^G, clear=\014$<2>, cr=^M, cub1=^H, cud1=^J, 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=^J, kbs=^^, kcub1=^H,
+ kcud1=^J, 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=^M, cub1=^H, cud1=^J, cuf1=^_, cuu1=^N,
+ home=^K, ht=^I, ind=^J, kbs=^H, kcub1=^H, kcud1=^J, ll=^O\0c,
+ nel=^M^J,
+
+# 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),
+ 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=^M, 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,
+ rep=%p1%c\E[%p2%{1}%-%db, 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;%;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[2g,
+ vpa=\E[%p1%{1}%+%dd,
+
+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[%?%p1%p3%|%!%t7;%;%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m,
+ 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(0, rmacs=^N,
+ sgr=\E[%?%p1%p3%|%!%t7;%;%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m%?%p9%t\017%e\016%;,
+ smacs=^O,
+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,
+ 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[%?%p1%!%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;%?%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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^U, cud1=^J, cuf1=^F, cuu1=^Z,
+ home=\EY\s\s, ind=^J, 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%{32}%+%c%p2%p2%{6}%*%+\020%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=^J, kcuf1=^F, kcuu1=^Z, khome=^A, use=regent20,
+regent40|Adds Regent 40,
+ xmc#1,
+ bel=^G, dl1=\El$<2*>, il1=\EM$<2*>, 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=regent25,
+regent40+|Adds Regent 40+,
+ is2=\EB, use=regent40,
+regent60|regent200|Adds Regent 60,
+ dch1=\EE, is2=\EV\EB, kdch1=\EE, kich1=\EF, krmir=\EF,
+ rmir=\EF, rmso=\ER\E0@\EV, smir=\EF, smso=\ER\E0P\EV,
+ 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cnorm=\017\E0`, cr=^M, cub1=^H, cud1=^J,
+ 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=^J, is2=\017\E0`, kcub1=^U, kcud1=^J, 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(.
+vp3a+|viewpoint3a+|adds viewpoint 3a+,
+ am, bw,
+ cols#80, it#8, lines#24,
+ civis=^W, clear=\E*$<80>, cnorm=^X, cr=^M, cub1=^H, cud1=^J,
+ cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+ ed=\EY$<80>, el=\ET, home=^^, ht=^I, ind=^J, kbs=^H, kcub1=^H,
+ kcud1=^J, kcuf1=^L, kcuu1=^K, khome=^^, nel=^M^J, rmso=\E(,
+ sgr=\E0%{64}%?%p1%tQ%|%;%?%p2%t%{96}%|%;%?%p3%tP%|%;%?%p4%t%{2}%|%;%?%p5%t%{1}%|%;%?%p7%tD%|%;%c\E),
+ sgr0=\E(, smso=\E0Q\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,
+ bw, msgr, xhp,
+ cols#80, lines#24,
+ clear=\EG\Ek, cub1=^H, cud1=^J, 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=^J, kbs=^H, kcub1=^U, kcud1=^J,
+ 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\014$<1>\013@, cr=^M, cub1=^H, cud1=^J,
+ cuf1=\E^E01, cup=\013%p1%{64}%+%c\E\005%p2%2d,
+ dl1=\E\017$<13>, il1=\E\016$<13>, ind=^J, 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,
+ am,
+ cols#80, lines#24,
+ clear=\E[H\EJ, cr=^M, cub1=^H, cuf1=\E[C,
+ cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[A, ed=\EJ, el=\EK, ff=^L,
+ ind=^J, 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,
+ am, xenl,
+ cols#80, lines#24,
+ bel=^G, clear=\E[H\E[2J, cnorm=\E[V\E8, cub1=^H, 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,
+ am, mir, msgr,
+ cols#80, it#8, lines#24,
+ acsc=, clear=\E[H\E[J, cnorm=, csr=\E[%i%p1%2d;%p2%2dr,
+ 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 setable stuff to factory defaults
+# by pressing ^D in set-up mode. Then increse the brighness 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|Citoh CIT-101e (sets reverse video),
+ am, eo, mir, msgr, xenl, xon,
+ cols#80, it#8, lines#24,
+ 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=^M,
+ 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\E[?5h$<200/>,
+ 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=^J, indn=\E[%p1%dS,
+ 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=\177, 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, rin=\E[%p1%dT, 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,
+ u7=\E[6n, u8=\E[?6c, u9=\E[c,
+cit101e-n|CIT-101e w/o am,
+ am@,
+ cvvis=\E[?1l\E[?4l\E[?7l, kbs=^H, kcub1=^H, kcud1=^J, use=cit101e,
+cit101e-132|CIT-101e with 132 cols,
+ cols#132,
+ kbs=^H, kcub1=^H, kcud1=^J, 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=^J, 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,
+ mir, msgr, xon,
+ 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=^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=\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=^J, 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#32767,
+ 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^Y^X, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E1%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dl1=\EJ, ed=^X,
+ el=^V, home=^Y, il1=\EL, ind=^J,
+
+# Assorted CDC terminals from BRL (improvements by DAG & Ferd Brundick)
+cdc721|CDC Viking,
+ 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=^J, kcuf1=^I,
+ kcuu1=^W, khome=^Y,
+cdc721ll|CDC Vikingll,
+ 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=^J, kcuf1=^I,
+ kcuu1=^W, khome=^Y,
+# (cdc752: the BRL entry had :ll=\E1 ^Z: commented out
+cdc752|CDC 752,
+ am, bw, xhp,
+ cols#80, lines#24,
+ bel=^G, clear=\030\E1\s\s, cr=^M, cub1=^H, cud1=^J, cuf1=^U,
+ cup=\E1%p2%{32}%+%c%p1%{32}%+%c, cuu1=^Z, el=^V,
+ home=\E1\s\s, ind=^J, 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,
+ am, bw,
+ cols#80, lines#24,
+ bel=^G, clear=^Y^X, cr=^M, cub1=^H, cud1=^J, 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=^J,
+ kbs=^H, kcub1=^H, kcud1=^J, 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=\031\030\002\003\017,
+#
+# 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,
+ am, bw, msgr, xon,
+ 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 =\036\022Z\036\011C1-` `!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=\017\025\035\036E\036\022\\, 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=^M,
+ 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\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=^J, 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=\177,
+ 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=^M^J, 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 z"\Ev\001\177 !p\E ;"\E z \Ev \001\177p\Ep\n,
+ rmcup=\Ev \001\177p\Ep\r\n,
+ use=c108-4p,
+c108-4p|concept108-4p|concept 108 w/4 pages,
+ eslok, hs, xon,
+ pb@,
+ acsc=jEkTl\\mMqLxU, cnorm=\Ew, cr=^M,
+ 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=^J, 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,
+ 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=^J, 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=^J, 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@ \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|c100 rev 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
+# strikethru, 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 "auxilliary 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, mc5i, mir, msgr, xenl, xon,
+ 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=^M,
+ 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$\177, 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=\177, kent=^M, 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,
+ mc0=\E[i, mc4=\E[4i, mc5=\E[5i, 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,
+
+# <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,
+ 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=^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,
+ 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=\E8m, 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^B\r, ked=\E^D\r, kf1=\EOP, kf2=\EOQ, kf3=\EOR,
+ kf4=\EOS, khome=\E[H, kich1=\E^A\r, kil1=\E^C\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, rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m,
+ ri=\EM$<4>, rmacs=\016$<1>, rmcup=\E[w\E2\r\n, rmir=\E4l,
+ 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;%;m,
+ sgr0=\E[m, smacs=\017$<1>, smcup=\E[=4l\E[1;24w\E2\r,
+ smir=\E1, smkx=\E[1!z\E[0;3u, smso=\E[7m, smul=\E[4m,
+ tbc=\E[2g, vpa=\E[%p1%{1}%+%dd,
+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|avt w/80 columns,
+ use=avt+s, use=avt-ns,
+avt-rv|avt-rv-s|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|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=^M, cub1=^H, cud1=^J, 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=^J, 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#256,
+ 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#256,
+ 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#256,
+ 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%{256}%*%{1001}%/%02X%p3%{256}%*%{1001}%/%02X%p4%{256}%*%{1001}%/%02X%p5%{256}%*%{1001}%/%02X%p6%{256}%*%{1001}%/%02X%p7%{256}%*%{1001}%/%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%{256}%*%{1001}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c%p3%{256}%*%{1001}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c%p4%{256}%*%{1001}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c%p5%{256}%*%{1001}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c%p6%{256}%*%{1001}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c%p7%{256}%*%{1001}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c,
+ oc=\036RG01\:00??00000000\036RG01;00000000??00\036RG01<007?00000000\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=^M, cub1=^Y, cud1=^Z, cuf1=^X,
+ cup=\020%p2%c%p1%c, cuu1=^W, dim=^\, el=^K, ind=^J, is1=^R^C,
+ mc0=^Q, nel=^J, 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,
+ am, bw,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^Y, cud1=^Z, cuf1=^X,
+ cup=\020%p2%c%p1%c, cuu1=^W, el=^K, home=^H, ind=^J,
+ 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=^J, 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,
+ clear=\E[2J, cud1=\E[B, 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=^M^Z, rmcup=^L,
+ rmso=\036E$<\0/>, smcup=^L^R, smso=\036D$<5/>,
+ use=dg200,
+# dg450 from cornell
+dg450|dg6134|data general 6134,
+ cub1@, cuf1=^X, use=dg200,
+# 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:"
+# fixed garbled ":k9=\E[00\:z:" capability -- esr)
+dg460-ansi|Data General Dasher 460 in ANSI-mode,
+ am, msgr, ul,
+ cols#80, it#8, lines#24,
+ 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[010z, khome=\E[H, lf0=f1, lf1=f2, lf2=f3, lf3=f4,
+ lf4=f5, lf5=f6, lf6=f7, lf7=f8, lf9=f10, rev=\E[7m, ri=\E[T,
+ rmso=\E[m, rmul=\E[05, sgr0=\E[m, smso=\E[7m, smul=\E[4m,
+# From: Wayne Throop <mcnc!rti-sel!rtp47!throopw>
+# 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,
+ am, bw, ul,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cnorm=^L, cr=^M, 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=^P\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=\017\025\035\036E, 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=^M,
+ 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=^J, is1=\E[<0;<1;<4l,
+ ll=\E[H\E[A, nel=^J, rev=\E[7m, rmso=\E[m, rmul=\E[m,
+ sgr=\E[%?%p1%p3%|%p6%|%t7;%;%?%p4%t5;%;%?%p2%p6%|%t4;%;%?%p1%p5%|%t2;%;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=^J,
+ is1=\022\003\036P@1, is3=\036Fz0, 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=\036F?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%t11%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=\036Fz2, 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=\036FQ2, 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=^M^J,
+ rev=\E[7;50m, rmkx=\E[2;1v, rmso=\E[50m, rmul=\E[50m,
+ sgr=\E[50%?%p1%p3%|%p6%|%t;7%{1}%e%{0}%;%PR%?%p4%t;5%{1}%e%{0}%;%PB%?%p2%p6%|%t;4%{1}%e%{0}%;%PU%?%p1%p5%|%t;2%{1}%e%{0}%;%PDm\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=\036FQ0,
+ cnorm=\036FQ2, 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=\036FG\027, 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=\017\025\035\036E\036O, 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%p3%|%p6%|%t7;%;%?%p4%t5;%;%?%p2%p6%|%t4;%;%?%p1%p5%|%t2;%;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%p3%|%p6%|%t7;%;%?%p4%t5;%;%?%p2%p6%|%t4;%;%?%p1%p5%|%t2;%;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%e00%;,
+ 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=\036FQ0, clear=^^FE, cnorm=\036FQ5,
+ 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=\036P@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=\036Fz2,
+ 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[%?%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}%;%PDm\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[%?%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}%;%PDm%?%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 in 1993.
+# As of early 1996, at least one company called `Datamedia' has been taken
+# over by:
+#
+# Axent Technologies, Inc.
+# 2400 Research Boulevard
+# Rockville, Maryland 20850
+# voice: +1 301/258-5043
+# fax: +1 301/330-5756
+# email: <info@axent.com>
+#
+# makers of OmniGuard client/server security software. They are a software
+# only company and no longer make terminals. However, the operator there
+# told me that she had once spoken to a customer looking for Datamedia
+# terminals who'd mentioned a Datamedia in New Jersey. This is backed up
+# by comp.terminals posting describing the ID plate on the back of a
+# "Datamedia 3000" terminal. Was this an earlier incarnation of Axent?
+# Inquiring minds want to know...
+#
+
+cs10|colorscan|Datamedia Color Scan 10,
+ msgr,
+ cols#80, lines#24,
+ bel=^G, clear=\E[H\E[J, cr=^M, cub1=^H, cud1=^J, cuf1=\E[C,
+ cup=\E[%i%p1%02d;%p2%02dH, cuu1=\E[A, ed=\E[J, el=\E[K,
+ ind=^J, 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,
+ am, xenl,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, cuf1=^\,
+ cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+ home=^Y, ht=^I, ind=^J, kcub1=^H, kcud1=^J, 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,
+ cols#80, lines#24,
+ bel=^G, clear=^^^^\177, cub1=^H, cud1=^J, 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=^J, 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,
+ km,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=\EM$<2>, cr=^M, cub1=^H, cud1=^J, 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=^J, ip=$<6>,
+ is2=\EQ\EU\EV, rmdc=\EQ, rmir=\EQ, rmso=\EO0, smdc=\EP,
+ smir=\EP, smso=\EO1,
+dm3045|datamedia 3045a,
+ 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=\177, 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=^J, 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, smso=\E[7m, smul=\E[4m,
+ use=vt100,
+# 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=^J,
+ 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 <thompson@xanth.magic.mb.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=^M,
+ 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=^J,
+ 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=^J, 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=^J, 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=^J,
+ 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,
+ am,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=\E*, cr=^M, cub1=^H, cud1=^J, 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=^J, is2=\Eu\E3, kcub1=^H, kcud1=^J, 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,
+ am, da, db, mir, msgr, ul,
+ cols#80, it#8, lines#24,
+ bel=^G, cbt=\EI, clear=\E*, cr=^M, 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=^J, 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=^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$<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=^J, is1=\E~)\E~ea,
+ ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn,
+ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM,
+ kf0=\EOy, kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS,
+ kf5=\EOt, kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, 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%;,
+ 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,
+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=^M,
+ cub1=^H, cud1=^J, 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=^J, 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=^M, 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|freedom model 100,
+ am, bw, hs, mir, msgr, xon,
+ cols#80, lines#24,
+ acsc=, bel=^G, cbt=\EI, clear=^Z, cr=^M, cub1=^H, cud1=^J,
+ 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=^M, home=^^, hpa=\E]%p1%{32}%+%c,
+ ht=^I, hts=\E1, il1=\EE$<8.5*>, ind=^J, 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|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,
+ cvvis=\E.2, 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,
+ 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=^M,
+ csr=\Em0%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, dim=\EG@, dl1=\ER, dsl=\Ef\r, ed=\EY,
+ el=\ET, flash=\Eo$<200/>\En, fsl=^M, home=^^,
+ hpa=\E]%p1%{32}%+%c, hts=\E1, il1=\EE, ind=^J, 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=^J, 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,
+ cols#80, it#8, lines#24,
+ clear=\E[H\E[2J$<10/>, cub1=^H, 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,
+ 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=^J, 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,
+ 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=^J, 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 \EP$<3> \EO\ER\EA$<3>,
+ ind=^J, 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, kf1=\Ep, kf2=\Eq, kf3=\Er, kf4=\Es, kf5=\Et, kf6=\Eu,
+ kf7=\Ev, kf8=\Ew, 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,
+sbi|superbee|beehive superbee at Indiana U.,
+ xsb,
+ cr=\r$<1>, il1=1\EN\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 super bee,
+ am, da, db, xsb,
+ cols#80, it#8, lines#25,
+ clear=\EH\EJ$<3>, cnorm=^J, cr=\r$<1000>, cub1=^H, cud1=^J,
+ 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, kf1=\Ep, kf2=\Eq,
+ kf3=\Er, kf4=\Es, kf5=\Et, kf6=\Eu, kf7=\Ev, kf8=\Ew,
+ khome=\EH, rmso=\E_3, sgr0=\E_3, smso=\E_1, tbc=\E3,
+# This loses on lines > 80 chars long, use at your own risk
+superbeeic|super bee with insert char,
+ ich1=, rmir=\ER, smir=\EQ, use=superbee-xsb,
+sb2|sb3|fixed superbee,
+ xsb@, use=superbee,
+
+# 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,
+ 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,
+ am,
+ cols#80, it#8, lines#20,
+ bel=^G, clear=^E^R, cr=^M, cub1=^H, cud1=^J, cuf1=^L, cuu1=^K,
+ dl1=\021$<350>, ed=^R, el=^P, home=^E, ht=^I, hts=^F,
+ il1=\023$<160>, ind=^J, ll=^E^K, rmso=\s^_, smso=^]\s,
+beehive4|bh4|beehive 4,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\EE, cr=^M, cub1=\ED, cud1=^J, cuf1=\EC,
+ cuu1=\EA, ed=\EJ, el=\EK, home=\EH, ind=^J,
+microb|microbee|micro bee series,
+ am,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=\EE, cr=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\EF%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+ el=\EK, ht=^I, ind=^J, kcub1=\ED, kcud1=\EB, kcuf1=\EC,
+ kcuu1=\EA, kf1=\Ep, kf2=\Eq, kf3=\Er, kf4=\Es, kf5=\Et,
+ kf6=\Eu, kf7=\Ev, kf8=\Ew, kf9=\Ex, khome=\EH, rmso=\Ed@,
+ rmul=\Ed@, sgr0=\Ed@, smso=\s\EdP, smul=\Ed`,
+
+# 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=^J, kf6=^T, kf7=^H,
+ kf8=\177, 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"8F75021B7383#\E"8F851BD7#\E"8F95021B7083#\E"8FA5021B7183#\E"8FB5021B7283#,
+ kf1=\002\Ep\003, kf10=\Ej, kf11=\EW, kf12=\002\E{\003,
+ kf13=\002\E|\003, kf14=\002\E}\003, kf15=\002\E~\003,
+ kf16=\002\E\177\003, kf2=\002\Eq\003, kf3=\002\Er\003,
+ kf4=\002\Es\003, 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,
+ cols#80, lines#12,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, cuf1=\s, home=^K,
+ ind=^J,
+# From: <cbosg!ucbvax!pur-ee!cincy!chris> Thu Aug 20 09:09:18 1981
+hz1420|hazeltine 1420,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\E^\, cr=^M, cub1=^H, cud1=^J, 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=^J, 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,
+ am, hz,
+ cols#80, lines#24,
+ bel=^G, clear=~^\, cr=^M, 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=^J, kcub1=^H, kcud1=^J, 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\E^\, cr=^M, 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=^J,
+# 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,
+ am, bw, msgr,
+ cols#80, lines#24,
+ bel=^G, bold=\E^_, clear=\E^\, cr=^M, cub1=^H, cud1=^J,
+ 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=^J, 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,
+ am, hz,
+ cols#80, lines#24,
+ bel=^G, clear=~^\, cr=^M, 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=^J, 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,
+ cud1=^J, dl1=\EO, il1=\EE, kf1=\EP, kf2=\EQ, kf3=\ER, lf1=blue,
+ lf2=red, lf3=green,
+ use=vt52,
+hz1552-rv|hazeltine 1552 reverse video,
+ cud1=^J, rmso=\ET, smso=\ES, use=hz1552,
+# Note: h2000 won't work well because of a clash between upper case and ~'s.
+hz2000|hazeltine 2000,
+ am,
+ cols#74, lines#27,
+ bel=^G, clear=~\034$<6>, cub1=^H, cud1=^J,
+ cup=~\021%p2%c%p1%c, dl1=~\023$<6>, home=~^R,
+ il1=~\032$<6>, ind=^J, pad=\177,
+# 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,
+ am, bw,
+ cols#80, lines#24,
+ bel=^G, cbt=\E^T, clear=\E^\, cr=^M, 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=^J, is2=\E?, kbs=^H,
+ kcub1=^H, kcud1=\E^K, kcuf1=^P, kcuu1=\E^L, kf0=^B0^J,
+ kf1=^B1^J, kf2=^B2^J, kf3=^B3^J, kf4=^B4^J, kf5=^B5^J,
+ kf6=^B6^J, kf7=^B7^J, kf8=^B8^J, kf9=^B9^J, 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,
+ am, hz,
+ cols#80, lines#24,
+ bel=^G, cbt=~^T, clear=~^\, cr=^M, cub1=^H, cud1=~^K, cuf1=^P,
+ cup=~\021%p2%c%p1%c, cuu1=~^L, dl1=~^S, home=~^R, il1=~^Z,
+ ind=^J, 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,
+ am,
+ 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=^M, csr=\E[%i%p1%d;%p2%dr,
+ cub1=^H, cud1=^J, 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=^M^J, el=^M, home=^M,
+
+ibm3101|i3101|IBM 3101-10,
+ am, xon,
+ cols#80, lines#24,
+ bel=^G, clear=\EK, cr=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+ el=\EI, home=\EH, hts=\E0, ind=^J, kcub1=\ED, kcud1=\EB,
+ kcuf1=\EC, kcuu1=\EA, nel=^M^J, 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
+# I've commented out or translated some IBM extensions.
+ibm3161|ibm3163|wy60-316X|wyse60-316X|IBM 3161/3163 display,
+ am, mir, msgr,
+ 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=^M, 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, ind=^J,
+ 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, kend=\E2, 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,
+ knp=\EI, kpp=\EL, 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,
+ibm3162|IBM 3162 display,
+ blink=\E4$a, bold=\E4(a, il1=\EN, invis=\E40a, rev=\E4!a,
+ rmso=\E4>b, rmul=\E4=b, sgr0=\E4@, smso=\E4!a, smul=\E4"a,
+ use=ibm3161-C,
+
+ibm3164|i3164|IBM 3164,
+ msgr,
+ colors#8, pairs#64,
+ rmcup=\E!9(N\E>B, s0ds=\E>B, s1ds=\E>A,
+ setb=\E4 %p1%{64}%+%c,
+ setf=\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[2J, cr=^M,
+ 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, 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,
+ indn=\E[%p1%dS, 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, kf0=\E[010q, 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, rc=\E[u, rev=\E[7m, ri=\E[T,
+ rin=\E[%p1%dT, rmir=\E[4l, rmso=\E[m, rmul=\E[m, rs2=\Ec,
+ sc=\E[s,
+ 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,
+
+ibmaed|IBM Experimental display,
+ 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=^M, cud1=^J, ht=^I, ind=^J, kbs=^H, kcub1=^H, kcud1=^J,
+ nel=^M^J,
+ use=ibmmono,
+ibm5154|IBM 5154 Color display,
+ colors#8, pairs#64,
+ bold@, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=ibm5151,
+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=^M, cud1=^J, ht=^I, ind=^J, kbs=^H, kcub1=^H, kcud1=^J,
+ nel=^M^J,
+ use=ibmega-c,
+ibmvga|IBM VGA display,
+ cr=^M, cud1=^J, ht=^I, ind=^J, kbs=^H, kcub1=^H, kcud1=^J,
+ nel=^M^J,
+ 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%;%?%p4%t;5%;%?%p6%t;12%;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%;%?%p4%t;5%;%?%p6%t;12%;m,
+ sgr0=\E[0;10m,
+ use=ibm5151,
+ibm6153-90|IBM 6153 Black & White display,
+ cols#90, lines#36,
+ blink@, bold@, use=ibm5151,
+ibm6153-40|IBM 6153 Black & White display,
+ 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[2J, cub1=\E[D, cud1=^J, 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,
+hft-c-old|HFT with Color PC850,
+ colors#8, pairs#64,
+ setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=ibm5151,
+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=^J,
+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=^M, cud1=^J, dsl=\Ej\EYI \EI\Ek, fsl=\Ek, ht=^I, ind=^J,
+ kbs=^H, kcub1=^H, kcud1=^J, nel=^M^J, tsl=\Ej\EYI%+ \Eo,
+ use=ibmega-c,
+
+#
+# AIX entries. IBM ships these with AIX 3.2.5.
+# AIX extension caps are commented out,
+# except for box1 which has been translated to an <acsc> string.
+#
+aixterm|IBM Aixterm Terminal Eemulator,
+ eslok, hs,
+ acsc=jjkkllmmnnqqttuuvvwwxx, bold=\E[1m, dsl=\E[?E,
+ fsl=\E[?F, ri@, s0ds=\E(B, s1ds=\E(0,
+ sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;m,
+ sgr0=\E[0;10m\E(B, tsl=\E[?%p1%dT,
+ use=ibm6154,
+aixterm-m|IBM AIXterm Monochrome Terminal Emulator,
+ eslok, hs,
+ acsc=jjkkllmmnnqqttuuvvwwxx, bold=\E[1m, dsl=\E[?E,
+ fsl=\E[?F, ri@, s0ds=\E(B, s1ds=\E(0,
+ sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m,
+ sgr0=\E[0;10m\E(B, tsl=\E[?%p1%dT,
+ use=ibm6153,
+aixterm-m-old|old IBM AIXterm Monochrome Terminal Emulator,
+ eslok, hs,
+ bold=\E[1m, dsl=\E[?E, fsl=\E[?F, ri@,
+ sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m,
+ tsl=\E[?%p1%dT,
+ use=ibm6153,
+jaixterm|IBM Kanji Aixterm Terminal Eemulator,
+ acsc@, use=aixterm,
+jaixterm-m|IBM Kanji AIXterm Monochrome Terminal Emulator,
+ acsc@,
+ use=aixterm-m,
+
+#### 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),
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, 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=^J, rmso=\Ea, smso=\Eb,
+i400|infoton 400,
+ am,
+ cols#80, lines#25,
+ bel=^G, clear=\E[2J, cr=^M, cub1=^H, cud1=^J, cuf1=\E[C,
+ cup=%i\E[%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=^J, rmir=\E[4l\E[0Q, smir=\E[4h\E[2Q,
+# (addrinfo: removed obsolete ":bc=^Z:" -- esr)
+addrinfo,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^Z, cud1=^J, cuf1=^Y,
+ cup=\037%p1%{1}%-%c%p2%{1}%-%c, cuu1=^\, ed=^K, home=^H,
+ ind=^J, ll=^H^\,
+# (infoton: used to have the no-ops <lh#0>, <lw#0>, <nlab#0> -- esr)
+infoton,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^Z, cud1=^J, cuf1=^Y, cuu1=^\,
+ ed=^K, ind=^J, 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 Horiz 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,
+ am, hs,
+ cols#80, lines#24,
+ bel=^G, blink=\E[2ZZ, cbt=\EI, civis=\E.0, clear=\E*,
+ cnorm=\E.3, cr=^M,
+ csr=\E!%+%p1%{32}%+%p2%{32} cud1=\026, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{80}%m%{32}%+%c%p2%{80}%>%{32}%+%c,
+ cuu1=^K, cvvis=\E.1, dch=\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%{4}%|%;%?%p2%t%{8}%|%;%?%p3%t%{4}%|%;%?%p4%t%{2}%|%;%?%p7%t%{1}%|%;ZZ,
+ 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,
+ am,
+ cols#80, it#8, lines#24, xmc#1,
+ bel=^G, cbt=^Y, clear=\014$<132>, cr=^M, cub1=^H, cud1=^J,
+ 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=^J, ip=$<5.5*>, kbs=^H,
+ kcub1=^_, kcud1=^J, 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=^M, 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,
+ am, bw, msgr,
+ cols#80, it#8, lines#24, xmc#1,
+ cbt=\EI, clear=\E*, cub1=^H, cud1=^J, 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=^J, 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=^M, 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,
+ 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=^M, 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=^M,
+ home=^^, ht=^I, ich1=\EQ, il1=\EE, ind=^J,
+ 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=^M^J, 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=^M, cub1=^H, cud1=^J, 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=^J, 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=^]\344, clear=\014$<20>,
+ cnorm=^]\342, cr=^M, cub1=^H, cud1=^J, 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=^]\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=^J, 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=^]\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 ANSII mode,
+ am, bw, hs, mc5i, 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=^M, csr=\E[%i%p1%d;%p2%d%%v,
+ 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, 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=^J,
+ 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, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, nel=^M^J,
+ 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 F\E[3g\E[9;17;25;33;41;49;57;65;73 N,
+ sc=\E[%y,
+ sgr=\E[%{0}%?%p1%p3%|%t%{4}%+%;%?%p2%t%{2}%+%;%?%p4%t%{1}%+%;%?%p6%t%{8}%+%;%?%p8%t%{32}%+%;%d%%{%?%p9%t\016%e\017%;,
+ sgr0=\E[0m, smir=\E[4h, smso=\E[7m, smul=\E[4m, tbc=\E[2g,
+ tsl=\E[%i%p1%d%%}, vpa=\E[%i%p1%dd,
+
+# 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 ANSII mode
+# ---------------------------
+#
+# See p9 definition.
+#
+prism14|p14|P14|MDC Prism-14 in ANSII 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=^M, cub1=^U, cud1=^J, 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=^J, invis=^CH, kbs=^H, kcub1=^U,
+ kcud1=^J, 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=^J^M,
+ 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\014$<12/>, cr=^M, 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=^J, 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,
+ am,
+ cols#80, it#8, lines#24, vt#9,
+ bel=^G, clear=^]^C, cr=^M, cub1=^H, cud1=^J, 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=^J, 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),
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\EL, cr=^M, cub1=^H, cud1=^J, 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=^J, ip=$<2>, is2=\E), kcub1=^H, kcud1=^J,
+ 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),
+ cols#80, it#8, lines#24,
+ bel=^G, clear=\EL, cr=^M, cub1=^H, cud1=^J, 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=^J, 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=^M, cub1=^H, cud1=^J, 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=^J, is2=\E\,,
+ kbs=^H, kcub1=^H, kcud1=^J, kcuu1=^K, nel=^M^J,
+# 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=^M,
+ 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=^M, 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, il=\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 basicly 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=ncr260vt300an,
+# The Intecolor emulation of the NCR 2900/260C color terminal is basicly a
+# DEC vt200/300 with color capabilities added.
+ncr260intwan|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=ncr260vt300wan,
+# The Intecolor emulation of the NCR 2900/260C color terminal is basicly 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 basicly a
+# DEC vt200/300 with color capabilities added.
+ncr260intwpp|NCR Intecolor emulation of the 2900_260C with a PC+ keyboard in 132 column mode,
+ 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, hs, 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>,
+ cvvis=\E`5, dch1=\EW$<2>, dim=\EGp, dl1=\El$<2>, dsl=\E`c,
+ ed=\Ek$<2>, el=\EK$<2>, fsl=^M, 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=^J, 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=\002%^M, kf22=^B&\r, kf23=^B'\r,
+ kf24=^B(\r, kf25=^B)\r, kf26=^B*\r, kf27=^B+\r,
+ kf28=^B\,\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, 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 kybd,
+ am, hs, mir, msgr, xenl, xon,
+ cols#80, lines#24, nlab#32,
+ acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+ blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[2J\E[1;1H$<20>, cnorm=\E[?25h, 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>, dsl=\E[0$~\E[1$~,
+ ech=\E[%p1%dX, ed=\E[0J$<5>, el=\E[0K$<3>, el1=\E[1K$<3>,
+ fsl=\E[0$}, 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>,
+ ka1=\EOw, ka3=\EOu, kb2=\EOy, kbs=^H, kc1=\EOq, kc3=\EOs,
+ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+ kdch1=\E[3~, kent=\EOM, kf1=\EOP, kf2=\EOQ, kf3=\EOR,
+ kf4=\EOS, kfnd=\E[1~, khlp=\E[28~, kich1=\E[2~, knp=\E[6~,
+ kpp=\E[5~, krdo=\E[29~, kslt=\E[4~, 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%;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,
+ tsl=\E[2$~\E[1$}, vpa=\E[%p1%dd$<40>,
+ncr260vt100wan|NCR 2900_260 vt100 wide mode ansi kybd,
+ 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+ kybd,
+ 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+ kybd,
+ 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 kybd,
+ am, hs, mir, msgr, xenl, xon,
+ cols#80, lines#24, nlab#32,
+ acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+ blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[2J\E[1;1H$<20>, cnorm=\E[?25h, 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>, dsl=\E[0$~\E[1$~,
+ ech=\E[%p1%dX$<5>, ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>,
+ fsl=\E[0$}, 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>,
+ ka1=\EOw, ka3=\EOu, kb2=\EOy, kbs=^H, kc1=\EOq, kc3=\EOs,
+ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+ kdch1=\E[3~, kent=\EOM, kf0=\EOy, 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~, 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~, kfnd=\E[1~, khlp=\E[28~,
+ kich1=\E[2~, knp=\E[6~, kpp=\E[5~, krdo=\E[29~, kslt=\E[4~,
+ 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%;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, tsl=\E[2$~\E[1$}, vpa=\E[%p1%dd$<40>,
+ncr260vt200wan|NCR 2900_260 vt200 wide mode ansi kybd,
+ 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+ kybd,
+ 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+ kybd,
+ 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 kybd,
+ am, hs, mir, msgr, xenl, xon,
+ cols#80, lines#24, nlab#32,
+ acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G,
+ blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[2J\E[1;1H$<20>, cnorm=\E[?25h, 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>, dsl=\E[0$~\E[1$~,
+ ech=\E[%p1%dX$<5>, ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>,
+ fsl=\E[0$}, 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>,
+ ka1=\EOw, ka3=\EOu, kb2=\EOy, kbs=^H, kc1=\EOq, kc3=\EOs,
+ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+ kdch1=\E[3~, kent=\EOM, kf0=\EOy, 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~, 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~, kfnd=\E[1~, khlp=\E[28~,
+ kich1=\E[2~, knp=\E[6~, kpp=\E[5~, krdo=\E[29~, kslt=\E[4~,
+ 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%;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, tsl=\E[2$~\E[1$}, vpa=\E[%p1%dd$<40>,
+ncr260vt300wan|NCR 2900_260 vt300 wide mode ansi kybd,
+ 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;1H$<200>,
+ rs2=\E[!p\E[?3;7;19;67h\E[?4l\E[1;0%w\E(B\E)0\017\E[2J\E[1;1H$<200>,
+ use=ncr260vt300an,
+ncr260vt300pp|NCR 2900_260 vt300 with pc+ kybd,
+ 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+ kybd,
+ 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 capablitiy '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, hs, 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=^M,
+ 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>, dsl=\E`c,
+ ed=\Ey$<5>, el=\Et$<5>, fsl=^M, 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=^J, 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,
+ tsl=\EF,
+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, hs, km, mc5i, mir, msgr, xon,
+ colors#16, cols#80, lines#24, ncv#33, nlab#32, xmc#1,
+ acsc=07a?h;j5k3l2m1n8q\:t4u9v=w0x6, bel=^G, blink=\EG2,
+ cbt=\EI, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=^M,
+ 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>, dsl=\E`c,
+ ed=\Ey$<5>, el=\Et$<5>, fsl=^M, 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=^J, 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,
+ tsl=\EF,
+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, hs, 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=^M,
+ 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>, dsl=\E`c,
+ ed=\EY$<5>, el=\ET$<5>, fsl=^M, 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=^J, 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>, tsl=\EF,
+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, hs, 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=^M, 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>, dsl=\E`c,
+ ed=\Ey$<5>, el=\Et$<5>, fsl=^M, 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=^J, 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>,
+ tsl=\EF,
+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 kybd,
+ use=ncr260vt100an,
+ncr160vt100pp|NCR 2900_160 vt100 with PC+ kybd,
+ use=ncr260vt100pp,
+ncr160vt100wan|NCR 2900_160 vt100 wide mode ansi kybd,
+ use=ncr260vt100wan,
+ncr160vt100wpp|NCR 2900_160 vt100 wide mode pc+ kybd,
+ use=ncr260vt100wpp,
+ncr160vt200an|NCR 2900_160 vt200 with ansi kybd,
+ use=ncr260vt200an,
+ncr160vt200pp|NCR 2900_160 vt200 with pc+ kybd,
+ use=ncr260vt200pp,
+ncr160vt200wan|NCR 2900_160 vt200 wide mode ansi kybd,
+ use=ncr260vt200wan,
+ncr160vt200wpp|NCR 2900_160 vt200 wide mode pc+ kybd,
+ use=ncr260vt200wpp,
+ncr160vt300an|NCR 2900_160 vt300 with ansi kybd,
+ use=ncr260vt300an,
+ncr160vt300pp|NCR 2900_160 vt300 with pc+ kybd,
+ use=ncr260vt300pp,
+ncr160vt300wan|NCR 2900_160 vt300 wide mode ansi kybd,
+ use=ncr260vt300wan,
+ncr160vt300wpp|NCR 2900_160 vt300 wide mode pc+ kybd,
+ 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=^M,
+ 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=^M, 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=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$<100>,
+ 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>,
+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
+#
+# From <root@goliath.un.atlantaga.NCR.COM>, init string hacked by SCO.
+ncr7900i|ncr7900|ncr 7900 model 1,
+ am, bw, ul,
+ cols#80, lines#24, xmc#1,
+ bel=^G, blink=\E0B, clear=^L, cr=^M, cub1=^H, cud1=^J, cuf1=^F,
+ cup=\E1%p2%c%p1%c, cuu1=^Z, dim=\E0A, ed=\Ek, el=\EK, ind=^J,
+ is2=\E0@\010\E3\E4\E7, kcub1=^U, kcud1=^J, 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=^M, cub1=^H, cud1=^J,
+ 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=^J, 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=^M^J,
+ tsl=\Ej\Ex5\Ex1\EY8%p1%{32}%+%c\Eo,
+ncr7901|ncr 7901 model,
+ am, bw, ul,
+ cols#80, lines#24,
+ bel=^G, blink=\E0B, civis=^W, clear=^L, cnorm=^X, cr=^M,
+ cub1=^H, cud1=^J, 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=^J,
+ is2=\E4^O, kclr=^L, kcub1=^U, kcud1=^J, 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,
+
+#### Perkin-Elmer (Owl)
+#
+# These are official terminfo entries from within Perkin-Elmer.
+#
+
+bantam|pe550|pe6100|perkin elmer 550,
+ cols#80, lines#24,
+ bel=^G, clear=\EK$<20>, cr=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA,
+ el=\EI$<20>, home=\EH, ind=^J, ll=\EH\EA,
+fox|pe1100|perkin elmer 1100,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\EH\EJ$<132>, cr=^M, cub1=^H, cud1=^J,
+ 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=^J, ll=\EH\EA, tbc=\E3,
+owl|pe1200|perkin elmer 1200,
+ am, in,
+ cols#80, lines#24,
+ bel=^G, clear=\EH\EJ$<132>, cr=^M, cub1=^H, cud1=^J,
+ 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=^J, 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=^M, 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=^J,
+ 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=^M, cub1=\ED, cud1=\EB,
+ cuf1=\EC, cup=\ES%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA,
+ ed=\EJ, el=\EI, home=\EH, ind=^J,
+ 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!^J, 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=^M, csr=\EU%p1%{32}%+%c%p2%{32}%+%c,
+ 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=\E[A, dch=\E[%p1%dP, dch1=\EM,
+ dl=\E[%p1%dM, dl1=\EL, ed=\E[J, el=\E[K, fsl=^M, home=\E[H,
+ ht=^I, ich=\E[%p1%d@, ich1=\EO, il=\E[%p1%dL, il1=\EN,
+ ind=^J, 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,
+ am, da, db, hs,
+ cols#80, lines#24, wsl#64, xmc#1,
+ clear=\EI, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\023%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dsl=\Eo\r,
+ ed=\EJ, el=\EK, fsl=^M, 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=^M, 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, civis=\E[?25l,
+ clear=\E[H\E[2J, cnorm=\E[?25h, cr=^M,
+ 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=^J, 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,
+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, civis=\E[?25l,
+ clear=\E[H\E[2J, cnorm=\E[?25h, cr=^M,
+ csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\E[0B, cuf1=\E[C,
+ cup=\010\E[%i%p1%d;%p2%dH, cuu1=\E[0A, 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=^J, 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,
+pt210|TRS-80 PT-210 printing terminal,
+ hc, os,
+ cols#80,
+ bel=^G, cr=^M, cud1=^J, ind=^J,
+
+#### 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,
+ os,
+ cols#75, lines#35,
+ bel=^G, clear=\E\014$<1000>, cr=^M, cub1=^H, cud1=^J,
+ 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,
+ am,
+ cols#80, lines#24, vt#4, xmc#1,
+ bel=^G, clear=\E\014$<4/>, cr=^M, cub1=^H, cud1=^J, 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,
+ am, da, db,
+ cols#80, it#8, lines#34, lm#0,
+ bel=^G, clear=\037era\r\n\n, cmdch=^_, cr=^M,
+ cub=\037lef %p1%d\r, cub1=^H, cud=\037dow %p1%d\r,
+ cud1=^F^J, 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^J,
+ is2=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r,
+ rmkx=\037lea p2\r\037lea p4\r\037lea p6\r\037lea p8\r\037lea f5\r,
+ smkx=\037lea p4 /h/\r\037lea p8 /k/\r\037lea p6 / /\r\037lea p2 /j/\r\037lea f5 /H/\r,
+tek4025-17|tek 4025 17 line window,
+ lines#17, use=tek4025,
+tek4025-17-ws|tek 4025 17 line window in workspace,
+ is2=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r\037wor 17\r\037mon 17\r,
+ rmcup=\037mon h\r, rmso=\037att s\r, smcup=\037wor h\r,
+ smso=\037att e\r,
+ use=tek4025-17,
+tek4025-ex|tek4027-ex|tek 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,
+ am, bw, da, db, xon,
+ cols#80, it#8, lines#34,
+ bel=^G, cbt=\035bac;, clear=\035era;\n\035rup;, cmdch=^],
+ cr=^M, cub=\035lef %p1%d;, cub1=^H, cud=\035dow %p1%d;,
+ cud1=^J, 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=^J, indn=\035dow %p1%d;,
+ 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|tek 4025 for curses and rogue,
+ am,
+ cols#80, it#8, lines#33,
+ clear=\037era;, cub1=^H, cud1=^F^J, cuf1=\037rig;,
+ cup=\037jum%i%p1%d\,%p2%d;, cuu1=^K, ht=^I, ind=^F^J,
+ 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|tek 4025 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,
+tek4105|tektronix 4105,
+ 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=^M, 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|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=^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$<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=^J, ka1=\EOq,
+ ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD,
+ kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy,
+ kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
+ kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, 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%;,
+ 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,
+
+# 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,
+ msgr, xon,
+ 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=^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=\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=^J, indn=\E[%p1%dS, 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,
+ rin=\E[%p1%dT, rmacs=^O, rmcup=\E%!0\ELBH=\E%!1,
+ rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, 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,
+
+#
+# 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=^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=\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=^J, indn=\E[%p1%dS, 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,
+ rin=\E[%p1%dT, 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,
+
+tek4107|tek4109|tektronix terminals 4107 4109,
+ 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=^M,
+ cub1=^H, cud1=^J, 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=^J,
+ 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%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m\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[8C\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|old tektronix 4110 series,
+ am,
+ cols#80, lines#34,
+ bel=^G, clear=\E^L, cr=^M, cub1=^H, cud1=^J, cuu1=^K, ind=^J,
+ rmcup=\EKA1\ELV1, smcup=\EKA0\ELV0\EMG0,
+# The 4112 with the ANSI compatibility enhancement
+tek4112|tek4114|tektronix 4110 series,
+ am, db,
+ cols#80, lines#34,
+ cbt=\E[Z, clear=\E[2J\E[0;0H, cub1=^H, 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|4112 not in dialog area,
+ cuu1=^K, use=tek4112,
+tek4112-5|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,
+ am, da, eo,
+ cols#80, lines#5,
+ clear=\ELZ, cub1=^H, cud1=^J, 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,
+ am, eo,
+ cols#80, it#8, lines#34,
+ clear=\E^L, cub1=^H, cud1=^J, 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,
+ 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|newer tektronix 4115 entry with more ANSI capabilities,
+ am, xon,
+ cols#80, lines#34,
+ bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+ cr=^M, 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, 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=^J, invis=\E[8m, kbs=^H, kcub1=\E[D,
+ kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H,
+ rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, rmam=\E[?7l,
+ rmso=\E[m, rmul=\E[m,
+ sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m,
+ sgr0=\E[m, smam=\E[?7h, smso=\E[7m, smul=\E[4m, tbc=\E[2g,
+ vpa=\E[%p1%{1}%+%dd,
+# 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 tek 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,
+
+# 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=^J, 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[8C\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,
+ 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=^J, 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=^M, cub1=^H, cud1=^J,
+ cuf1=\ES, cup=\E|%p1%{32}%+%c%p2%{32}%+%c, cuu1=\ER,
+ dch1=\E^], dl1=\E^M, ed=\E^U, el=\E^T, ht=^I, ich1=\E^\,
+ il1=\E^L, ind=^J, 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=^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,
+ dch1=\E[1P, dim=\E[=1;<6m, 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}%<%tE1%e%p2%{875}%<%tE\:%eF4%;%?%p3%{125}%<%t0%e%p3%{250}%<%tA2%e%p3%{375}%<%tA?%e%p3%{500}%<%tC8%e%p3%{625}%<%tD4%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\:%eF4%;\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=^M, cud1=^J, ind=^J,
+tty37|model 37 teletype,
+ hc, os, xon,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, cuu1=\E7, hd=\E9, hu=\E8,
+ ind=^J,
+
+# 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,
+ 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,
+ am, hc, os, xon,
+ cols#132,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, ind=^J, 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=^M, cub1=^H,
+ cud1=^J, cuf1=^I, cup=\EY%p1%{32}%+%c%p2%{32}%+%c,
+ cuu1=^K, ed=\EJ, el=\EK, home=\EH, ind=^J, 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\014$<40>, cr=^M, cub1=^H, cud1=^J, cuf1=^I,
+ cuu1=^N, home=\013$<40>, kcub1=^H, kcud1=^J, 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\030$<40>, cr=^M, cub1=^H, cud1=^J, cuf1=^U,
+ cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z,
+ ed=\027$<40>, el=\026$<20>, home=\031$<40>, ind=^J,
+ kcub1=^H, kcud1=^J, kcuf1=^U, kcuu1=^Z,
+vc404-s|volker-craig 404 w/standout mode,
+ cud1=^J, 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.,
+ 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,
+# 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,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\032$<1/>, cr=^M, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\ER, ed=^W,
+ el=^X, home=^^, il1=\EE, ind=^J, kcud1=^J, kcuf1=^L, kcuu1=^K,
+
+# From IBM, Thu May 5 19:35:27 1983
+# (commented out <smir>=\200R because we don't know <rmir> -- esr)
+ibm-pc|ibm5051|5051|IBM Personal Computer (no ANSI.SYS),
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^L^K, cr=^M^^, cub1=^], cud1=^J, cuf1=^\,
+ cuu1=^^, home=^K, ind=\n$<10>, kcud1=^_,
+
+ibmpc|wy60-PC|wyse60-PC|IBM PC/XT running PC/IX,
+ 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=^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, 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=\177, 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, ll=\E[24;1H,
+ nel=^M, 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%;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,
+ am, bw, eo, msgr,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, 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=^J,
+ kcuf1=^U, kcuu1=^K, kdch1=\177, nel=^M^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=^J, cuu1=^_,
+ ed=\013$<4*/>, el=\035$<4/>, home=^Y, ht=^I, ind=^W,
+ is2=^R^N, kbs=^H, kcub1=^H, kcud1=^J, 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=^J,
+ use=apple2e,
+# (ASCII Express) MouseTalk "Standard Apple //" emulation from BRL
+# Enable DC3/DC1 flow control with "stty ixon -ixany".
+apple-ae|ASCII Express,
+ am, bw, msgr, nxon, xon,
+ cols#80, it#8, lines#24,
+ bel=\007$<500/>, clear=^L, cr=^M, cub1=^H, cud1=^J, 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=^J,
+ kcuf1=^U, kcuu1=^K, rev=^O, ri=^V, rmso=^N, rs1=^R^N, sgr0=^N,
+ smso=^O,
+appleII|apple ii plus,
+ am,
+ cols#80, it#8, lines#24,
+ clear=^L, cnorm=^TC2, cub1=^H, cud1=^J, 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=\024T1\016, kcud1=^J, 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,
+ am, bw,
+ cols#80, lines#24,
+ cbt=^R, clear=\014$<10*/>, cr=\r$<10*/>, cub1=^H, cud1=^J,
+ 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=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EY, el=\ET,
+ home=^^, ind=^J, kcub1=^H, kcud1=^J, 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,
+ am, xenl,
+ cols#80, it#8, lines#24,
+ clear=\014$<300/>, cub1=^H, cud1=^J, cuf1=^\,
+ cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^],
+ home=^Y, ht=^I, kcub1=^H, kcud1=^J, 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,
+ 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,
+ 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 in 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=^M, cub1=^H,
+ cud1=^J, cuf1=^\, cup=\036%p2%{32}%+%c%p1%{32}%+%c,
+ cuu1=^_, ed=\013$<16*/>, el=^], home=^Y, ht=\011$<8/>,
+ ind=^J, kbs=^H, kcub1=^H, kcud1=^J, kcuf1=^\, kcuu1=^_,
+ khome=^Y, rmso=^Z2, smso=^Z3,
+apple-videx3|vapple|Apple II with 80 col card,
+ am,
+ cols#80, lines#24,
+ clear=\Ev, 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,
+ cols#80, lines#24,
+ clear=\014$<300/>, 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,
+ 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),
+ 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,
+ am, xenl, xon,
+ cols#80, it#8, lines#24, vt#3,
+ bel=^G, blink=\E[5m, 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, ed=\E[J,
+ el=\E[K, home=\E[H, ht=^I, hts=\EH, ind=^J, 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=^J, 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,
+ 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,
+ am,
+ cols#80, it#8, lines#24,
+ bel=^G, blink=^_", bold=\E\:^A, civis=^E\s,
+ clear=\014$<5*/>, cnorm=^E!, cub1=^H, cud1=^J, 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=^J,
+ 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,
+ am, msgr,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=^L, cr=^M, 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=^J, 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,
+ am,
+ cols#80, it#8, lines#24,
+ acsc=jak`l_mbquvewcxs, bel=^G, civis=\ERc, clear=^L,
+ cnorm=\ERC, cr=^M, 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=^J, 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,
+
+#### Atari ST
+#
+
+# From: Simson L. Garfinkel <simsong@media-lab.mit.edu>
+atari|atari st,
+ 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,
+# 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|Atari ST with VT52 emulation,
+ am, km,
+ cols#80, lines#25,
+ bel=^G, civis=\Ef, clear=\EH\EJ, cnorm=\Ee, cr=^M, 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=^J, 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=^M^J, rc=\Ek,
+ ri=\EI, rmcup=, rmso=\Eq, rs1=\Ez_\Eb@\EcA, sc=\Ej, sgr0=\Eq,
+ smcup=\Ee, smso=\Ep,
+
+#### 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.
+#
+# :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,
+ 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,
+ indn=\E[%p1%dS, invis=\E[8m, is2=\E[20l, kbs=^H, kcub1=\ED,
+ kcud1=\EB, kcuf1=\EC, kcuu1=\EA, kf0=\E9~, kf1=\E0~,
+ kf2=\E1~, kf3=\E2~, kf4=\E3~, kf5=\E4~, kf6=\E5~, kf7=\E6~,
+ kf8=\E7~, kf9=\E8~, rev=\E[7m, ri=\E[T, rin=\E[%p1%dT,
+ rmacs=^O, rmso=\E[m, rmul=\E[m, rs1=\Ec, sgr0=\E[m, smacs=^N,
+ smso=\E[7m, smul=\E[4m,
+
+# 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,
+ 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=^M,
+ 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=\177, 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,
+
+# 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,
+ cols#80, lines#24, pb#150,
+ clear=\E\006$<10/>, cr=^M, cud1=^J, 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=^J, 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,
+ 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=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW,
+ dl1=\ER, el=\ET, ich1=\EQ, il1=\EE, ind=^J, kcub1=^H, kcud1=^J,
+ 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,
+ am, mir, msgr, ul, xhp,
+ cols#80, lines#24,
+ clear=^Z, cub1=\010$<4>, cud1=^J, 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=^J, 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,
+ am,
+ cols#80, lines#24, xmc#1,
+ bel=^G, clear=^Z, cr=^M, cub1=^H, cud1=^J, 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=^J, 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.
+#
+
+# This is the entry provided with minix 1.7.4, with bogus :ri: removed.
+minix|minix console (v1.7),
+ am, xenl,
+ cols#80, it#8, lines#25,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[0J, cr=^M,
+ 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=^J,
+ is2=\E[0m, 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, lf0=End, lf1=PgUp, lf2=PgDn, lf3=Num +,
+ lf4=Num -, lf5=Num 5, nel=^M^J, rev=\E[7m, ri=\EM,
+ rmso=\E[0m, rmul=\E[0m, sgr0=\E[0m, smso=\E[7m, smul=\E[4m,
+# Corrected Jan 14, 1997 by Vincent Broman <broman@nosc.mil>
+minix-old|minix console (v1.5),
+ xon,
+ cols#80, it#8, lines#25,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[0J, cr=^M,
+ 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=^J,
+ 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=^M^J, 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,
+
+# 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=^M, 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=^J, 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=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM,
+ ed=\EJ, el=\EK, ht=^I, il1=\EL, ind=^J, 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=^M, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^J, 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/lib/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=^M\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
+# (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=^J, 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=1^Z, cr=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=^Q, el=^X,
+ home=^^, ind=^J,
+
+#### 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,
+ 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=^M, 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=^J,
+ home=\E[H, ht=^I, il=\E[%p1%dL, il1=\E[L, ind=^J, indn=^J,
+ ip=$<7/>, is1=\E\:1}\Ec\E[?4l\E[12h, is2=\Ec\E[12h\E)0,
+ is3=\E[?3l kbs=\010, 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=^M^J, rc=\E8, rev=\E[7m, ri=\EM, rin=\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,
+ u6=\E[%i%d;%dR, u7=\E[6n,
+
+# From: Alexandre Montaron <canal@mygale.org>, 18 Jun 1998
+#
+minitel1|minitel 1,
+ am, bw, eslok, hs, hz, msgr,
+ colors#8, cols#40, lines#24, pairs#8,
+ acsc=+.\,\,./f0g1, bel=^G, blink=\EH, civis=^T, clear=^L,
+ cnorm=^Q, cr=^M, cub1=^H, cud1=^J, cuf1=^I,
+ cup=\037%p1%{65}%+%c%p2%{65}%+%c, cuu1=^K, el=^X,
+ enacs=^Y, fsl=^J, home=^^, ind=^J,
+ is2=\E;`ZQ\E\:iC\E\:iE\021, nel=^M^J, op=\EG,
+ rep=%p1%c\022%p2%{63}%+%c, rev=\E], ri=^K, rmso=\E\\,
+ setf=\E%?%p1%{1}%=%tD%e%p1%{3}%=%tF%e%p1%{4}%=%tA%e%p1%{6}%=%tC%e%p1%{64}%+%c%;,
+ sgr=%?%p1%t\E]%;%?%p3%t\E]%;%?%p4%t\EH%;,
+ sgr0=\EI\E\\, smso=\E], tsl=\037@%p1%{65}%+%c,
+# is2=Fnct TE, Fnct MR, Fnct CM et pour finir: curseur ON.
+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, kclr=\E[2J, kctab=^I, kcub1=\E[D,
+ kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kdl1=\E[M,
+ kel=^X, khome=\E[H, kich1=\E[4h, kil1=\E[L, rmir=\E[4l,
+ smir=\E[4h, smkx=\E;iYA\E;jYC,
+ use=minitel1,
+# <rmkx> posait des problemes (logout en sortant de vi).
+minitel1b-80|minitel 1-bistandard (standard teleinformatique),
+ am@, bw@, hz@,
+ colors@, cols#80, it#8, pairs@,
+ blink=\E[5m, bold=\E[1m, civis=\037@A\024\n,
+ clear=\E[H\E[2J, 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@, kent=\EOM, kf0=\EOp, kf1=\EOq,
+ kf2=\EOr, kf3=\EOs, kf4=\EOt, kf5=\EOu, kf6=\EOv, kf7=\EOw,
+ kf8=\EOx, kf9=\EOy, nel=\EE, op@, rc=\E8, rep@, rev=\E[7m,
+ ri=\EM, rmkx@, rmso=\E[27m, rmul=\E[24m, sc=\E7, setf@,
+ sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m,
+ sgr0=\E[m, smkx@, smso=\E[7m, smul=\E[4m,
+ use=minitel1b,
+
+######## 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,
+ 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=^M, cub1=\ED, cud1=^J, 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=^J, 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=^M, cub1=\ED, cud1=^J, 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=^J, 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),
+ xenl,
+ cols#85, lines#64,
+ bel=^G, clear=\E[H\E[J$<150>, cr=^M,
+ 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=^M, 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,
+
+#### 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=^M, cub1=^H, cud1=^J, 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=^J, 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\,WARNING DOUBLE ENTER ESCAPE and \025\001C1\,\001c2\,\001W0\,0\,79\,39\,,
+ smso=\001C4\,\001c7\,, uc=\001\001_\001\0,
+
+#### Computer Automation
+#
+
+ca22851|computer automation 22851,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\014$<8>, cr=^M, cub1=^U, cud1=^J, cuf1=^I,
+ cup=\002%i%p1%c%p2%c, cuu1=^V, ed=^\, el=^], home=^^, ind=^J,
+ kcub1=^U, kcud1=^W, kcuu1=^V, khome=^^,
+
+#### Cybernex
+#
+
+# This entry has correct padding and the undocumented "ri" capability
+cyb83|xl83|cybernex xl-83,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\014$<62>, cr=^M, cub1=^H, cud1=^J, cuf1=^I,
+ cup=\027%p1%{32}%+%c%p2%{32}%+%c, cuu1=^N,
+ ed=\020$<62>, el=\017$<3>, home=^K, ind=^J, kcub1=^H,
+ kcud1=^J, kcuf1=^I, kcuu1=^N, ri=^N,
+# (mdl110: removed obsolete ":ma=^Z^P:" and overridden ":cd=145^NA^W:" -- esr)
+cyb110|mdl110|cybernex mdl-110,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=\030$<70>, cr=^M, cub1=^H, cud1=^J, 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=^J, 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,
+ am,
+ cols#82, lines#25,
+ bel=^G, clear=^]^_, cr=^M, cub1=^H, cud1=^J, cuf1=^X, cuu1=^Z,
+ ed=^_, el=^^, home=^], ind=^J,
+
+# 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=\025\E\004\027\030, cnorm=^X,
+ cr=^M, cub1=^H, cud1=^J,
+ 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=^J\Ec, kf4=^J\Eb, kf5=^S\Ea,
+ kf6=\EO\Ee, kf7=\EN\Ed, kf8=\EM\Ec, kf9=\EL\Eb, nel=^M^J,
+ 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 are DEC's official terminfos for its older terminals.
+# 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.
+#
+
+gt40|dec gt40,
+ os,
+ cols#72, lines#30,
+ bel=^G, cr=^M, cub1=^H, cud1=^J,
+gt42|dec gt42,
+ os,
+ cols#72, lines#40,
+ bel=^G, cr=^M, cub1=^H, cud1=^J,
+vt50|dec vt50,
+ cols#80, lines#12,
+ bel=^G, clear=\EH\EJ, cr=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cuu1=\EA, ed=\EJ, el=\EK, ht=^I, ind=^J,
+vt50h|dec vt50h,
+ cols#80, lines#12,
+ bel=^G, clear=\EH\EJ, cr=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ,
+ el=\EK, ht=^I, ind=^J, ri=\EI,
+# (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=^J,
+ 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,
+ am, xenl,
+ cols#84, lines#24,
+ bel=^G, clear=\E[H\E[2J, cr=^M, 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, ed=\E[J,
+ el=\E[K, ht=^I, ind=^J,
+ 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,
+ 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,
+ hc, os,
+ cols#72,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, ind=^J,
+dw2|decwriter|dw|decwriter II,
+ hc, os,
+ cols#132,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, ind=^J, 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,
+ hc, os,
+ cols#132,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, ht=^I, ind=^J,
+ 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,
+ am, hc, os,
+ cols#132,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, ht=^I, ind=^J, 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=^M, cud1=^J, hd=\EK, ht=^I, hu=\EL, ind=^J, nel=^M^J,
+ 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=^M, cud1=^J, ht=^I, ind=^J, kbs=^H, kcub1=^H,
+ kcud1=^J, nel=^M^J,
+ 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,
+ am,
+ cols#80, lines#27,
+ bel=^G, clear=^NR, cub1=^H, cud1=^J, 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=^J,
+
+#### Digital Data Research (ddr)
+#
+
+# (ddr: I added <rmam>/<smam> based on the init string -- esr)
+ddr|rebus3180|ddr3180|Rebus/DDR 3180 vt100 emulator,
+ 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=^J, 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 modelling
+# 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,
+
+#### General Electric (ge)
+#
+
+terminet1200|terminet300|tn1200|tn300|terminet|GE terminet 1200,
+ hc, os,
+ cols#120,
+ bel=^G, cr=^M, cud1=^J, ind=^J,
+
+#### 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,
+ am, mir, msgr,
+ cols#80, it#8, lines#24,
+ acsc=, bel=^G, clear=\E[2J, cnorm=\E[>4l, cr=^M, 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=^J,
+ 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,
+ am, eslok, hs, mir, msgr,
+ cols#80, it#8, lines#24,
+ acsc=, bel=^G, clear=\EE, cnorm=\Ey4, cr=^M, 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=^J, 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, 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,
+ am, eslok, hs, mir, msgr,
+ cols#80, lines#24,
+ acsc=, bel=^G, cbt=\E-, clear=\EE$<14>, cnorm=\Ey4, cr=^M,
+ 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> befause <hts>
+# looks vt100-compatible -- esr)
+z29a|z29a-kc-bc|h29a-kc-bc|heath/zenith 29 in ansi mode,
+ am, eslok, hs, mir, msgr,
+ cols#80, it#8, lines#24,
+ bel=^G, blink=\E[5m, bold=\E[2m, clear=\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[1P, dim=\E[2m, dl=\E[%p1%dM,
+ 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,
+ 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=^M\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|z29 ansi mode with keyckick 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[11m,
+ use=z29a,
+z29a-nkc-bc|h29a-nkc-bc|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|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=^M,
+ 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=^J, 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,
+ mir, msgr,
+ cols#80, it#8, lines#24,
+ acsc=, 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|ztx-10 or 11,
+ am, eslok, hs,
+ cols#80, it#8, lines#24,
+ clear=\EE, cub1=^H, cud1=^J, 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,
+ am,
+ cols#80, it#8, lines#24,
+ clear=\E[H\E[2J, cub1=^H, cud1=\ED,
+ 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,
+ am, bw,
+ cols#80, lines#24,
+ bel=^G, clear=\014$<5*>, cr=^M, cub1=^H, cud1=^J, cuf1=^F,
+ cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<20>, cuu1=^K,
+ ed=\E~k<10*>, el=\E~K$<15>, ht=^I, ind=^J, kcub1=^U,
+ kcud1=^J, 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,
+ am,
+ cols#80, lines#25,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, cuf1=^F,
+ cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<50>, cuu1=^Z, home=^A,
+ ind=^J, rmso=\E0@, smso=\E0P,
+# The intertube 2 has the "full duplex" problem like the tek 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,
+ 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=^M, 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=^M\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,
+# 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, 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;73s\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,
+ am, xenl,
+ cols#80, it#8, lines#48, vt#3,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J, cr=^M,
+ csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^J, 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=^M, cub1=^H,
+ cud1=^J, 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=^J, 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=\177, 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,
+ am, bw,
+ cols#80, lines#24,
+ cbt=\E[, clear=\EX, cud1=\EB, cuf1=\ED,
+ cup=\EE%p1%{32}%+%c%p2%{32}%+%c, ed=\ET, el=\EU,
+ home=\E@, ht=\EZ, kbs=^H, kcbt=\E[, kclr=\EX, kcub1=^H,
+ kcud1=^J, 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,
+ am, da, db,
+ cols#80, lines#24,
+ bel=^G, clear=\EJ, cr=^M, cub1=^H, cud1=^J, 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 Tektronics 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,
+ msgr, xon,
+ 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=^M,
+ 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=^J, 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,
+ 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,
+ mir, msgr, xon,
+ cols#80, it#8, lines#48, vt#3,
+ acsc=, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J,
+ cr=^M, 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=\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;19l\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=^M, cub1=^H, cud1=^J, cuf1=\E[C,
+ cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H,
+ ht=^I, ind=^J, kbs=^H, kcub1=^H, kcud1=^J, nel=^M^J, 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=^J, ed=\EY, el=\ET, kcub1=^H, kcud1=^J,
+ kcuf1=^L, kcuu1=^K,
+ use=adm3a,
+soroc140|iq140|soroc iq140,
+ am, mir,
+ cols#80, lines#24,
+ bel=^G, cbt=\EI, clear=\E+, cr=^M, cub1=^H, cud1=^J, 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=^J,
+ 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\177, rmul=\E^A, smir=\E9, smso=\E\177, 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=^M, cub1=^D, cud1=^J, 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.
+tab132|tab|tab132-15|tab 132/15,
+ da, db,
+ cols#80, lines#24, lm#96,
+ cud1=^J, 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=vt100,
+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,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, ind=^J,
+t3800|teleray 3800 series,
+ cols#80, it#8, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, cuf1=\EC,
+ cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EJ, el=\EK,
+ home=\EH, ht=^I, ind=^J, ll=\EY7\s,
+t1061|teleray|teleray 1061,
+ am, km, xhp, xt,
+ cols#80, it#8, lines#24, xmc#1,
+ bel=^G, clear=\014$<1>, cr=^M, cub1=^H, cud1=^J, 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=^J, 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,
+ km, xhp, xt,
+ cols#80, it#8, lines#24, xmc#2,
+ clear=\Ej$<30/>, cub1=^H, 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=^M, 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=^J, 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|ti silent 700/733/735/745 or omni 800,
+ hc, os,
+ cols#80,
+ bel=^G, cr=\r$<162>, cub1=^H, cud1=^J, ind=^J,
+
+#
+# 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, civis=\E[?25l, clear=\E[H\E[2J$<6>,
+ cnorm=\E[?25h, cub=\E[%p1%dD, cud=\E[%p1%dB,
+ cuf=\E[%p1%dC, cup=\E[%p1%i%p1%d;%p2%dH, cuu=\E[%p1%dA,
+ cvvis=\E[?25h, 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=^J, 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,
+ 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=^J, 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,
+ am, xon,
+ cols#80, it#8, lines#24,
+ bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l,
+ clear=\E[2J\E[H, cnorm=\E[?25h, cr=^M,
+ 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,
+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, civis=\E[?25l,
+ clear=\E[2J\E[H, cnorm=\E[?25h, cr=^M,
+ 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=P$<\233>, kf1=P$<\217>,
+ kf2=Q$<\217>, kf3=R$<\217>, kf4=S$<\217>, 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,
+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,
+ am, xon,
+ cols#80, lines#24,
+ bel=^G, blink=\E4P, clear=\EL, cnorm=\E4@, cr=^M, 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=^M, 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,
+ am, mir, ul,
+ cols#80, lines#24,
+ bel=^G, clear=\E*, cr=^M, cub1=^H, cud1=^J, 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=^J, 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,
+ 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=^J, 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,
+ am, bw,
+ cols#80, lines#24,
+ blink=\EM", clear=\EH\EJ, cnorm=\EP,
+ csr=\ER%p1%{32}%+%c%p2%{32}%+%c, cub1=^H, cud1=^J,
+ 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,
+ 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_15P|apollo 15 inch display,
+ rmir@, smir@, use=vt132,
+apollo_19L|apollo 19 inch display,
+ rmir@, smir@, use=vt132,
+apollo_color|apollo color display,
+ rmir@, smir@, use=vt132,
+
+#### 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,
+ cols#80, lines#28, xmc#0,
+ 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,
+ cols#80, lines#24, xmc#0,
+ 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,
+ am,
+ cols#128, lines#57,
+ clear=\032$<1/>, cub1=^H, cud1=^J, 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,
+ 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=^M, 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=^J, 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=^M^J, 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
+# comany 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,
+ 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,
+
+######## 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 then 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=^M, cub1=^H, cud1=^J, 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=^J, 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=++\,\,--..``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cr=^M,
+ 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, home=\E[H, ht=^I,
+ ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[L, ind=^J,
+ 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=^M, csr=\E[%i%p1%d;%p2%dr,
+ cub1=^H, cud1=^J, 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=^M^J, 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=^M, cub=\E[%p1%dD, cub1=^H,
+ cud=\E[%p1%dB, cud1=^J, 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=^J, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=^H,
+ kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
+ kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP, kf10=\EOx,
+ kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt, kf6=\EOu, kf7=\EOv,
+ kf8=\EOl, kf9=\EOw, 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,
+
+# 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=^M, 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=^J, 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=^J, cuu1=\E^J, 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^M, cub1=^H,
+ cuf1=^PR, cup=\020\021%p2%c%p1%c, cuu1=^P^L, cvvis=^PB,
+ dch1=^X, dl1=^P^S, ed=\020\025\020\023\020\023, el=^P^U,
+ home=^P^R, il1=^P^Z, ind=^J, pad=\177, 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=^M, cub1=^H, cud1=^J, cuu1=^Z, ff=^L, hd=\Eh, ht=^I,
+ hts=\E1, hu=\EH, ind=^J, kbs=^H, tbc=\E3,
+gsi|mystery gsi terminal,
+ hc, os,
+ cols#132,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, cuu1=^Z, hd=\Eh, ht=^I, hu=\EH,
+ ind=^J,
+aj830|aj832|aj|anderson jacobson,
+ hc, os,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, cuu1=\E7, hd=\E9, hu=\E8,
+ ind=^J,
+# 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=.1*\E'D, 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=\177, 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=^M, cub1=^H, cud1=^J, cuu1=\E9, ff=^L,
+ hd=\E]s\n\E]W, ht=^I, hts=\E1, hu=\E]s\E9\E]W, ind=^J,
+ kbs=^H, tbc=\E3,
+qume5|qume|Qume Sprint 5,
+ hc, os,
+ cols#80, it#8,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, cuu1=^Z, ff=^L, hd=\Eh, ht=^I,
+ hts=\E1, hu=\EH, ind=^J, 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=^M, cub1=^H, cud1=^J, ff=^L, ht=^I, hts=\E1, ind=^J,
+ 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,
+ 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,
+ 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=^M, cub1=^H, cud1=^J, cuf1=^L,
+ cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=^W, el=^V,
+ ind=^J, kbs=^H, kcub1=^H, kcud1=^J, kcuf1=^L, kcuu1=^K,
+ khome=^Y,
+# (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=^M, cub1=^H, cud1=^J,
+ cuf1=\EL, cup=\E8%i%p1%3d%p2%3d, cuu1=\EK, cvvis=\Ex,
+ dch1=\E6, home=\ET, ht=^I, ich1=\E5, il1=\E3, ind=^J, kbs=^H,
+ kcub1=^H, kcud1=^J, nel=^M^J, 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,
+ 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=^M, cub1=^H,
+ cud1=^J, 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,
+ cols#80, lines#16,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, cuf1=^I, cuu1=^O, el=^X,
+ home=^N, ind=^J,
+# 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=^M, cub1=^H, cud1=^J, 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=^J, kbs=\177,
+ 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=^M^J, rev=\ET, ri=\ES, rmacs=\EG, rmso=\EX,
+ sgr0=\EX, smacs=\EF, smso=\ET,
+env230|envision230|envision 230 graphics terminal,
+ xenl@,
+ mc0=\E[0i, mc4=\E[4i, mc5=\E[5i,
+ sgr=\E[%?%p1%t;1%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m, use=vt100,
+# 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,
+ am, os,
+ cols#80,
+ bel=^G, cr=^M, cub1=^H, cud1=^J, hd=^\, hu=^^, ind=^J,
+ep40|ep4000|execuport 4000,
+ cols#136, use=ep4080,
+# Adam Thompson <thompson@xanth.magic.mb.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,
+ am,
+ cols#80, lines#24,
+ clear=\EZ, cub1=^H, cud1=^J, 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=^M,
+ cub1=^H, cud1=^J, 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=^M, home=\036$<2>, ht=\011$<5>,
+ hts=\E1, if=/usr/share/tabset/std, il1=\EE$<4>, ind=^J,
+ 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%p6%|%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=\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%p1%c\EG0,
+ use=adm+sgr,
+teletec|Teletec Datascreen,
+ am,
+ cols#80, lines#24,
+ bel=^G, clear=^L, cr=^M, cub1=^H, cud1=^J, cuf1=^_, cuu1=^K,
+ home=^^, ind=^J,
+# 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.
+# (v3220: removed obsolete ":kn#10:",
+# I added <rmam>/<smam> based on the init string -- esr)
+v3220|LANPAR Vision II model 3220/3221/3222,
+ am, mir, xenl,
+ cols#80, it#8, lines#24,
+ clear=\E[H\E[J, cub1=^H, 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 acknowledgement.
+#
+# 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 parametrized sequences are
+# decribed 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 Backpace * ^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 CCIT 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 CCIT T.416, 39 = 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 PLD
+# abbreviation.
+#
+# (V) ECMA-48 calls this "Reverse Line Feed" but retains the RI abbreviation.
+#
+# (W) RM/SM modes are as follows: 1 = Guarder Area Transfer Mode (GATM),
+# 2 = Keyboard Action Mode (KAM), 3 = Control Representation Mode (CRM),
+# 4 = Insertion Replacement Mode, 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, 13 = Format Effector Action Mode (FEAM),
+# 14 = Format Effector Transfer Mode (FETM), 15 = Multiple Area Transfer
+# Mode (MATM), 16 = Transfer Termination Mode, 17 = Selected Area Transfer
+# Mode, 18 = Tabulation Stop Mode, 19 = Editing Boundary Mode, 20 = Line Feed
+# New Line Mode (LF/NL), 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 thems 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 capabilties:
+# 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.
+#
+######## CHANGE HISTORY
+#
+# The last /etc/termcap version maintained by John Kunze was 8.3, dated 8/5/94.
+# Releases 9 and up are 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 199):
+# * 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.
+# * Carrected 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 Dorfman.
+# 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.
+# 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.
+#
+# 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 (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 (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 compatiblity - 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 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
+#
+# The following sets edit modes for GNU EMACS.
+# Local Variables:
+# fill-prefix:"\t"
+# fill-column:75
+# comment-column:0
+# comment-start-skip:"^#+"
+# comment-start:"# "
+# compile-command:"tic -c terminfo.master"
+# End:
+######## SHANTIH! SHANTIH! SHANTIH!
diff --git a/contrib/ncurses/mk-0th.awk b/contrib/ncurses/mk-0th.awk
new file mode 100644
index 000000000000..b7a40fdc1809
--- /dev/null
+++ b/contrib/ncurses/mk-0th.awk
@@ -0,0 +1,85 @@
+# $Id: mk-0th.awk,v 1.7 1998/02/11 12:13:52 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# Generate list of sources for a library, together with lint/lintlib rules
+#
+# Variables:
+# name (library name, e.g., "ncurses", "panel", "forms", "menus")
+#
+BEGIN {
+ print ""
+ print "# generated by mk-0th.awk"
+ print ""
+ found = 0;
+ }
+ !/^[@#]/ {
+ if ( $0 != "" )
+ {
+ if ( found == 0 )
+ {
+ printf "C_SRC ="
+ if ( $2 == "lib" )
+ found = 1
+ else
+ found = 2
+ }
+ printf " \\\n\t%s/%s.c", $3, $1
+ }
+ }
+END {
+ print ""
+ if ( found == 1 )
+ {
+ print ""
+ printf "# Producing llib-l%s is time-consuming, so there's no direct-dependency for\n", name
+ print "# it in the lintlib rule. We'll only remove in the cleanest setup."
+ 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 : $(C_SRC)\n", name
+ printf "\tcproto -a -l -DLINT $(CPPFLAGS) $(C_SRC) >$@\n"
+ print ""
+ print "lintlib :"
+ printf "\t$(srcdir)/../misc/makellib %s $(CPPFLAGS)", name
+ print ""
+ print "lint :"
+ print "\t$(LINT) $(LINT_OPTS) $(CPPFLAGS) $(C_SRC) $(LINT_LIBS)"
+ }
+ else
+ {
+ print ""
+ print "lintlib :"
+ print "\t@echo no action needed"
+ }
+ }
diff --git a/contrib/ncurses/mk-1st.awk b/contrib/ncurses/mk-1st.awk
new file mode 100644
index 000000000000..e22d414fbd17
--- /dev/null
+++ b/contrib/ncurses/mk-1st.awk
@@ -0,0 +1,273 @@
+# $Id: mk-1st.awk,v 1.39 1998/05/09 21:54:02 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# Generate list of objects for a given model library
+# Variables:
+# name (library name, e.g., "ncurses", "panel", "forms", "menus")
+# 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)
+# MODEL (e.g., "DEBUG", uppercase; toupper is not portable)
+# depend (optional dependencies for all objects, e.g, ncurses_cfg.h)
+# subset ("none", "base", "base+ext_funcs" or "termlib")
+# target (cross-compile target, if any)
+# DoLinks ("yes", "reverse" or "no", flag to add symbolic links)
+# rmSoLocs ("yes" or "no", flag to add extra clean target)
+# overwrite ("yes" or "no", flag to add link to libcurses.a
+#
+# Notes:
+# CLIXs nawk does not like underscores in command-line variable names.
+# Mixed-case is ok.
+# HP/UX requires shared libraries to have executable permissions.
+#
+function symlink(src,dst) {
+ if ( src != dst ) {
+ if ( DoLinks == "reverse" ) {
+ printf "rm -f %s; ", src
+ printf "$(LN_S) %s %s; ", dst, src
+ } else {
+ printf "rm -f %s; ", dst
+ printf "$(LN_S) %s %s; ", src, dst
+ }
+ }
+ }
+function sharedlinks(directory, add) {
+ if ( end_name != lib_name ) {
+ if ( DoLinks == "yes" ) {
+ abi_name = sprintf("%s.$(ABI_VERSION)", lib_name);
+ } else {
+ abi_name = end_name;
+ }
+ if (add) {
+ printf "\tcd %s && (", directory
+ if ( abi_name != end_name ) {
+ symlink(end_name, abi_name);
+ }
+ symlink(abi_name, lib_name);
+ printf ")\n"
+ } else {
+ if ( abi_name != end_name ) {
+ printf "\t-@rm -f %s/%s\n", directory, abi_name
+ }
+ printf "\t-@rm -f %s/%s\n", directory, lib_name
+ }
+ }
+ }
+function removelinks() {
+ if ( end_name != lib_name ) {
+ if ( abi_name != end_name ) {
+ printf "\t-rm -f ../lib/%s\n", abi_name
+ }
+ printf "\t-rm -f ../lib/%s\n", end_name
+ }
+ }
+BEGIN {
+ found = 0
+ using = 0
+ }
+ /^@/ {
+ using = 0
+ if (subset == "none") {
+ using = 1
+ } else if (index(subset,$2) > 0) {
+ if (using == 0) {
+ if (found == 0) {
+ print ""
+ print "# generated by mk-1st.awk"
+ print ""
+ }
+ using = 1
+ }
+ if ( subset == "termlib") {
+ name = "tinfo"
+ OBJS = MODEL "_T"
+ } else {
+ OBJS = MODEL
+ }
+ }
+ }
+ !/^[@#]/ {
+ if (using \
+ && ( $2 == "lib" \
+ || $2 == "progs" \
+ || $2 == "c++" \
+ || $2 == "tack" ))
+ {
+ if ( found == 0 )
+ {
+ printf "%s_OBJS =", OBJS
+ if ( $2 == "lib" )
+ found = 1
+ else
+ found = 2
+ }
+ 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 = sprintf("%s%s%s", prefix, name, suffix)
+ if ( MODEL == "SHARED" )
+ {
+ if ( DoLinks == "yes" ) {
+ end_name = sprintf("%s.$(REL_VERSION)", lib_name);
+ } else if ( DoLinks == "reverse") {
+ tmp_name = sprintf("%s.$(ABI_VERSION)", lib_name);
+ end_name = lib_name;
+ lib_name = tmp_name;
+ } else {
+ end_name = lib_name;
+ }
+ printf "../lib/%s : $(%s_OBJS)\n", lib_name, OBJS
+ print "\t-@rm -f $@"
+ if ( subset == "termlib") {
+ printf "\t$(MK_SHARED_LIB) $(%s_OBJS) $(TINFO_LIST)\n", OBJS
+ } else {
+ printf "\t$(MK_SHARED_LIB) $(%s_OBJS) $(SHLIB_LIST)\n", OBJS
+ }
+ sharedlinks("../lib", 1)
+ print ""
+ if ( end_name != lib_name ) {
+ printf "../lib/%s : ../lib/%s\n", end_name, lib_name
+ }
+ print ""
+ print "install \\"
+ print "install.libs \\"
+ printf "install.%s :: $(INSTALL_PREFIX)$(libdir) ../lib/%s\n", name, end_name
+ printf "\t@echo installing ../lib/%s as $(INSTALL_PREFIX)$(libdir)/%s \n", lib_name, end_name
+ if ( DoLinks == "reverse") {
+ printf "\t-@rm -f $(INSTALL_PREFIX)$(libdir)/%s \n", lib_name
+ printf "\t$(INSTALL_LIB) ../lib/%s $(INSTALL_PREFIX)$(libdir)/%s \n", lib_name, lib_name
+ } else {
+ printf "\t-@rm -f $(INSTALL_PREFIX)$(libdir)/%s \n", end_name
+ printf "\t$(INSTALL_LIB) ../lib/%s $(INSTALL_PREFIX)$(libdir)/%s \n", lib_name, end_name
+ }
+ sharedlinks("$(INSTALL_PREFIX)$(libdir)", 1)
+ if ( overwrite == "yes" && name == "ncurses" )
+ {
+ ovr_name = sprintf("libcurses%s", suffix)
+ printf "\t@echo linking %s to %s\n", lib_name, ovr_name
+ printf "\tcd $(INSTALL_PREFIX)$(libdir) && (rm -f %s; $(LN_S) %s %s; )\n", ovr_name, lib_name, ovr_name
+ }
+ if ( ldconfig != "" ) {
+ printf "\t- test -z \"$(INSTALL_PREFIX)\" && %s\n", ldconfig
+ }
+ print ""
+ print "uninstall \\"
+ print "uninstall.libs \\"
+ printf "uninstall.%s ::\n", name
+ printf "\t@echo uninstalling $(INSTALL_PREFIX)$(libdir)/%s \n", end_name
+ printf "\t-@rm -f $(INSTALL_PREFIX)$(libdir)/%s\n", end_name
+ sharedlinks("$(INSTALL_PREFIX)$(libdir)", 0)
+ if ( overwrite == "yes" && name == "ncurses" )
+ {
+ ovr_name = sprintf("libcurses%s", suffix)
+ printf "\t-@rm -f $(INSTALL_PREFIX)$(libdir)/%s \n", ovr_name
+ }
+ if ( rmSoLocs == "yes" ) {
+ print ""
+ print "mostlyclean \\"
+ print "clean ::"
+ printf "\t-@rm -f so_locations\n"
+ }
+ }
+ else
+ {
+ end_name = lib_name;
+ printf "../lib/%s : $(%s_OBJS)\n", lib_name, OBJS
+ printf "\t$(AR) $(AR_OPTS) $@ $?\n"
+ printf "\t$(RANLIB) $@\n"
+ if ( target == "vxworks" )
+ {
+ printf "\t$(LD) $(LD_OPTS) $? -o $(@:.a=.o)\n"
+ }
+ print ""
+ print "install \\"
+ print "install.libs \\"
+ printf "install.%s :: $(INSTALL_PREFIX)$(libdir) ../lib/%s\n", name, lib_name
+ printf "\t@echo installing ../lib/%s as $(INSTALL_PREFIX)$(libdir)/%s \n", lib_name, lib_name
+ printf "\t$(INSTALL_DATA) ../lib/%s $(INSTALL_PREFIX)$(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 $(INSTALL_PREFIX)$(libdir)/libcurses.a \n"
+ printf "\t(cd $(INSTALL_PREFIX)$(libdir) && $(LN_S) libncurses.a libcurses.a)\n"
+ }
+ printf "\t$(RANLIB) $(INSTALL_PREFIX)$(libdir)/%s\n", lib_name
+ if ( target == "vxworks" )
+ {
+ printf "\t@echo installing ../lib/lib%s.o as $(INSTALL_PREFIX)$(libdir)/lib%s.o\n", name, name
+ printf "\t$(INSTALL_DATA) ../lib/lib%s.o $(INSTALL_PREFIX)$(libdir)/lib%s.o\n", name, name
+ }
+ print ""
+ print "uninstall \\"
+ print "uninstall.libs \\"
+ printf "uninstall.%s ::\n", name
+ printf "\t@echo uninstalling $(INSTALL_PREFIX)$(libdir)/%s \n", lib_name
+ printf "\t-@rm -f $(INSTALL_PREFIX)$(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 $(INSTALL_PREFIX)$(libdir)/libcurses.a \n"
+ }
+ if ( target == "vxworks" )
+ {
+ printf "\t@echo uninstalling $(INSTALL_PREFIX)$(libdir)/lib%s.o\n", name
+ printf "\t-@rm -f $(INSTALL_PREFIX)$(libdir)/lib%s.o\n", name
+ }
+ }
+ print ""
+ print "clean ::"
+ printf "\t-rm -f ../lib/%s\n", lib_name
+ print ""
+ print "mostlyclean::"
+ printf "\t-rm -f $(%s_OBJS)\n", OBJS
+ print ""
+ print "clean ::"
+ removelinks();
+ }
+ else if ( found == 2 )
+ {
+ print ""
+ print "mostlyclean::"
+ printf "\t-rm -f $(%s_OBJS)\n", OBJS
+ print ""
+ print "clean ::"
+ printf "\t-rm -f $(%s_OBJS)\n", OBJS
+ }
+ }
diff --git a/contrib/ncurses/mk-2nd.awk b/contrib/ncurses/mk-2nd.awk
new file mode 100644
index 000000000000..2d998b0c5c3d
--- /dev/null
+++ b/contrib/ncurses/mk-2nd.awk
@@ -0,0 +1,108 @@
+# $Id: mk-2nd.awk,v 1.11 1998/10/17 21:54:21 Alexander.V.Lukyanov Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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
+# 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")
+#
+# Fields in src/modules:
+# $1 = module name
+# $2 = progs|lib|c++
+# $3 = source-directory
+#
+# Fields in src/modules past $3 are dependencies
+#
+BEGIN {
+ found = 0
+ using = 0
+ }
+ /^@/ {
+ using = 0
+ if (subset == "none") {
+ using = 1
+ } else if (index(subset,$2) > 0) {
+ if (using == 0) {
+ if (found == 0) {
+ print ""
+ print "# generated by mk-2nd.awk"
+ print ""
+ }
+ using = 1
+ }
+ }
+ }
+ !/^[@#]/ {
+ if ($0 != "" \
+ && using != 0) {
+ found = 1
+ if ( $1 != "" ) {
+ print ""
+ if ( $2 == "c++" ) {
+ compile="CXX"
+ suffix=".cc"
+ } else {
+ compile="CC"
+ suffix=".c"
+ }
+ 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
+ }
+ if ( $3 == "." || srcdir == "." ) {
+ dir = $3 "/"
+ sub("^\\$\\(srcdir\\)/","",dir);
+ sub("^\\./","",dir);
+ printf "\t%scd ../%s; $(%s) $(CFLAGS_%s) -c ../%s/%s%s%s", atsign, model, compile, MODEL, name, dir, $1, suffix
+ } else
+ printf "\t%scd ../%s; $(%s) $(CFLAGS_%s) -c %s/%s%s", atsign, model, compile, MODEL, $3, $1, suffix
+ } else {
+ printf "%s", $1
+ for (n = 2; n <= NF; n++) printf " %s", $n
+ }
+ print ""
+ }
+ }
+END {
+ print ""
+ }
diff --git a/contrib/ncurses/mkinstalldirs b/contrib/ncurses/mkinstalldirs
new file mode 100755
index 000000000000..b2e45ea2ec29
--- /dev/null
+++ b/contrib/ncurses/mkinstalldirs
@@ -0,0 +1,33 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+umask 022
+errstatus=0
+
+for file in ${1+"$@"} ; do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d in ${1+"$@"} ; do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+ mkdir "$pathcomp" || errstatus=$?
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/contrib/ncurses/ncurses/Makefile.in b/contrib/ncurses/ncurses/Makefile.in
new file mode 100644
index 000000000000..655022004e55
--- /dev/null
+++ b/contrib/ncurses/ncurses/Makefile.in
@@ -0,0 +1,248 @@
+# $Id: Makefile.in,v 1.62 1999/02/18 11:58:20 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+x = @PROG_EXT@
+
+CF_MFLAGS = @cf_cv_makeflags@
+@SET_MAKE@
+
+MODEL = @DFT_LWR_MODEL@
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+
+ticdir = $(datadir)/terminfo
+
+INSTALL = @INSTALL@
+INSTALL_LIB = @INSTALL@ @INSTALL_LIB@
+INSTALL_DATA = @INSTALL_DATA@
+
+AR = @AR@
+AR_OPTS = @AR_OPTS@
+AWK = @AWK@
+LD = @LD@
+LN_S = @LN_S@
+
+CC = @CC@
+CPP = @CPP@
+CFLAGS = @CFLAGS@
+
+INCDIR = $(srcdir)/../include
+CPPFLAGS = -I../ncurses -I$(srcdir) @CPPFLAGS@ \
+ -DHAVE_CONFIG_H -DTERMINFO=\"$(ticdir)\"
+
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+
+HOSTCC = @BUILD_CC@
+HOSTCCFLAGS = @CFLAGS@ $(CPPFLAGS)
+HOSTLDFLAGS = @LDFLAGS@ @LIBS@
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -pg
+CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK = $(CC)
+LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+SHLIB_DIRS = -L../lib -L$(libdir)
+SHLIB_LIST = $(SHLIB_DIRS) @SHLIB_LIST@
+TINFO_LIST = $(SHLIB_DIRS) @TINFO_LIST@
+
+MK_SHARED_LIB = @MK_SHARED_LIB@
+
+REL_VERSION = @cf_cv_rel_version@
+ABI_VERSION = @cf_cv_abi_version@
+
+RANLIB = @RANLIB@
+
+LIBRARIES = @LIBS_TO_MAKE@
+
+LINT = @LINT@
+LINT_OPTS = @LINT_OPTS@
+LINT_LIBS = -lncurses @LIBS@
+
+FALLBACK_LIST = @FALLBACK_LIST@
+
+AUTO_SRC = \
+ ../include/nomacros.h \
+ ./comp_captab.c \
+ ./expanded.c \
+ ./fallback.c \
+ init_keytry.h \
+ ./lib_keyname.c \
+ ./lib_gen.c \
+ ./codes.c \
+ ./names.c \
+ ./unctrl.c
+
+TEST_DEPS = @LIB_PREFIX@ncurses@DFT_DEP_SUFFIX@
+TEST_ARGS = -L../lib -lncurses@DFT_ARG_SUFFIX@
+TEST_LDFLAGS = @LD_MODEL@ $(TEST_ARGS) @LIBS@ @EXTRA_LIBS@ @LOCAL_LDFLAGS@ @LDFLAGS@
+
+TEST_PROGS = \
+ captoinfo$x \
+ hardscroll$x \
+ hashmap$x \
+ lib_mvcur$x
+
+base = $(srcdir)/base
+serial = $(srcdir)/tty
+tinfo = $(srcdir)/tinfo
+trace = $(srcdir)/trace
+
+################################################################################
+all :: $(AUTO_SRC) ../lib $(LIBRARIES)
+
+sources: $(AUTO_SRC)
+
+$(INSTALL_PREFIX)$(libdir) :
+ $(srcdir)/../mkinstalldirs $@
+
+../lib : ; mkdir $@
+
+./fallback.c : $(tinfo)/MKfallback.sh
+ sh $(tinfo)/MKfallback.sh $(FALLBACK_LIST) >$@
+
+./lib_gen.c : $(base)/MKlib_gen.sh ../include/curses.h
+ sh $(base)/MKlib_gen.sh "$(CPP)" "$(AWK)" <../include/curses.h >$@
+
+../include/nomacros.h : $(base)/MKlib_gen.sh ../include/curses.h
+ sh $(base)/MKlib_gen.sh "$(CPP)" "$(AWK)" <../include/curses.h | \
+ fgrep undef >$@
+
+init_keytry.h: make_keys$x $(tinfo)/keys.list
+ ./make_keys $(tinfo)/keys.list > $@
+
+make_keys$x : \
+ $(tinfo)/make_keys.c \
+ ./names.c
+ $(HOSTCC) -o $@ $(HOSTCCFLAGS) $(tinfo)/make_keys.c $(HOSTLDFLAGS)
+
+make_hash$x : \
+ $(tinfo)/comp_hash.c \
+ ../include/hashsize.h
+ $(HOSTCC) -o $@ $(HOSTCCFLAGS) -DMAIN_PROGRAM $(tinfo)/comp_hash.c $(HOSTLDFLAGS)
+
+./expanded.c : $(serial)/MKexpanded.sh
+ sh $(serial)/MKexpanded.sh "$(CPP)" $(CPPFLAGS) > $@
+
+./comp_captab.c: \
+ make_hash$x \
+ ../include/hashsize.h \
+ $(tinfo)/MKcaptab.awk
+ sh $(tinfo)/MKcaptab.awk $(AWK) $(srcdir)/../include/Caps > $@
+
+./lib_keyname.c: $(tinfo)/keys.list $(base)/MKkeyname.awk
+ $(AWK) -f $(base)/MKkeyname.awk $(tinfo)/keys.list > $@
+
+./names.c ./codes.c: $(tinfo)/MKnames.awk
+ $(AWK) -f $(tinfo)/MKnames.awk $(srcdir)/../include/Caps
+ cat namehdr boolnames boolfnames numnames numfnames strnames strfnames nameftr >./names.c
+ cat namehdr boolcodes numcodes strcodes codeftr >./codes.c
+ -rm -f namehdr nameftr codeftr boolnames boolfnames boolcodes numnames numfnames numcodes strnames strfnames strcodes
+
+./unctrl.c: $(base)/MKunctrl.awk
+ echo | $(AWK) -f $(base)/MKunctrl.awk >$@
+
+tags:
+ ctags *.[ch]
+
+TAGS:
+ etags *.[ch]
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+ -rm -f $(TEST_PROGS)
+
+clean :: mostlyclean
+ -rm -f $(AUTO_SRC)
+ -rm -f make_keys
+ -rm -f make_hash
+
+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) $(CF_MFLAGS)
+
+# These rules build test-programs for the modules that have test-drivers
+test_progs : $(TEST_PROGS)
+
+captoinfo$x : $(tinfo)/captoinfo.c $(TEST_DEPS)
+ @ECHO_LINK@ $(CC) -o $@ $(CFLAGS_DEFAULT) -DMAIN $(tinfo)/captoinfo.c $(TEST_LDFLAGS)
+
+hardscroll$x : $(serial)/hardscroll.c $(TEST_DEPS)
+ @ECHO_LINK@ $(CC) -o $@ $(CFLAGS_DEFAULT) -DSCROLLDEBUG $(serial)/hardscroll.c $(TEST_LDFLAGS)
+
+hashmap$x : $(serial)/hashmap.c $(TEST_DEPS)
+ @ECHO_LINK@ $(CC) -o $@ $(CFLAGS_DEFAULT) -DHASHDEBUG $(serial)/hashmap.c $(TEST_LDFLAGS)
+
+lib_mvcur$x : $(serial)/lib_mvcur.c $(TEST_DEPS) \
+ ../@DFT_OBJ_SUBDIR@/dump_entry.o
+ @ECHO_LINK@ $(CC) -o $@ $(CFLAGS_DEFAULT) -DNCURSES_TEST -I$(serial)/../../progs $(serial)/lib_mvcur.c ../@DFT_OBJ_SUBDIR@/dump_entry.o $(TEST_LDFLAGS)
+
+../@DFT_OBJ_SUBDIR@/dump_entry.o:
+ cd ../progs && $(MAKE) ../@DFT_OBJ_SUBDIR@/dump_entry.o
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/contrib/ncurses/ncurses/README b/contrib/ncurses/ncurses/README
new file mode 100644
index 000000000000..aade721a2e6e
--- /dev/null
+++ b/contrib/ncurses/ncurses/README
@@ -0,0 +1,2 @@
+For discussion of the package internals, see hackguide.html in the misc
+directory.
diff --git a/contrib/ncurses/ncurses/SigAction.h b/contrib/ncurses/ncurses/SigAction.h
new file mode 100644
index 000000000000..9b5a31a85a2f
--- /dev/null
+++ b/contrib/ncurses/ncurses/SigAction.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * $Id: SigAction.h,v 1.5 1999/06/19 23:00:54 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
+
+#if HAVE_LIBC_H
+#include <libc.h>
+#endif
+
+#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
+
+extern int sigaction (int sig, sigaction_t * sigact, sigaction_t * osigact);
+extern int sigprocmask (int how, sigset_t *mask, sigset_t *omask);
+extern int sigemptyset (sigset_t *mask);
+extern int sigsuspend (sigset_t *mask);
+extern int sigdelset (sigset_t *mask, int sig);
+extern int sigaddset (sigset_t *mask, int sig);
+
+#endif /* HAVE_SIGVEC */
+#endif /* HAVE_SIGACTION */
+#endif /* !defined(_SIGACTION_H) */
diff --git a/contrib/ncurses/ncurses/base/MKkeyname.awk b/contrib/ncurses/ncurses/base/MKkeyname.awk
new file mode 100644
index 000000000000..aaeb4743cdfe
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/MKkeyname.awk
@@ -0,0 +1,74 @@
+# $Id: MKkeyname.awk,v 1.17 1999/02/18 11:18:06 tom Exp $
+##############################################################################
+# Copyright (c) 1999 Free Software Foundation, Inc. #
+# #
+# Permission is hereby granted, free of charge, to any person obtaining a #
+# copy of this software and associated documentation files (the "Software"), #
+# to deal in the Software without restriction, including without limitation #
+# the rights to use, copy, modify, merge, publish, distribute, distribute #
+# with modifications, sublicense, and/or sell copies of the Software, and to #
+# permit persons to whom the Software is furnished to do so, subject to the #
+# following conditions: #
+# #
+# The above copyright notice and this permission notice shall be included in #
+# all copies or substantial portions of the Software. #
+# #
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
+# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
+# DEALINGS IN THE SOFTWARE. #
+# #
+# Except as contained in this notice, the name(s) of the above copyright #
+# 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 <ncurses_cfg.h>"
+ print "#include <stdlib.h>"
+ print "#include <string.h>"
+ print "#include <curses.h>"
+ print "#include <tic.h>"
+ print ""
+ print "const struct kn _nc_key_names[] = {"
+}
+
+/^[^#]/ {
+ printf "\t{ \"%s\", %s },\n", $1, $1;
+ }
+
+END {
+ printf "\t{ 0, 0 }};\n"
+ print ""
+ print "NCURSES_CONST char *keyname(int c)"
+ print "{"
+ print "int i;"
+ print "static char name[20];"
+ print "char *p;"
+ print ""
+ print "\tfor (i = 0; _nc_key_names[i].name != 0; i++)"
+ print "\t\tif (_nc_key_names[i].code == c)"
+ print "\t\t\treturn (NCURSES_CONST char *)_nc_key_names[i].name;"
+ print "\tif (c >= 256) return \"UNKNOWN KEY\";"
+ print "\tp = name;"
+ print "\tif (c >= 128) {"
+ print "\t\tstrcpy(p, \"M-\");"
+ print "\t\tp += 2;"
+ print "\t\tc -= 128;"
+ print "\t}"
+ print "\tif (c < 0)"
+ print "\t\tsprintf(p, \"%d\", c);"
+ print "\telse if (c < 32)"
+ print "\t\tsprintf(p, \"^%c\", c + '@');"
+ print "\telse if (c == 127)"
+ print "\t\tstrcpy(p, \"^?\");"
+ print "\telse"
+ print "\t\tsprintf(p, \"%c\", c);"
+ print "\treturn (NCURSES_CONST char *)name;"
+ print "}"
+}
diff --git a/contrib/ncurses/ncurses/base/MKlib_gen.sh b/contrib/ncurses/ncurses/base/MKlib_gen.sh
new file mode 100755
index 000000000000..0a29c6085f62
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/MKlib_gen.sh
@@ -0,0 +1,254 @@
+#!/bin/sh
+#
+# MKlib_gen.sh -- generate sources from curses.h macro definitions
+#
+# ($Id: MKlib_gen.sh,v 1.11 1998/01/17 14:16:52 Juan.Jose.Garcia.Ripoll Exp $)
+#
+# 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, create needed #undef
+#
+
+preprocessor="$1 -I../include"
+AWK="$2"
+ED1=sed1$$.sed
+ED2=sed2$$.sed
+ED3=sed3$$.sed
+AW1=awk1$$.awk
+TMP=gen$$.c
+trap "rm -f $ED1 $ED2 $ED3 $AW1 $TMP" 0 1 2 5 15
+
+(cat <<EOF
+#include <ncurses_cfg.h>
+#include <curses.h>
+
+DECLARATIONS
+
+EOF
+cat >$ED1 <<EOF1
+/^extern.*generated/{
+ h
+ s/^.*generated:\([^ *]*\).*/P_#if_USE_\1_SUPPORT/p
+ g
+ s/^extern \([^;]*\);.*/\1/p
+ g
+ s/^.*generated:\([^ *]*\).*/P_#endif/p
+}
+EOF1
+
+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)/
+:nc
+ /(/s// ( /
+ s/)/ )/
+EOF2
+
+cat >$ED3 <<EOF3
+/^P_/{
+ s/^P_#if_/#if /
+ s/^P_//
+ b done
+}
+ s/ */ /g
+ s/ */ /g
+ s/ ,/,/g
+ s/ )/)/g
+ s/ gen_/ /
+ s/^M_/#undef /
+ /^%%/s// /
+:done
+EOF3
+
+cat >$AW1 <<\EOF1
+BEGIN {
+ skip=0;
+ }
+ /^P_#if/ {
+ print "\n"
+ print $0
+ skip=0;
+ }
+ /^P_#endif/ {
+ print $0
+ skip=1;
+ }
+ $0 !~ /^P_/ {
+ if (skip)
+ print "\n"
+ skip=1;
+
+ print "M_" $2
+ print $0;
+ print "{";
+ argcount = 1;
+ if (NF == 5 && $4 == "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 ($2 == "innstr")
+ dotrace = 0;
+
+ call = "%%T((T_CALLED(\""
+ args = ""
+ comma = ""
+ num = 0;
+ pointer = 0;
+ argtype = ""
+ for (i = 1; i <= NF; i++) {
+ ch = $i;
+ if ( ch == "*" )
+ pointer = 1;
+ else if ( ch == "va_list" )
+ pointer = 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 == ")" ) {
+ if (pointer) {
+ if ( argtype == "char" ) {
+ call = call "%s"
+ comma = comma "_nc_visbuf2(" num ","
+ pointer = 0;
+ } else
+ call = call "%p"
+ } 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 ","
+ } else {
+ call = call "%#lx"
+ comma = comma "(long)"
+ }
+ }
+ if (ch == ",")
+ args = args comma "a" ++num;
+ else if (argcount != 0)
+ args = args comma "z"
+ call = call ch
+ if (pointer == 0 && argcount != 0 && argtype != "" )
+ args = args ")"
+ if (args != "")
+ comma = ", "
+ pointer = 0;
+ argtype = ""
+ }
+ if ( i == 2 || ch == "(" )
+ call = call ch
+ }
+ call = call "\")"
+ if (args != "")
+ call = call ", " args
+ call = call ")); "
+
+ if (dotrace)
+ printf "%s", call
+
+ if (match($0, "^void"))
+ call = ""
+ else if (dotrace)
+ call = "returnCode( ";
+ else
+ call = "%%return ";
+
+ call = call $2 "(";
+ for (i = 1; i < argcount; i++)
+ call = call "a" i ", ";
+ if (argcount != 0)
+ call = call "z";
+ if (!match($0, "^void"))
+ call = call ") ";
+ if (dotrace)
+ call = call ")";
+ print call ";"
+
+ if (match($0, "^void"))
+ print "%%returnVoid;"
+ print "}";
+}
+EOF1
+
+sed -n -f $ED1 | sed -f $ED2 \
+| $AWK -f $AW1 ) \
+| sed \
+ -e '/^\([a-z_][a-z_]*\) /s//\1 gen_/' >$TMP
+ $preprocessor $TMP 2>/dev/null \
+| $AWK '
+BEGIN {
+ print "/*"
+ print " * DO NOT EDIT THIS FILE BY HAND!"
+ print " * It is generated by MKlib_gen.sh."
+ 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 "#include <curses.priv.h>"
+ print ""
+ }
+/^DECLARATIONS/ {start = 1; next;}
+ {if (start) print $0;}
+' \
+| sed -f $ED3 \
+| sed \
+ -e 's/^.*T_CALLED.*returnCode( \([a-z].*) \));/ return \1;/' \
+ -e 's/^.*T_CALLED.*returnCode( \((wmove.*) \));/ return \1;/'
+
diff --git a/contrib/ncurses/ncurses/base/MKunctrl.awk b/contrib/ncurses/ncurses/base/MKunctrl.awk
new file mode 100644
index 000000000000..0f4419242a99
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/MKunctrl.awk
@@ -0,0 +1,67 @@
+# $Id: MKunctrl.awk,v 1.6 1998/06/06 18:18:07 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1997
+#
+
+BEGIN {
+ print "/* generated by MKunctrl.awk */"
+ print ""
+ print "#include <curses.priv.h>"
+ print ""
+ print "#undef unctrl"
+ print ""
+ }
+END {
+ print "NCURSES_CONST char *unctrl(register chtype ch)"
+ print "{"
+ printf "static const char* const table[] = {"
+ for ( ch = 0; ch < 256; ch++ ) {
+ gap = ","
+ if ((ch % 8) == 0)
+ printf "\n "
+ if (ch < 32) {
+ printf "\"^\\%03o\"", ch + 64
+ } else if (ch == 127) {
+ printf "\"^?\""
+ } else {
+ printf "\"\\%03o\"", ch
+ gap = gap " "
+ }
+ if (ch == 255)
+ gap = "\n"
+ else if (((ch + 1) % 8) != 0)
+ gap = gap " "
+ printf "%s", gap
+ }
+ print "};"
+ print ""
+ print "\treturn (NCURSES_CONST char *)table[TextOf(ch)];"
+ print "}"
+ }
diff --git a/contrib/ncurses/ncurses/base/README b/contrib/ncurses/ncurses/base/README
new file mode 100644
index 000000000000..ffa16963e9e3
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/README
@@ -0,0 +1,7 @@
+-- $Id: README,v 1.1 1998/11/14 22:58:22 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/contrib/ncurses/ncurses/base/define_key.c b/contrib/ncurses/ncurses/base/define_key.c
new file mode 100644
index 000000000000..52dc6927bd55
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/define_key.c
@@ -0,0 +1,59 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: define_key.c,v 1.4 1999/02/21 13:03:55 tom Exp $")
+
+int
+define_key(char *str, int keycode)
+{
+ int code = ERR;
+
+ T((T_CALLED("define_key(%s,%d)"), _nc_visbuf(str), keycode));
+ if (keycode > 0) {
+ if (str != 0) {
+ define_key(str, 0);
+ } else if (has_key(keycode)) {
+ while (_nc_remove_key(&(SP->_keytry), keycode))
+ code = OK;
+ }
+ if (str != 0) {
+ (void) _nc_add_to_try(&(SP->_keytry), str, keycode);
+ code = OK;
+ }
+ } else {
+ while (_nc_remove_string(&(SP->_keytry), str))
+ code = OK;
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/keybound.c b/contrib/ncurses/ncurses/base/keybound.c
new file mode 100644
index 000000000000..c9aa02292118
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/keybound.c
@@ -0,0 +1,45 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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: keybound.c,v 1.1 1999/02/19 11:55:56 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.
+ */
+
+char *keybound(int code, int count)
+{
+ return _nc_expand_try(SP->_key_ok, code, &count, 0);
+}
diff --git a/contrib/ncurses/ncurses/base/keyok.c b/contrib/ncurses/ncurses/base/keyok.c
new file mode 100644
index 000000000000..a1385769781f
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/keyok.c
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: keyok.c,v 1.3 1999/02/19 11:29:48 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.
+ */
+
+int keyok(int c, bool flag)
+{
+ int code = ERR;
+ int count = 0;
+ char *s;
+
+ T((T_CALLED("keyok(%d,%d)"), c, flag));
+ if (flag) {
+ while ((s = _nc_expand_try(SP->_key_ok, c, &count, 0)) != 0
+ && _nc_remove_key(&(SP->_key_ok), c)) {
+ _nc_add_to_try(&(SP->_keytry), s, c);
+ free(s);
+ code = OK;
+ count = 0;
+ }
+ } else {
+ while ((s = _nc_expand_try(SP->_keytry, c, &count, 0)) != 0
+ && _nc_remove_key(&(SP->_keytry), c)) {
+ _nc_add_to_try(&(SP->_key_ok), s, c);
+ free(s);
+ code = OK;
+ count = 0;
+ }
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_addch.c b/contrib/ncurses/ncurses/base/lib_addch.c
new file mode 100644
index 000000000000..101d75ef29a9
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_addch.c
@@ -0,0 +1,293 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_addch.c
+**
+** The routine waddch().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_addch.c,v 1.42 1999/07/24 20:01:05 tom Exp $")
+
+/*
+ * 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) (~(chtype)((ch)&A_COLOR?A_COLOR:0))
+
+static inline chtype render_char(WINDOW *win, chtype ch)
+/* compute a rendition of the given char correct for the current context */
+{
+ chtype a = win->_attrs;
+
+ if (ch == ' ')
+ {
+ /* color in attrs has precedence over bkgd */
+ ch = a | (win->_bkgd & COLOR_MASK(a));
+ }
+ else
+ {
+ /* color in attrs has precedence over bkgd */
+ a |= (win->_bkgd & A_ATTRIBUTES) & COLOR_MASK(a);
+ /* color in ch has precedence */
+ ch |= (a & COLOR_MASK(ch));
+ }
+
+ TR(TRACE_VIRTPUT, ("bkg = %lx, attrs = %lx -> ch = %lx", win->_bkgd,
+ win->_attrs, ch));
+
+ return(ch);
+}
+
+chtype _nc_background(WINDOW *win)
+/* make render_char() visible while still allowing us to inline it below */
+{
+ return (win->_bkgd);
+}
+
+chtype _nc_render(WINDOW *win, chtype 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 inline
+int waddch_literal(WINDOW *win, chtype ch)
+{
+ int x;
+ struct ldat *line;
+
+ x = win->_curx;
+
+ CHECK_POSITION(win, x, win->_cury);
+
+ /*
+ * If we're trying to add a character at the lower-right corner more
+ * than once, fail. (Moving the cursor will clear the flag).
+ */
+ if (win->_flags & _WRAPPED) {
+ if (x >= win->_maxx)
+ return (ERR);
+ win->_flags &= ~_WRAPPED;
+ }
+
+ ch = render_char(win, ch);
+ TR(TRACE_VIRTPUT, ("win attr = %s", _traceattr(win->_attrs)));
+
+ line = win->_line+win->_cury;
+
+ CHANGED_CELL(line,x);
+
+ line->text[x++] = ch;
+
+ TR(TRACE_VIRTPUT, ("(%d, %d) = %s", win->_cury, x, _tracechtype(ch)));
+ if (x > win->_maxx) {
+ /*
+ * 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.
+ */
+ win->_flags |= _WRAPPED;
+ if (++win->_cury > win->_regbottom) {
+ win->_cury = win->_regbottom;
+ win->_curx = win->_maxx;
+ if (!win->_scroll)
+ return (ERR);
+ scroll(win);
+ }
+ win->_curx = 0;
+ return (OK);
+ }
+ win->_curx = x;
+ return OK;
+}
+
+static inline
+int waddch_nosync(WINDOW *win, const chtype ch)
+/* the workhorse function -- add a character to the given window */
+{
+ int x, y;
+ int t = 0;
+ const char *s = 0;
+
+ if ((ch & A_ALTCHARSET)
+ || ((t = TextOf(ch)) > 127)
+ || ((s = unctrl(t))[1] == 0))
+ return waddch_literal(win, ch);
+
+ x = win->_curx;
+ y = win->_cury;
+
+ switch (t) {
+ case '\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)) {
+ chtype blank = (' ' | AttrOf(ch));
+ while (win->_curx < x) {
+ if (waddch_literal(win, blank) == ERR)
+ return(ERR);
+ }
+ break;
+ } else {
+ wclrtoeol(win);
+ win->_flags |= _WRAPPED;
+ if (++y > win->_regbottom) {
+ x = win->_maxx;
+ y--;
+ if (win->_scroll) {
+ scroll(win);
+ x = 0;
+ }
+ } else {
+ x = 0;
+ }
+ }
+ break;
+ case '\n':
+ wclrtoeol(win);
+ if (++y > win->_regbottom) {
+ 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)
+ if (waddch_literal(win, (*s++)|AttrOf(ch)) == ERR)
+ return ERR;
+ return(OK);
+ }
+
+ win->_curx = x;
+ win->_cury = y;
+
+ return(OK);
+}
+
+int _nc_waddch_nosync(WINDOW *win, const chtype c)
+/* export copy of waddch_nosync() so the string-put functions can use it */
+{
+ return(waddch_nosync(win, c));
+}
+
+/*
+ * The versions below call _nc_synhook(). 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 */
+
+int waddch(WINDOW *win, const chtype ch)
+{
+ int code = ERR;
+
+ TR(TRACE_VIRTPUT|TRACE_CCALLS, (T_CALLED("waddch(%p, %s)"), win, _tracechtype(ch)));
+
+ if (win && (waddch_nosync(win, ch) != ERR))
+ {
+ _nc_synchook(win);
+ code = OK;
+ }
+
+ TR(TRACE_VIRTPUT|TRACE_CCALLS, (T_RETURN("%d"), code));
+ return(code);
+}
+
+int wechochar(WINDOW *win, const chtype ch)
+{
+ int code = ERR;
+
+ TR(TRACE_VIRTPUT|TRACE_CCALLS, (T_CALLED("wechochar(%p, %s)"), win, _tracechtype(ch)));
+
+ if (win && (waddch_nosync(win, ch) != 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/contrib/ncurses/ncurses/base/lib_addstr.c b/contrib/ncurses/ncurses/base/lib_addstr.c
new file mode 100644
index 000000000000..9ac55e42aba7
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_addstr.c
@@ -0,0 +1,103 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_addstr.c
+*
+** The routines waddnstr(), waddchnstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_addstr.c,v 1.16 1998/06/28 00:38:29 tom Exp $")
+
+int
+waddnstr(WINDOW *win, const char *const astr, int n)
+{
+unsigned const char *str = (unsigned const char *)astr;
+int code = ERR;
+
+ T((T_CALLED("waddnstr(%p,%s,%d)"), win, _nc_visbuf(astr), n));
+
+ if (win && (str != 0)) {
+ T(("... current %s", _traceattr(win->_attrs)));
+ TR(TRACE_VIRTPUT, ("str is not null"));
+ code = OK;
+ if (n < 0)
+ n = (int)strlen(astr);
+
+ while((n-- > 0) && (*str != '\0')) {
+ TR(TRACE_VIRTPUT, ("*str = %#x", *str));
+ if (_nc_waddch_nosync(win, (chtype)*str++) == ERR) {
+ code = ERR;
+ break;
+ }
+ }
+ _nc_synchook(win);
+ }
+ TR(TRACE_VIRTPUT, ("waddnstr returns %d", code));
+ returnCode(code);
+}
+
+int
+waddchnstr(WINDOW *win, const chtype *const astr, int n)
+{
+short y = win->_cury;
+short x = win->_curx;
+int code = OK;
+struct ldat *line;
+
+ T((T_CALLED("waddchnstr(%p,%p,%d)"), win, astr, n));
+
+ if (!win)
+ returnCode(ERR);
+
+ 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]);
+ memcpy(line->text+x, astr, n*sizeof(*astr));
+ CHANGED_RANGE(line, x, x+n-1);
+
+ _nc_synchook(win);
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_beep.c b/contrib/ncurses/ncurses/base/lib_beep.c
new file mode 100644
index 000000000000..9b89496608da
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_beep.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * beep.c
+ *
+ * The routine beep().
+ *
+ */
+
+#include <curses.priv.h>
+#include <term.h> /* beep, flash */
+
+MODULE_ID("$Id: lib_beep.c,v 1.6 1998/06/29 19:34:16 Alexander.V.Lukyanov Exp $")
+
+/*
+ * beep()
+ *
+ * Sound the current terminal's audible bell if it has one. If not,
+ * flash the screen if possible.
+ *
+ */
+
+int beep(void)
+{
+ int res = ERR;
+
+ T((T_CALLED("beep()")));
+
+ /* FIXME: should make sure that we are not in altchar mode */
+ if (bell) {
+ TPUTS_TRACE("bell");
+ res = putp(bell);
+ fflush(SP->_ofp);
+ } else if (flash_screen) {
+ TPUTS_TRACE("flash_screen");
+ res = putp(flash_screen);
+ fflush(SP->_ofp);
+ }
+
+ returnCode(res);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_bkgd.c b/contrib/ncurses/ncurses/base/lib_bkgd.c
new file mode 100644
index 000000000000..410ee0580433
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_bkgd.c
@@ -0,0 +1,86 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_bkgd.c,v 1.12 1998/02/11 12:13:54 tom Exp $")
+
+void wbkgdset(WINDOW *win, chtype ch)
+{
+ T((T_CALLED("wbkgdset(%p,%s)"), win, _tracechtype(ch)));
+
+ if (win) {
+ chtype off = AttrOf(win->_bkgd);
+ chtype on = AttrOf(ch);
+
+ toggle_attr_off(win->_attrs,off);
+ toggle_attr_on (win->_attrs,on);
+
+ if (TextOf(ch)==0)
+ ch |= BLANK;
+ win->_bkgd = ch;
+ }
+ returnVoid;
+}
+
+int wbkgd(WINDOW *win, const chtype ch)
+{
+ int code = ERR;
+ int x, y;
+ chtype new_bkgd = ch;
+
+ T((T_CALLED("wbkgd(%p,%s)"), win, _tracechtype(new_bkgd)));
+
+ if (win) {
+ chtype old_bkgd = getbkgd(win);
+
+ wbkgdset(win, new_bkgd);
+ wattrset(win, AttrOf(win->_bkgd));
+
+ for (y = 0; y <= win->_maxy; y++) {
+ for (x = 0; x <= win->_maxx; x++) {
+ if (win->_line[y].text[x] == old_bkgd)
+ win->_line[y].text[x] = win->_bkgd;
+ else
+ win->_line[y].text[x] =
+ _nc_render(win,(A_ALTCHARSET &
+ AttrOf(win->_line[y].text[x]))
+ | TextOf(win->_line[y].text[x]));
+ }
+ }
+ touchwin(win);
+ _nc_synchook(win);
+ code = OK;
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_box.c b/contrib/ncurses/ncurses/base/lib_box.c
new file mode 100644
index 000000000000..bcd96416f954
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_box.c
@@ -0,0 +1,110 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_box.c
+**
+** The routine wborder().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_box.c,v 1.10 1998/02/11 12:13:56 tom Exp $")
+
+int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts,
+ chtype bs, chtype tl, chtype tr, chtype bl, chtype br)
+{
+short i;
+short endx, endy;
+
+ T((T_CALLED("wborder(%p,%s,%s,%s,%s,%s,%s,%s,%s)"),
+ 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);
+
+ if (ls == 0) ls = ACS_VLINE;
+ if (rs == 0) rs = ACS_VLINE;
+ if (ts == 0) ts = ACS_HLINE;
+ if (bs == 0) bs = ACS_HLINE;
+ if (tl == 0) tl = ACS_ULCORNER;
+ if (tr == 0) tr = ACS_URCORNER;
+ if (bl == 0) bl = ACS_LLCORNER;
+ if (br == 0) br = ACS_LRCORNER;
+
+ ls = _nc_render(win, ls);
+ rs = _nc_render(win, rs);
+ ts = _nc_render(win, ts);
+ bs = _nc_render(win, bs);
+ tl = _nc_render(win, tl);
+ tr = _nc_render(win, tr);
+ bl = _nc_render(win, bl);
+ br = _nc_render(win, br);
+
+ T(("using %#lx, %#lx, %#lx, %#lx, %#lx, %#lx, %#lx, %#lx", ls, rs, ts, bs, tl, tr, bl, br));
+
+ endx = win->_maxx;
+ endy = win->_maxy;
+
+ for (i = 0; i <= endx; i++) {
+ win->_line[0].text[i] = ts;
+ win->_line[endy].text[i] = bs;
+ }
+ 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] = ls;
+ win->_line[i].text[endx] = rs;
+ win->_line[i].firstchar = 0;
+ win->_line[i].lastchar = endx;
+ }
+ win->_line[0].text[0] = tl;
+ win->_line[0].text[endx] = tr;
+ win->_line[endy].text[0] = bl;
+ win->_line[endy].text[endx] = br;
+
+ _nc_synchook(win);
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_chgat.c b/contrib/ncurses/ncurses/base/lib_chgat.c
new file mode 100644
index 000000000000..7690ae4a2af3
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_chgat.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_chgat.c
+**
+** The routine wchgat().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_chgat.c,v 1.2 1998/02/11 12:14:00 tom Exp $")
+
+int wchgat(WINDOW *win, int n, attr_t attr, short color, const void *opts GCC_UNUSED)
+{
+ int i;
+
+ T((T_CALLED("wchgat(%p,%d,%s,%d)"), win, n, _traceattr(attr), color));
+
+ if (win) {
+ toggle_attr_on(attr,COLOR_PAIR(color));
+
+ for (i = win->_curx; i <= win->_maxx && (n == -1 || (n-- > 0)); i++)
+ win->_line[win->_cury].text[i]
+ = TextOf(win->_line[win->_cury].text[i]) | attr;
+
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_clear.c b/contrib/ncurses/ncurses/base/lib_clear.c
new file mode 100644
index 000000000000..9c07cf0890e4
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_clear.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.5 1998/02/11 12:13:53 tom Exp $")
+
+int wclear(WINDOW *win)
+{
+int code = ERR;
+
+ T((T_CALLED("wclear(%p)"), win));
+
+ if ((code = werase(win))!=ERR)
+ win->_clear = TRUE;
+
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_clearok.c b/contrib/ncurses/ncurses/base/lib_clearok.c
new file mode 100644
index 000000000000..cc904b1d7dc7
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_clearok.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:00 tom Exp $")
+
+int clearok(WINDOW *win, bool flag)
+{
+ T((T_CALLED("clearok(%p,%d)"), win, flag));
+
+ if (win) {
+ win->_clear = flag;
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_clrbot.c b/contrib/ncurses/ncurses/base/lib_clrbot.c
new file mode 100644
index 000000000000..cec34161acef
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_clrbot.c
@@ -0,0 +1,75 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.14 1998/06/28 00:36:26 tom Exp $")
+
+int wclrtobot(WINDOW *win)
+{
+int code = ERR;
+
+ T((T_CALLED("wclrtobot(%p)"), win));
+
+ if (win) {
+ short y;
+ short startx = win->_curx;
+ chtype blank = _nc_background(win);
+
+ T(("clearing from y = %d to y = %d with maxx = %d", win->_cury, win->_maxy, win->_maxx));
+
+ for (y = win->_cury; y <= win->_maxy; y++) {
+ struct ldat *line = &(win->_line[y]);
+ chtype *ptr = &(line->text[startx]);
+ chtype *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/contrib/ncurses/ncurses/base/lib_clreol.c b/contrib/ncurses/ncurses/base/lib_clreol.c
new file mode 100644
index 000000000000..0c7522278e38
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_clreol.c
@@ -0,0 +1,91 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.15 1998/06/28 00:32:20 tom Exp $")
+
+int wclrtoeol(WINDOW *win)
+{
+int code = ERR;
+
+ T((T_CALLED("wclrtoeol(%p)"), win));
+
+ if (win) {
+ chtype blank;
+ chtype *ptr, *end;
+ struct ldat *line;
+ short y = win->_cury;
+ short 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 (win->_flags & _WRAPPED
+ && y < win->_maxy) {
+ win->_flags &= ~_WRAPPED;
+ }
+
+ /*
+ * There's no point in clearing if we're not on a legal
+ * position, either.
+ */
+ if (win->_flags & _WRAPPED
+ || y > win->_maxy
+ || x > win->_maxx)
+ returnCode(ERR);
+
+ blank = _nc_background(win);
+ 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/contrib/ncurses/ncurses/base/lib_color.c b/contrib/ncurses/ncurses/base/lib_color.c
new file mode 100644
index 000000000000..cdc943adc6ee
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_color.c
@@ -0,0 +1,429 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* lib_color.c
+ *
+ * Handles color emulation of SYS V curses
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <term.h>
+
+MODULE_ID("$Id: lib_color.c,v 1.35 1999/03/15 01:45:14 Alexander.V.Lukyanov Exp $")
+
+/*
+ * These should be screen structure members. They need to be globals for
+ * hystorical reasons. So we assign them in start_color() and also in
+ * set_term()'s screen-switching logic.
+ */
+int COLOR_PAIRS;
+int COLORS;
+
+/*
+ * 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
+
+static const color_t cga_palette[] =
+{
+ /* R G B */
+ {RGB_OFF, RGB_OFF, RGB_OFF}, /* COLOR_BLACK */
+ {RGB_ON, RGB_OFF, RGB_OFF}, /* COLOR_RED */
+ {RGB_OFF, RGB_ON, RGB_OFF}, /* COLOR_GREEN */
+ {RGB_ON, RGB_ON, RGB_OFF}, /* COLOR_YELLOW */
+ {RGB_OFF, RGB_OFF, RGB_ON}, /* COLOR_BLUE */
+ {RGB_ON, RGB_OFF, RGB_ON}, /* COLOR_MAGENTA */
+ {RGB_OFF, RGB_ON, RGB_ON}, /* COLOR_CYAN */
+ {RGB_ON, RGB_ON, RGB_ON}, /* COLOR_WHITE */
+};
+static const color_t hls_palette[] =
+{
+ /* H L S */
+ {0, 0, 0}, /* COLOR_BLACK */
+ {120, 50, 100}, /* COLOR_RED */
+ {240, 50, 100}, /* COLOR_GREEN */
+ {180, 50, 100}, /* COLOR_YELLOW */
+ {330, 50, 100}, /* COLOR_BLUE */
+ {60, 50, 100}, /* COLOR_MAGENTA */
+ {300, 50, 100}, /* COLOR_CYAN */
+ {0, 50, 100}, /* COLOR_WHITE */
+};
+
+/*
+ * 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 void set_background_color(int bg, int (*outc)(int))
+{
+ if (set_a_background)
+ {
+ TPUTS_TRACE("set_a_background");
+ tputs(tparm(set_a_background, bg), 1, outc);
+ }
+ else
+ {
+ TPUTS_TRACE("set_background");
+ tputs(tparm(set_background, toggled_colors(bg)), 1, outc);
+ }
+}
+
+static void set_foreground_color(int fg, int (*outc)(int))
+{
+ if (set_a_foreground)
+ {
+ TPUTS_TRACE("set_a_foreground");
+ tputs(tparm(set_a_foreground, fg), 1, outc);
+ }
+ else
+ {
+ TPUTS_TRACE("set_foreground");
+ tputs(tparm(set_foreground, toggled_colors(fg)), 1, outc);
+ }
+}
+
+static bool set_original_colors(void)
+{
+ if (orig_pair != 0) {
+ TPUTS_TRACE("orig_pair");
+ putp(orig_pair);
+ return TRUE;
+ }
+ else if (orig_colors != NULL)
+ {
+ TPUTS_TRACE("orig_colors");
+ putp(orig_colors);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+int start_color(void)
+{
+ T((T_CALLED("start_color()")));
+
+ if (set_original_colors() != TRUE)
+ {
+ set_foreground_color(COLOR_WHITE, _nc_outch);
+ set_background_color(COLOR_BLACK, _nc_outch);
+ }
+
+ if (max_pairs != -1)
+ COLOR_PAIRS = SP->_pair_count = max_pairs;
+ else
+ returnCode(ERR);
+ if ((SP->_color_pairs = typeCalloc(unsigned short, max_pairs)) == 0)
+ returnCode(ERR);
+ SP->_color_pairs[0] = PAIR_OF(COLOR_WHITE, COLOR_BLACK);
+ if (max_colors != -1)
+ COLORS = SP->_color_count = max_colors;
+ else
+ returnCode(ERR);
+ SP->_coloron = 1;
+
+ if ((SP->_color_table = typeMalloc(color_t, COLORS)) == 0)
+ returnCode(ERR);
+ if (hue_lightness_saturation)
+ memcpy(SP->_color_table, hls_palette, sizeof(color_t) * COLORS);
+ else
+ memcpy(SP->_color_table, cga_palette, sizeof(color_t) * COLORS);
+
+ T(("started color: COLORS = %d, COLOR_PAIRS = %d", COLORS, COLOR_PAIRS));
+
+ returnCode(OK);
+}
+
+/* This function was originally written by Daniel Weaver <danw@znyx.com> */
+static void rgb2hls(short r, short g, short b, short *h, short *l, short *s)
+/* convert RGB to HLS system */
+{
+ short 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;
+}
+
+/*
+ * Extension (1997/1/18) - Allow negative f/b values to set default color
+ * values.
+ */
+int init_pair(short pair, short f, short b)
+{
+ unsigned result;
+
+ T((T_CALLED("init_pair(%d,%d,%d)"), pair, f, b));
+
+ if ((pair < 1) || (pair >= COLOR_PAIRS))
+ returnCode(ERR);
+ if (SP->_default_color)
+ {
+ if (f < 0)
+ f = C_MASK;
+ if (b < 0)
+ b = C_MASK;
+ if (f >= COLORS && f != C_MASK)
+ returnCode(ERR);
+ if (b >= COLORS && b != C_MASK)
+ returnCode(ERR);
+ }
+ else
+ if ((f < 0) || (f >= COLORS)
+ || (b < 0) || (b >= COLORS))
+ 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).
+ */
+ result = PAIR_OF(f,b);
+ if (SP->_color_pairs[pair] != 0
+ && SP->_color_pairs[pair] != result) {
+ int y, x;
+ attr_t z = COLOR_PAIR(pair);
+
+ for (y = 0; y <= curscr->_maxy; y++) {
+ struct ldat *ptr = &(curscr->_line[y]);
+ bool changed = FALSE;
+ for (x = 0; x <= curscr->_maxx; x++) {
+ if ((ptr->text[x] & A_COLOR) == z) {
+ /* Set the old cell to zero to ensure it will be
+ updated on the next doupdate() */
+ ptr->text[x] = 0;
+ CHANGED_CELL(ptr,x);
+ changed = TRUE;
+ }
+ }
+ if (changed)
+ _nc_make_oldhash(y);
+ }
+ }
+ SP->_color_pairs[pair] = result;
+
+ if (initialize_pair)
+ {
+ const color_t *tp = hue_lightness_saturation ? hls_palette : cga_palette;
+
+ T(("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));
+
+ if (initialize_pair)
+ {
+ TPUTS_TRACE("initialize_pair");
+ putp(tparm(initialize_pair,
+ pair,
+ tp[f].red, tp[f].green, tp[f].blue,
+ tp[b].red, tp[b].green, tp[b].blue));
+ }
+ }
+
+ returnCode(OK);
+}
+
+int init_color(short color, short r, short g, short b)
+{
+ T((T_CALLED("init_color(%d,%d,%d,%d)"), color, r, g, b));
+
+ if (initialize_color == NULL)
+ returnCode(ERR);
+
+ if (color < 0 || color >= COLORS)
+ returnCode(ERR);
+ if (r < 0 || r > 1000 || g < 0 || g > 1000 || b < 0 || b > 1000)
+ returnCode(ERR);
+
+ if (hue_lightness_saturation)
+ 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;
+ }
+
+ if (initialize_color)
+ {
+ TPUTS_TRACE("initialize_color");
+ putp(tparm(initialize_color, color, r, g, b));
+ }
+ returnCode(OK);
+}
+
+bool can_change_color(void)
+{
+ T((T_CALLED("can_change_color()")));
+ returnCode ((can_change != 0) ? TRUE : FALSE);
+}
+
+bool has_colors(void)
+{
+ T((T_CALLED("has_colors()")));
+ returnCode (((max_colors != -1) && (max_pairs != -1)
+ && (((set_foreground != NULL)
+ && (set_background != NULL))
+ || ((set_a_foreground != NULL)
+ && (set_a_background != NULL))
+ || set_color_pair)) ? TRUE : FALSE);
+}
+
+int color_content(short color, short *r, short *g, short *b)
+{
+ T((T_CALLED("color_content(%d,%p,%p,%p)"), color, r, g, b));
+ if (color < 0 || color > COLORS)
+ returnCode(ERR);
+
+ if (r) *r = SP->_color_table[color].red;
+ if (g) *g = SP->_color_table[color].green;
+ if (b) *b = SP->_color_table[color].blue;
+ returnCode(OK);
+}
+
+int pair_content(short pair, short *f, short *b)
+{
+ T((T_CALLED("pair_content(%d,%p,%p)"), pair, f, b));
+
+ if ((pair < 0) || (pair > COLOR_PAIRS))
+ returnCode(ERR);
+ if (f) *f = ((SP->_color_pairs[pair] >> C_SHIFT) & C_MASK);
+ if (b) *b = (SP->_color_pairs[pair] & C_MASK);
+
+ returnCode(OK);
+}
+
+void _nc_do_color(int pair, bool reverse, int (*outc)(int))
+{
+ short fg, bg;
+
+ if (pair == 0)
+ {
+ if (orig_pair)
+ {
+ TPUTS_TRACE("orig_pair");
+ tputs(orig_pair, 1, outc);
+ }
+ else if (set_color_pair)
+ {
+ TPUTS_TRACE("set_color_pair");
+ tputs(tparm(set_color_pair, pair), 1, outc);
+ }
+ else
+ {
+ set_foreground_color(COLOR_WHITE, outc);
+ set_background_color(COLOR_BLACK, outc);
+ }
+ }
+ else
+ {
+ if (set_color_pair)
+ {
+ TPUTS_TRACE("set_color_pair");
+ tputs(tparm(set_color_pair, pair), 1, outc);
+ }
+ else
+ {
+ pair_content(pair, &fg, &bg);
+ if (reverse) {
+ short xx = fg;
+ fg = bg;
+ bg = xx;
+ }
+
+ T(("setting colors: pair = %d, fg = %d, bg = %d", pair, fg, bg));
+
+ if (fg == C_MASK || bg == C_MASK)
+ {
+ if (set_original_colors() != TRUE)
+ {
+ if (fg == C_MASK)
+ set_foreground_color(COLOR_WHITE, outc);
+ if (bg == C_MASK)
+ set_background_color(COLOR_BLACK, outc);
+ }
+ }
+ if (fg != C_MASK)
+ {
+ set_foreground_color(fg, outc);
+ }
+ if (bg != C_MASK)
+ {
+ set_background_color(bg, outc);
+ }
+ }
+ }
+}
diff --git a/contrib/ncurses/ncurses/base/lib_colorset.c b/contrib/ncurses/ncurses/base/lib_colorset.c
new file mode 100644
index 000000000000..d9fc5c28dc01
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_colorset.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1998 *
+ ****************************************************************************/
+
+/*
+** lib_colorset.c
+**
+** The routine wcolor_set().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_colorset.c,v 1.5 1999/05/16 17:13:43 juergen Exp $")
+
+int wcolor_set(WINDOW *win, short color_pair_number, void *opts)
+{
+ T((T_CALLED("wcolor_set(%p,%d)"), win, color_pair_number));
+ if (win && !opts && (color_pair_number >= 0) && (color_pair_number < COLOR_PAIRS)) {
+ T(("... current %ld", (long) PAIR_NUMBER(win->_attrs)));
+ toggle_attr_on(win->_attrs,COLOR_PAIR(color_pair_number));
+ returnCode(OK);
+ } else
+ returnCode(ERR);
+}
+
+
diff --git a/contrib/ncurses/ncurses/base/lib_delch.c b/contrib/ncurses/ncurses/base/lib_delch.c
new file mode 100644
index 000000000000..0169d31ac6d5
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_delch.c
@@ -0,0 +1,68 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.8 1998/06/28 00:28:17 tom Exp $")
+
+int wdelch(WINDOW *win)
+{
+int code = ERR;
+
+ T((T_CALLED("wdelch(%p)"), win));
+
+ if (win) {
+ chtype blank = _nc_background(win);
+ struct ldat *line = &(win->_line[win->_cury]);
+ chtype *end = &(line->text[win->_maxx]);
+ chtype *temp2 = &(line->text[win->_curx + 1]);
+ chtype *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/contrib/ncurses/ncurses/base/lib_delwin.c b/contrib/ncurses/ncurses/base/lib_delwin.c
new file mode 100644
index 000000000000..7bab0c77b02b
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_delwin.c
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_delwin.c
+**
+** The routine delwin().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_delwin.c,v 1.9 1998/02/11 12:13:53 tom Exp $")
+
+static bool have_children(WINDOW *win)
+{
+ WINDOWLIST *p;
+ for (p = _nc_windows; p != 0; p = p->next) {
+ if (p->win->_flags & _SUBWIN
+ && p->win->_parent == win)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+int delwin(WINDOW *win)
+{
+ T((T_CALLED("delwin(%p)"), win));
+
+ if (win == 0
+ || have_children(win))
+ returnCode(ERR);
+
+ if (win->_flags & _SUBWIN)
+ touchwin(win->_parent);
+ else if (curscr != 0)
+ touchwin(curscr);
+
+ _nc_freewin(win);
+
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_dft_fgbg.c b/contrib/ncurses/ncurses/base/lib_dft_fgbg.c
new file mode 100644
index 000000000000..a2dfbd218f74
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_dft_fgbg.c
@@ -0,0 +1,60 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+#include <curses.priv.h>
+#include <term.h>
+
+MODULE_ID("$Id: lib_dft_fgbg.c,v 1.3 1998/02/11 12:13:54 tom Exp $")
+
+/*
+ * Modify the behavior of color-pair 0 so that the library doesn't assume that
+ * it is black on white. This is an extension to XSI curses.
+ *
+ * Invoke this function after 'start_color()'.
+ */
+int
+use_default_colors(void)
+{
+ T((T_CALLED("use_default_colors()")));
+
+ if (!SP->_coloron)
+ returnCode(ERR);
+
+ if (!orig_pair && !orig_colors)
+ returnCode(ERR);
+
+ if (initialize_pair) /* don't know how to handle this */
+ returnCode(ERR);
+
+ SP->_default_color = TRUE;
+ SP->_color_pairs[0] = PAIR_OF(C_MASK, C_MASK);
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_echo.c b/contrib/ncurses/ncurses/base/lib_echo.c
new file mode 100644
index 000000000000..4ccf97ff64c0
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_echo.c
@@ -0,0 +1,60 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * echo.c
+ *
+ * Routines:
+ * echo()
+ * noecho()
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_echo.c,v 1.3 1998/10/12 13:15:33 Alexander.V.Lukyanov Exp $")
+
+int echo(void)
+{
+ T((T_CALLED("echo()")));
+ SP->_echo = TRUE;
+ returnCode(OK);
+}
+
+int noecho(void)
+{
+ T((T_CALLED("noecho()")));
+ SP->_echo = FALSE;
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_endwin.c b/contrib/ncurses/ncurses/base/lib_endwin.c
new file mode 100644
index 000000000000..31b6e516cc1d
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_endwin.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_endwin.c
+**
+** The routine endwin().
+**
+*/
+
+#include <curses.priv.h>
+#include <term.h>
+
+MODULE_ID("$Id: lib_endwin.c,v 1.17 1999/06/12 23:01:46 tom Exp $")
+
+int
+endwin(void)
+{
+ T((T_CALLED("endwin()")));
+
+ if (SP) {
+ SP->_endwin = TRUE;
+ SP->_mouse_wrap(SP);
+ _nc_screen_wrap();
+ _nc_mvcur_wrap(); /* wrap up cursor addressing */
+ returnCode(reset_shell_mode());
+ }
+
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_erase.c b/contrib/ncurses/ncurses/base/lib_erase.c
new file mode 100644
index 000000000000..1e4237bf8056
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_erase.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_erase.c
+**
+** The routine werase().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_erase.c,v 1.11 1998/02/11 12:13:54 tom Exp $")
+
+int werase(WINDOW *win)
+{
+int code = ERR;
+int y;
+chtype blank;
+chtype *sp, *end, *start;
+
+ T((T_CALLED("werase(%p)"), win));
+
+ if (win) {
+ blank = _nc_background(win);
+ for (y = 0; y <= win->_maxy; y++) {
+ start = win->_line[y].text;
+ end = &start[win->_maxx];
+
+ 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/contrib/ncurses/ncurses/base/lib_flash.c b/contrib/ncurses/ncurses/base/lib_flash.c
new file mode 100644
index 000000000000..faf381f3a645
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_flash.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * flash.c
+ *
+ * The routine flash().
+ *
+ */
+
+#include <curses.priv.h>
+#include <term.h> /* beep, flash */
+
+MODULE_ID("$Id: lib_flash.c,v 1.3 1998/06/29 19:34:16 Alexander.V.Lukyanov Exp $")
+
+/*
+ * flash()
+ *
+ * Flash the current terminal's screen if possible. If not,
+ * sound the audible bell if one exists.
+ *
+ */
+
+int flash(void)
+{
+ int res = ERR;
+
+ T((T_CALLED("flash()")));
+
+ /* FIXME: should make sure that we are not in altchar mode */
+ if (flash_screen) {
+ TPUTS_TRACE("flash_screen");
+ res = putp(flash_screen);
+ fflush(SP->_ofp);
+ } else if (bell) {
+ TPUTS_TRACE("bell");
+ res = putp(bell);
+ fflush(SP->_ofp);
+ }
+
+ returnCode(res);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_freeall.c b/contrib/ncurses/ncurses/base/lib_freeall.c
new file mode 100644
index 000000000000..e9a11ac36f26
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_freeall.c
@@ -0,0 +1,134 @@
+/****************************************************************************
+ * Copyright (c) 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> 1996,1997 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <term_entry.h>
+
+#if HAVE_NC_FREEALL
+
+#if HAVE_LIBDBMALLOC
+extern int malloc_errfd; /* FIXME */
+#endif
+
+MODULE_ID("$Id: lib_freeall.c,v 1.14 1999/04/03 23:17:06 tom Exp $")
+
+static void free_slk(SLK *p)
+{
+ if (p != 0) {
+ FreeIfNeeded(p->ent);
+ FreeIfNeeded(p->buffer);
+ free(p);
+ }
+}
+
+static void free_tries(struct tries *p)
+{
+ struct tries *q;
+
+ while (p != 0) {
+ q = p->sibling;
+ if (p->child != 0)
+ free_tries(p->child);
+ free(p);
+ p = q;
+ }
+}
+
+/*
+ * Free all ncurses data. This is used for testing only (there's no practical
+ * use for it as an extension).
+ */
+void _nc_freeall(void)
+{
+ WINDOWLIST *p, *q;
+
+#if NO_LEAKS
+ _nc_free_tparm();
+#endif
+ while (_nc_windows != 0) {
+ /* Delete only windows that're not a parent */
+ for (p = _nc_windows; p != 0; p = p->next) {
+ bool found = FALSE;
+
+ for (q = _nc_windows; q != 0; q = q->next) {
+ if ((p != q)
+ && (q->win->_flags & _SUBWIN)
+ && (p->win == q->win->_parent)) {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found) {
+ delwin(p->win);
+ break;
+ }
+ }
+ }
+
+ if (SP != 0) {
+ free_tries (SP->_keytry);
+ free_tries (SP->_key_ok);
+ free_slk(SP->_slk);
+ FreeIfNeeded(SP->_color_pairs);
+ FreeIfNeeded(SP->_color_table);
+ /* it won't free buffer anyway */
+/* _nc_set_buffer(SP->_ofp, FALSE);*/
+#if !BROKEN_LINKER
+ FreeAndNull(SP);
+#endif
+ }
+
+ if (cur_term != 0) {
+ _nc_free_termtype(&(cur_term->type));
+ free(cur_term);
+ }
+
+#ifdef TRACE
+ (void) _nc_trace_buf(-1, 0);
+#endif
+#if HAVE_LIBDBMALLOC
+ malloc_dump(malloc_errfd);
+#elif HAVE_LIBDMALLOC
+#elif HAVE_PURIFY
+ purify_all_inuse();
+#endif
+}
+
+void _nc_free_and_exit(int code)
+{
+ _nc_freeall();
+ exit(code);
+}
+#else
+void _nc_freeall(void) { }
+#endif
diff --git a/contrib/ncurses/ncurses/base/lib_getch.c b/contrib/ncurses/ncurses/base/lib_getch.c
new file mode 100644
index 000000000000..b740885b8166
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_getch.c
@@ -0,0 +1,414 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_getch.c
+**
+** The routine getch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_getch.c,v 1.43 1999/03/08 02:35:10 tom Exp $")
+
+#include <fifo_defs.h>
+
+int ESCDELAY = 1000; /* max interval betw. chars in funkeys, in millisecs */
+
+#ifdef USE_EMX_MOUSE
+# include <sys/select.h>
+static int
+kbd_mouse_read(unsigned char *p)
+{
+fd_set fdset;
+int nums = SP->_ifd+1;
+
+ for (;;) {
+ FD_ZERO(&fdset);
+ FD_SET(SP->_checkfd, &fdset);
+ if (SP->_mouse_fd >= 0) {
+ FD_SET(SP->_mouse_fd, &fdset);
+ if (SP->_mouse_fd > SP->_checkfd)
+ nums = SP->_mouse_fd+1;
+ }
+ if (select(nums, &fdset, NULL, NULL, NULL) >= 0) {
+ int n;
+
+ if (FD_ISSET(SP->_mouse_fd, &fdset)) /* Prefer mouse */
+ n = read(SP->_mouse_fd, p, 1);
+ else
+ n = read(SP->_ifd, p, 1);
+ return n;
+ }
+ if (errno != EINTR)
+ return -1;
+ }
+}
+#endif /* USE_EMX_MOUSE */
+
+static inline int fifo_peek(void)
+{
+ int ch = SP->_fifo[peek];
+ T(("peeking at %d", peek));
+
+ p_inc();
+ return ch;
+}
+
+
+static inline int fifo_pull(void)
+{
+int ch;
+ ch = SP->_fifo[head];
+ T(("pulling %d from %d", ch, head));
+
+ if (peek == head)
+ {
+ h_inc();
+ peek = head;
+ }
+ else
+ h_inc();
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_IEVENT) _nc_fifo_dump();
+#endif
+ return ch;
+}
+
+static inline int fifo_push(void)
+{
+int n;
+unsigned int ch;
+
+ if (tail == -1) return ERR;
+
+#ifdef HIDE_EINTR
+again:
+ errno = 0;
+#endif
+
+#if USE_GPM_SUPPORT
+ if ((SP->_mouse_fd >= 0)
+ && (_nc_timed_wait(3, -1, (int *)0) & 2))
+ {
+ SP->_mouse_event(SP);
+ ch = KEY_MOUSE;
+ n = 1;
+ } else
+#endif
+ {
+ unsigned char c2=0;
+#ifdef USE_EMX_MOUSE
+ n = kbd_mouse_read(&c2);
+#else
+ n = read(SP->_ifd, &c2, 1);
+#endif
+ ch = c2 & 0xff;
+ }
+
+#ifdef HIDE_EINTR
+ /*
+ * Under System V curses with non-restarting signals, getch() returns
+ * with value ERR when a handled signal keeps it from completing.
+ * If signals restart system calls, OTOH, the signal is invisible
+ * except to its handler.
+ *
+ * We don't want this difference to show. This piece of code
+ * tries to make it look like we always have restarting signals.
+ */
+ if (n <= 0 && errno == EINTR)
+ goto again;
+#endif
+
+ if ((n == -1) || (n == 0))
+ {
+ T(("read(%d,&ch,1)=%d, errno=%d", SP->_ifd, n, errno));
+ return ERR;
+ }
+ T(("read %d characters", n));
+
+ SP->_fifo[tail] = ch;
+ SP->_fifohold = 0;
+ if (head == -1)
+ head = peek = tail;
+ t_inc();
+ T(("pushed %#x at %d", ch, tail));
+#ifdef TRACE
+ if (_nc_tracing & TRACE_IEVENT) _nc_fifo_dump();
+#endif
+ return ch;
+}
+
+static inline void fifo_clear(void)
+{
+int i;
+ for (i = 0; i < FIFO_SIZE; i++)
+ SP->_fifo[i] = 0;
+ head = -1; tail = peek = 0;
+}
+
+static int kgetch(WINDOW *);
+
+#define wgetch_should_refresh(win) (\
+ (is_wintouched(win) || (win->_flags & _HASMOVED)) \
+ && !(win->_flags & _ISPAD))
+
+int
+wgetch(WINDOW *win)
+{
+int ch;
+
+ T((T_CALLED("wgetch(%p)"), win));
+
+ if (!win)
+ returnCode(ERR);
+
+ if (cooked_key_in_fifo())
+ {
+ if (wgetch_should_refresh(win))
+ wrefresh(win);
+
+ ch = fifo_pull();
+ T(("wgetch returning (pre-cooked): %#x = %s", ch, _trace_key(ch));)
+ returnCode(ch);
+ }
+
+ /*
+ * 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->_raw && !SP->_cbreak)
+ {
+ char buf[MAXCOLUMNS], *sp;
+
+ T(("filling queue in cooked mode"));
+
+ wgetnstr(win, buf, MAXCOLUMNS);
+
+ /* ungetch in reverse order */
+ ungetch('\n');
+ for (sp = buf+strlen(buf); sp>buf; sp--)
+ ungetch(sp[-1]);
+
+ returnCode(fifo_pull());
+ }
+
+ if (wgetch_should_refresh(win))
+ wrefresh(win);
+
+ if (!win->_notimeout && (win->_delay >= 0 || SP->_cbreak > 1))
+ {
+ int delay;
+
+ T(("timed delay in wgetch()"));
+ if (SP->_cbreak > 1)
+ delay = (SP->_cbreak - 1) * 100;
+ else
+ delay = win->_delay;
+
+ T(("delay is %d milliseconds", delay));
+
+ if (head == -1) /* fifo is empty */
+ if (!_nc_timed_wait(3, delay, (int *)0))
+ returnCode(ERR);
+ /* 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's 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(win);
+ if (ch == KEY_MOUSE)
+ {
+ ++runcount;
+ if (SP->_mouse_inline(SP))
+ break;
+ }
+ } while
+ (ch == KEY_MOUSE
+ && (_nc_timed_wait(3, SP->_maxclick, (int *)0)
+ || !SP->_mouse_parse(runcount)));
+ if (runcount > 0 && ch != KEY_MOUSE)
+ {
+ /* mouse event sequence ended by keystroke, push it */
+ ungetch(ch);
+ ch = KEY_MOUSE;
+ }
+ } else {
+ if (head == -1)
+ fifo_push();
+ ch = fifo_pull();
+ }
+
+ if (ch == ERR)
+ {
+#if USE_SIZECHANGE
+ if(SP->_sig_winch)
+ {
+ _nc_update_screensize();
+ /* resizeterm can push KEY_RESIZE */
+ if(cooked_key_in_fifo())
+ {
+ ch = fifo_pull();
+ T(("wgetch returning (pre-cooked): %#x = %s", ch, _trace_key(ch));)
+ returnCode(ch);
+ }
+ }
+#endif
+ T(("wgetch returning ERR"));
+ returnCode(ERR);
+ }
+
+ /*
+ * 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 ((ch < KEY_MIN) && (ch & 0x80))
+ if (!SP->_use_meta)
+ ch &= 0x7f;
+
+ if (SP->_echo && ch < KEY_MIN && !(win->_flags & _ISPAD))
+ wechochar(win, (chtype)ch);
+
+ T(("wgetch returning : %#x = %s", ch, _trace_key(ch)));
+
+ returnCode(ch);
+}
+
+
+/*
+** 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 is no cooked keys in queue.
+** (that is head==-1 || peek==head)
+**
+*/
+
+static int
+kgetch(WINDOW *win GCC_UNUSED)
+{
+struct tries *ptr;
+int ch = 0;
+int timeleft = ESCDELAY;
+
+ TR(TRACE_IEVENT, ("kgetch(%p) called", win));
+
+ ptr = SP->_keytry;
+
+ for(;;)
+ {
+ if (!raw_key_in_fifo())
+ {
+ if(fifo_push() == ERR)
+ {
+ peek = head; /* the keys stay uninterpreted */
+ return ERR;
+ }
+ }
+ ch = fifo_peek();
+ if (ch >= KEY_MIN)
+ {
+ peek = head;
+ /* assume the key is the last in fifo */
+ t_dec(); /* remove the key */
+ return ch;
+ }
+
+ TR(TRACE_IEVENT, ("ch: %s", _trace_key((unsigned char)ch)));
+ while ((ptr != NULL) && (ptr->ch != (unsigned char)ch))
+ ptr = ptr->sibling;
+#ifdef TRACE
+ if (ptr == NULL)
+ {TR(TRACE_IEVENT, ("ptr is null"));}
+ else
+ TR(TRACE_IEVENT, ("ptr=%p, ch=%d, value=%d",
+ ptr, ptr->ch, ptr->value));
+#endif /* TRACE */
+
+ if (ptr == NULL)
+ break;
+
+ if (ptr->value != 0) { /* sequence terminated */
+ TR(TRACE_IEVENT, ("end of sequence"));
+ if (peek == tail)
+ fifo_clear();
+ else
+ head = peek;
+ return(ptr->value);
+ }
+
+ ptr = ptr->child;
+
+ if (!raw_key_in_fifo())
+ {
+ TR(TRACE_IEVENT, ("waiting for rest of sequence"));
+ if (!_nc_timed_wait(3, timeleft, &timeleft)) {
+ TR(TRACE_IEVENT, ("ran out of time"));
+ break;
+ }
+ }
+ }
+ ch = fifo_pull();
+ peek = head;
+ return ch;
+}
diff --git a/contrib/ncurses/ncurses/base/lib_getstr.c b/contrib/ncurses/ncurses/base/lib_getstr.c
new file mode 100644
index 000000000000..485c6e35c8ff
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_getstr.c
@@ -0,0 +1,192 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_getstr.c
+**
+** The routine wgetstr().
+**
+*/
+
+#include <curses.priv.h>
+#include <term.h>
+
+MODULE_ID("$Id: lib_getstr.c,v 1.20 1998/12/20 00:16:01 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, bool 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, ' ');
+
+ wmove(win, y, x);
+ }
+ }
+ return last;
+}
+
+int wgetnstr(WINDOW *win, char *str, int maxlen)
+{
+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)"), win, str, maxlen));
+
+ if (!win)
+ returnCode(ERR);
+
+ _nc_get_tty_mode(&buf);
+
+ oldnl = SP->_nl;
+ oldecho = SP->_echo;
+ oldraw = SP->_raw;
+ oldcbreak = SP->_cbreak;
+ nl();
+ noecho();
+ noraw();
+ cbreak();
+
+ erasec = erasechar();
+ killc = killchar();
+
+ oldstr = str;
+ getyx(win, y, x);
+
+ if (is_wintouched(win) || (win->_flags & _HASMOVED))
+ wrefresh(win);
+
+ while ((ch = wgetch(win)) != ERR) {
+ /*
+ * Some terminals (the Wyse-50 is the most common) generate
+ * a \n from the down-arrow key. With this logic, it's 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, '\n');
+ break;
+ }
+ 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
+ || (maxlen >= 0 && str - oldstr >= maxlen)) {
+ beep();
+ } else {
+ *str++ = ch;
+ if (oldecho == TRUE) {
+ int oldy = win->_cury;
+ if (waddch(win, 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, ' ');
+ str = WipeOut(win, y, x, oldstr, str, oldecho);
+ continue;
+ } else if (win->_flags & _WRAPPED) {
+ /*
+ * 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;
+
+ _nc_set_tty_mode(&buf);
+
+ *str = '\0';
+ if (ch == ERR)
+ returnCode(ERR);
+
+ T(("wgetnstr returns %s", _nc_visbuf(oldstr)));
+
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_hline.c b/contrib/ncurses/ncurses/base/lib_hline.c
new file mode 100644
index 000000000000..3b0a602eeee9
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_hline.c
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_hline.c
+**
+** The routine whline().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_hline.c,v 1.4 1998/06/28 00:11:01 tom Exp $")
+
+int whline(WINDOW *win, chtype ch, int n)
+{
+int code = ERR;
+short start;
+short end;
+
+ T((T_CALLED("whline(%p,%s,%d)"), win, _tracechtype(ch), n));
+
+ if (win) {
+ struct ldat *line = &(win->_line[win->_cury]);
+
+ start = win->_curx;
+ end = start + n - 1;
+ if (end > win->_maxx)
+ end = win->_maxx;
+
+ CHANGED_RANGE(line, start, end);
+
+ if (ch == 0)
+ ch = ACS_HLINE;
+ ch = _nc_render(win, ch);
+
+ while ( end >= start) {
+ line->text[end] = ch;
+ end--;
+ }
+ code = OK;
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_immedok.c b/contrib/ncurses/ncurses/base/lib_immedok.c
new file mode 100644
index 000000000000..5590ec9f5406
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_immedok.c
@@ -0,0 +1,54 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:01 tom Exp $")
+
+void immedok(WINDOW *win, bool flag)
+{
+ T((T_CALLED("immedok(%p,%d)"), win, flag));
+
+ if (win)
+ win->_immed = flag;
+
+ returnVoid;
+}
diff --git a/contrib/ncurses/ncurses/base/lib_inchstr.c b/contrib/ncurses/ncurses/base/lib_inchstr.c
new file mode 100644
index 000000000000..4779ae09d75b
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_inchstr.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_inchstr.c
+**
+** The routine winchnstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_inchstr.c,v 1.7 1998/02/11 12:13:55 tom Exp $")
+
+int winchnstr(WINDOW *win, chtype *str, int n)
+{
+ int i = 0;
+
+ T((T_CALLED("winchnstr(%p,%p,%d)"), win, str, n));
+
+ if (!str)
+ returnCode(0);
+
+ if (win) {
+ for (; (n < 0 || (i < n)) && (win->_curx + i <= win->_maxx); i++)
+ str[i] = win->_line[win->_cury].text[win->_curx + i];
+ }
+ str[i] = (chtype)0;
+
+ returnCode(i);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_initscr.c b/contrib/ncurses/ncurses/base/lib_initscr.c
new file mode 100644
index 000000000000..9a89a077cd44
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_initscr.c
@@ -0,0 +1,78 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_initscr.c
+**
+** The routines initscr(), and termname().
+**
+*/
+
+#include <curses.priv.h>
+#include <tic.h> /* for MAX_ALIAS */
+
+#if HAVE_SYS_TERMIO_H
+#include <sys/termio.h> /* needed for ISC */
+#endif
+
+MODULE_ID("$Id: lib_initscr.c,v 1.26 1998/12/19 23:10:09 tom Exp $")
+
+WINDOW *initscr(void)
+{
+static bool initialized = FALSE;
+NCURSES_CONST char *name;
+int value;
+
+ T((T_CALLED("initscr()")));
+ /* Portable applications must not call initscr() more than once */
+ if (!initialized) {
+ initialized = TRUE;
+
+ if ((name = getenv("TERM")) == 0
+ || *name == '\0')
+ name = "unknown";
+ if (newterm(name, stdout, stdin) == 0) {
+ fprintf(stderr, "Error opening terminal: %s.\n", name);
+ exit(EXIT_FAILURE);
+ }
+
+ /* allow user to set maximum escape delay from the environment */
+ if ((value = _nc_getenv_num("ESCDELAY")) >= 0) {
+ ESCDELAY = value;
+ }
+
+ /* def_shell_mode - done in newterm/_nc_setupscreen */
+ def_prog_mode();
+ }
+ returnWin(stdscr);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_insch.c b/contrib/ncurses/ncurses/base/lib_insch.c
new file mode 100644
index 000000000000..ccc5ff5d024d
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_insch.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_insch.c
+**
+** The routine winsch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_insch.c,v 1.10 1998/06/28 00:26:52 tom Exp $")
+
+int winsch(WINDOW *win, chtype c)
+{
+int code = ERR;
+
+ T((T_CALLED("winsch(%p, %s)"), win, _tracechtype(c)));
+
+ if (win) {
+ struct ldat *line = &(win->_line[win->_cury]);
+ chtype *end = &(line->text[win->_curx]);
+ chtype *temp1 = &(line->text[win->_maxx]);
+ chtype *temp2 = temp1 - 1;
+
+ CHANGED_TO_EOL(line, win->_curx, win->_maxx);
+ while (temp1 > end)
+ *temp1-- = *temp2--;
+
+ *temp1 = _nc_render(win, c);
+ code = OK;
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_insdel.c b/contrib/ncurses/ncurses/base/lib_insdel.c
new file mode 100644
index 000000000000..48e108de8d9b
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_insdel.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.8 1998/02/11 12:13:55 tom Exp $")
+
+int
+winsdelln(WINDOW *win, int n)
+{
+int code = ERR;
+
+ T((T_CALLED("winsdel(%p,%d)"), win, n));
+
+ if (win) {
+ if (n != 0) {
+ _nc_scroll_window(win, -n, win->_cury, win->_maxy, _nc_background(win));
+ _nc_synchook(win);
+ }
+ code = OK;
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_insstr.c b/contrib/ncurses/ncurses/base/lib_insstr.c
new file mode 100644
index 000000000000..cba147318b8e
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_insstr.c
@@ -0,0 +1,81 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_insstr.c
+**
+** The routine winsnstr().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_insstr.c,v 1.13 1999/03/14 00:27:21 tom Exp $")
+
+int winsnstr(WINDOW *win, const char *s, int n)
+{
+int code = ERR;
+short oy;
+short ox ;
+const unsigned char *str = (const unsigned char *)s;
+const unsigned char *cp;
+
+ T((T_CALLED("winsnstr(%p,%s,%d)"), win, _nc_visbuf(s), n));
+
+ if (win && str) {
+ oy = win->_cury; ox = win->_curx;
+ for (cp = str; *cp && (n <= 0 || (cp - str) < n); cp++) {
+ if (*cp == '\n' || *cp == '\r' || *cp == '\t' || *cp == '\b')
+ _nc_waddch_nosync(win, (chtype)(*cp));
+ else if (is7bits(*cp) && iscntrl(*cp)) {
+ winsch(win, ' ' + (chtype)(*cp));
+ winsch(win, '^');
+ win->_curx += 2;
+ } else {
+ winsch(win, (chtype)(*cp));
+ win->_curx++;
+ }
+ if (win->_curx > win->_maxx)
+ win->_curx = win->_maxx;
+ }
+
+ win->_curx = ox;
+ win->_cury = oy;
+ _nc_synchook(win);
+ code = OK;
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_instr.c b/contrib/ncurses/ncurses/base/lib_instr.c
new file mode 100644
index 000000000000..b3e1d030a4b6
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_instr.c
@@ -0,0 +1,73 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_instr.c
+**
+** The routine winnstr().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_instr.c,v 1.8 1998/02/11 12:13:54 tom Exp $")
+
+int winnstr(WINDOW *win, char *str, int n)
+{
+ int i=0, row, col;
+
+ T((T_CALLED("winnstr(%p,%p,%d)"), win, str, n));
+
+ if (!str)
+ returnCode(0);
+
+ if (win) {
+ getyx(win, row, col);
+
+ if (n < 0)
+ n = win->_maxx - win->_curx + 1;
+
+ for (; i < n;) {
+ str[i++] = TextOf(win->_line[row].text[col]);
+ if (++col > win->_maxx) {
+ col = 0;
+ if (++row > win->_maxy)
+ break;
+ }
+ }
+ }
+ str[i] = '\0'; /* SVr4 does not seem to count the null */
+ returnCode(i);
+}
+
diff --git a/contrib/ncurses/ncurses/base/lib_isendwin.c b/contrib/ncurses/ncurses/base/lib_isendwin.c
new file mode 100644
index 000000000000..60015fca55b9
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_isendwin.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_endwin.c
+**
+** The routine endwin().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_isendwin.c,v 1.4 1998/04/11 22:52:32 tom Exp $")
+
+bool isendwin(void)
+{
+ if (SP == NULL)
+ return FALSE;
+ return SP->_endwin;
+}
diff --git a/contrib/ncurses/ncurses/base/lib_leaveok.c b/contrib/ncurses/ncurses/base/lib_leaveok.c
new file mode 100644
index 000000000000..e83285d714f4
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_leaveok.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.3 1998/03/21 22:54:20 jtc Exp $")
+
+int leaveok(WINDOW *win, bool flag)
+{
+ T((T_CALLED("leaveok(%p,%d)"), win, flag));
+
+ if (win) {
+ win->_leaveok = flag;
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_mouse.c b/contrib/ncurses/ncurses/base/lib_mouse.c
new file mode 100644
index 000000000000..0aefdf3d8219
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_mouse.c
@@ -0,0 +1,964 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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> *
+ ****************************************************************************/
+
+/*
+ * This module is intended to encapsulate ncurses's interface to pointing
+ * devices.
+ *
+ * The first method used is xterm's internal mouse-tracking facility.
+ * The second is Alessandro Rubini's GPM server.
+ *
+ * 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"
+# include "fcntl.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>
+#include <term.h>
+
+#if USE_GPM_SUPPORT
+#ifndef LINT /* don't need this for llib-lncurses */
+#undef buttons /* term.h defines this, and gpm uses it! */
+#include <gpm.h>
+#include <linux/keyboard.h> /* defines KG_* macros */
+#endif
+#endif
+
+MODULE_ID("$Id: lib_mouse.c,v 1.44 1999/07/24 21:10:48 tom Exp $")
+
+#define MY_TRACE TRACE_ICALLS|TRACE_IEVENT
+
+#define INVALID_EVENT -1
+
+static int mousetype;
+#define M_XTERM -1 /* use xterm's mouse tracking? */
+#define M_NONE 0 /* no mouse device */
+#define M_GPM 1 /* use GPM */
+#define M_QNX 2 /* QNX mouse on console */
+#define M_QNX_TERM 3 /* QNX mouse on pterm/xterm (using qansi-m) */
+
+#if USE_GPM_SUPPORT
+#ifndef LINT
+static Gpm_Connect gpm_connect;
+#endif
+#endif
+
+static mmask_t eventmask; /* current event mask */
+
+static bool _nc_mouse_parse(int);
+static void _nc_mouse_resume(SCREEN *);
+static void _nc_mouse_wrap(SCREEN *);
+
+/* maintain a circular list of mouse events */
+
+/* The definition of the circular list size (EV_MAX), is in curses.priv.h, so
+ * wgetch() may refer to the size and call _nc_mouse_parse() before circular
+ * list overflow.
+ */
+static MEVENT events[EV_MAX]; /* hold the last mouse event seen */
+static MEVENT *eventp = events; /* next free slot in event queue */
+#define NEXT(ep) ((ep == events + EV_MAX - 1) ? events : ep + 1)
+#define PREV(ep) ((ep == events) ? events + EV_MAX - 1 : ep - 1)
+
+#ifdef TRACE
+static void _trace_slot(const char *tag)
+{
+ MEVENT *ep;
+
+ _tracef(tag);
+
+ for (ep = events; ep < events + EV_MAX; ep++)
+ _tracef("mouse event queue slot %ld = %s",
+ (long) (ep - events),
+ _tracemouse(ep));
+}
+#endif
+
+#ifdef USE_EMX_MOUSE
+
+# define TOP_ROW 0
+# define LEFT_COL 0
+
+static int mouse_wfd;
+static int mouse_thread;
+static int mouse_activated;
+static char mouse_buttons[] = { 0, 1, 3, 2};
+
+
+# define M_FD(sp) sp->_mouse_fd
+
+static void
+write_event(int down, int button, int x, int y)
+{
+ char buf[6];
+ unsigned long ignore;
+
+ strcpy(buf, key_mouse);
+ buf[3] = ' ' + (button - 1) + (down ? 0 : 0x40);
+ buf[4] = ' ' + x - LEFT_COL + 1;
+ buf[5] = ' ' + y - TOP_ROW + 1;
+ DosWrite(mouse_wfd, buf, 6, &ignore);
+}
+
+static void
+mouse_server(unsigned long ignored GCC_UNUSED)
+{
+ 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 oldstate = 0;
+ char errmess[] = "Unexpected termination of mouse thread\r\n";
+ unsigned long ignore;
+
+ /* open the handle for the mouse */
+ if (MouOpen(NULL,&hmou) == 0) {
+
+ if (MouSetEventMask(&mask,hmou) == 0
+ && MouDrawPtr(hmou) == 0) {
+
+ for (;;) {
+ /* sit and wait on the event queue */
+ if (MouReadEventQue(&mouev,&fWait,hmou))
+ break;
+ if (!mouse_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(mouev.fs & MOUSE_BN1_DOWN,
+ mouse_buttons[1], mouev.col, mouev.row);
+ if ((mouev.fs ^ oldstate) & MOUSE_BN2_DOWN)
+ write_event(mouev.fs & MOUSE_BN2_DOWN,
+ mouse_buttons[3], mouev.col, mouev.row);
+ if ((mouev.fs ^ oldstate) & MOUSE_BN3_DOWN)
+ write_event(mouev.fs & MOUSE_BN3_DOWN,
+ mouse_buttons[2], mouev.col, mouev.row);
+
+ finish:
+ oldstate = mouev.fs;
+ }
+ }
+
+ DosWrite(2, errmess, strlen(errmess), &ignore);
+ MouClose(hmou);
+ }
+ DosExit(EXIT_THREAD, 0L );
+}
+static void
+server_state(const int state)
+{ /* It would be nice to implement pointer-off and stop looping... */
+ mouse_activated = state;
+}
+
+#endif
+
+static int initialized;
+
+static void _nc_mouse_init(void)
+/* initialize the mouse */
+{
+ int i;
+
+ if (initialized) {
+ return;
+ }
+ initialized = TRUE;
+
+ TR(MY_TRACE, ("_nc_mouse_init() called"));
+
+ for (i = 0; i < EV_MAX; i++)
+ events[i].id = INVALID_EVENT;
+
+ /* we know how to recognize mouse events under xterm */
+ if (key_mouse != 0
+ && getenv("DISPLAY") != 0)
+ mousetype = M_XTERM;
+
+#if USE_GPM_SUPPORT
+ else if (!strncmp(cur_term->type.term_names, "linux", 5))
+ {
+ /* GPM: initialize connection to gpm server */
+ gpm_connect.eventMask = GPM_DOWN|GPM_UP;
+ gpm_connect.defaultMask = ~(gpm_connect.eventMask|GPM_HARD);
+ gpm_connect.minMod = 0;
+ gpm_connect.maxMod = ~((1<<KG_SHIFT)|(1<<KG_SHIFTL)|(1<<KG_SHIFTR));
+ if (Gpm_Open (&gpm_connect, 0) >= 0) { /* returns the file-descriptor */
+ mousetype = M_GPM;
+ SP->_mouse_fd = gpm_fd;
+ }
+ }
+#endif
+
+ /* OS/2 VIO */
+#ifdef USE_EMX_MOUSE
+ if (!mouse_thread && mousetype != M_XTERM && key_mouse) {
+ int handles[2];
+ if (pipe(handles) < 0) {
+ perror("mouse pipe error");
+ } else {
+ int rc;
+
+ if (!mouse_buttons[0]) {
+ char *s = getenv("MOUSE_BUTTONS_123");
+
+ mouse_buttons[0] = 1;
+ if (s && strlen(s) >= 3) {
+ mouse_buttons[1] = s[0] - '0';
+ mouse_buttons[2] = s[1] - '0';
+ mouse_buttons[3] = s[2] - '0';
+ }
+ }
+ mouse_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*)&mouse_thread, mouse_server, 0, 0, 8192);
+ if (rc)
+ printf("mouse thread error %d=%#x", rc, rc);
+ else
+ mousetype = M_XTERM;
+ }
+ }
+#endif
+
+ T(("_nc_mouse_init() set mousetype to %d", mousetype));
+}
+
+static bool _nc_mouse_event(SCREEN *sp GCC_UNUSED)
+/* query to see if there is a pending mouse event */
+{
+#if USE_GPM_SUPPORT
+ /* GPM: query server for event, return TRUE if we find one */
+ Gpm_Event ev;
+
+ if (gpm_fd >= 0
+ && _nc_timed_wait(2, 0, (int *)0)
+ && Gpm_GetEvent(&ev) == 1)
+ {
+ eventp->id = 0; /* there's only one mouse... */
+
+ 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:
+ break;
+ }
+
+ eventp->x = ev.x - 1;
+ eventp->y = ev.y - 1;
+ eventp->z = 0;
+
+ /* bump the next-free pointer into the circular list */
+ eventp = NEXT(eventp);
+ return (TRUE);
+ }
+#endif
+
+ /* xterm: never have to query, mouse events are in the keyboard stream */
+ return(FALSE); /* no event waiting */
+}
+
+static bool _nc_mouse_inline(SCREEN *sp)
+/* mouse report received in the keyboard stream -- parse its info */
+{
+ TR(MY_TRACE, ("_nc_mouse_inline() called"));
+
+ if (mousetype == M_XTERM)
+ {
+ unsigned char kbuf[4];
+ MEVENT *prev;
+ size_t grabbed;
+ int res;
+
+ /* 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 ctrlseqs.ms document in the
+ * X distribution, describing the X 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. It always does under Linux but often
+ * fails to under Solaris.
+ */
+ for (grabbed = 0; grabbed < 3; grabbed += res)
+ {
+
+ /* For VIO mouse we add extra bit 64 to disambiguate button-up. */
+#ifdef USE_EMX_MOUSE
+ res = read( M_FD(sp) >= 0 ? M_FD(sp) : sp->_ifd, &kbuf, 3);
+#else
+ res = read(sp->_ifd, kbuf + grabbed, 3-grabbed);
+#endif
+ if (res == -1)
+ break;
+ }
+ kbuf[3] = '\0';
+
+ TR(TRACE_IEVENT, ("_nc_mouse_inline sees the following xterm data: '%s'", kbuf));
+
+ eventp->id = 0; /* there's only one mouse... */
+
+ /* processing code goes here */
+ eventp->bstate = 0;
+ switch (kbuf[0] & 0x3)
+ {
+ case 0x0:
+ eventp->bstate = BUTTON1_PRESSED;
+#ifdef USE_EMX_MOUSE
+ if (kbuf[0] & 0x40)
+ eventp->bstate = BUTTON1_RELEASED;
+#endif
+ break;
+
+ case 0x1:
+ eventp->bstate = BUTTON2_PRESSED;
+#ifdef USE_EMX_MOUSE
+ if (kbuf[0] & 0x40)
+ eventp->bstate = BUTTON2_RELEASED;
+#endif
+ break;
+
+ case 0x2:
+ eventp->bstate = BUTTON3_PRESSED;
+#ifdef USE_EMX_MOUSE
+ if (kbuf[0] & 0x40)
+ eventp->bstate = BUTTON3_RELEASED;
+#endif
+ break;
+
+ case 0x3:
+ /*
+ * Release events aren't reported for individual buttons,
+ * just for the button set as a whole...
+ */
+ eventp->bstate =
+ (BUTTON1_RELEASED |
+ BUTTON2_RELEASED |
+ BUTTON3_RELEASED);
+ /*
+ * ...however, because there are no kinds of mouse events under
+ * xterm that can intervene between press and release, we can
+ * deduce which buttons were actually released by looking at the
+ * previous event.
+ */
+ prev = PREV(eventp);
+ if (!(prev->bstate & BUTTON1_PRESSED))
+ eventp->bstate &=~ BUTTON1_RELEASED;
+ if (!(prev->bstate & BUTTON2_PRESSED))
+ eventp->bstate &=~ BUTTON2_RELEASED;
+ if (!(prev->bstate & BUTTON3_PRESSED))
+ eventp->bstate &=~ BUTTON3_RELEASED;
+ break;
+ }
+
+ if (kbuf[0] & 4) {
+ eventp->bstate |= BUTTON_SHIFT;
+ }
+ if (kbuf[0] & 8) {
+ eventp->bstate |= BUTTON_ALT;
+ }
+ if (kbuf[0] & 16) {
+ eventp->bstate |= BUTTON_CTRL;
+ }
+
+ eventp->x = (kbuf[1] - ' ') - 1;
+ eventp->y = (kbuf[2] - ' ') - 1;
+ TR(MY_TRACE, ("_nc_mouse_inline: primitive mouse-event %s has slot %ld",
+ _tracemouse(eventp),
+ (long) (eventp - events)));
+
+ /* bump the next-free pointer into the circular list */
+ eventp = NEXT(eventp);
+#if 0 /* this return would be needed for QNX's mods to lib_getch.c */
+ return(TRUE);
+#endif
+ }
+
+ return(FALSE);
+}
+
+static void mouse_activate(bool on)
+{
+ if (!on && !initialized)
+ return;
+
+ _nc_mouse_init();
+
+ if (on) {
+
+ switch (mousetype) {
+ case M_XTERM:
+#ifdef NCURSES_EXT_FUNCS
+ keyok(KEY_MOUSE, on);
+#endif
+ TPUTS_TRACE("xterm mouse initialization");
+#ifdef USE_EMX_MOUSE
+ server_state(1);
+#else
+ putp("\033[?1000h");
+#endif
+ break;
+#if USE_GPM_SUPPORT
+ case M_GPM:
+ SP->_mouse_fd = gpm_fd;
+ break;
+#endif
+ }
+ /* 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 (mousetype) {
+ case M_XTERM:
+ TPUTS_TRACE("xterm mouse deinitialization");
+#ifdef USE_EMX_MOUSE
+ server_state(0);
+#else
+ putp("\033[?1000l");
+#endif
+ break;
+#if USE_GPM_SUPPORT
+ case M_GPM:
+ break;
+#endif
+ }
+ }
+ (void) fflush(SP->_ofp);
+}
+
+/**************************************************************************
+ *
+ * Device-independent code
+ *
+ **************************************************************************/
+
+static bool _nc_mouse_parse(int runcount)
+/* parse a run of atomic mouse events into a gesture */
+{
+ MEVENT *ep, *runp, *next, *prev = PREV(eventp);
+ int n;
+ bool merge;
+
+ 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 collaps 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.
+ *
+ * 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.
+ */
+ if (runcount == 1)
+ {
+ TR(MY_TRACE, ("_nc_mouse_parse: returning simple mouse event %s at slot %ld",
+ _tracemouse(prev),
+ (long) (prev - events)));
+ return (prev->id >= 0)
+ ? ((prev->bstate & eventmask) ? TRUE : FALSE)
+ : FALSE;
+ }
+
+ /* find the start of the run */
+ runp = eventp;
+ for (n = runcount; n > 0; n--) {
+ runp = PREV(runp);
+ }
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_IEVENT)
+ {
+ _trace_slot("before mouse press/release merge:");
+ _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
+ (long) (runp - events),
+ (long) ((eventp - events) + (EV_MAX-1)) % EV_MAX,
+ runcount);
+ }
+#endif /* TRACE */
+
+ /* first pass; merge press/release pairs */
+ do {
+ merge = FALSE;
+ for (ep = runp; next = NEXT(ep), next != eventp; ep = next)
+ {
+ if (ep->x == next->x && ep->y == next->y
+ && (ep->bstate & (BUTTON1_PRESSED|BUTTON2_PRESSED|BUTTON3_PRESSED))
+ && (!(ep->bstate & BUTTON1_PRESSED)
+ == !(next->bstate & BUTTON1_RELEASED))
+ && (!(ep->bstate & BUTTON2_PRESSED)
+ == !(next->bstate & BUTTON2_RELEASED))
+ && (!(ep->bstate & BUTTON3_PRESSED)
+ == !(next->bstate & BUTTON3_RELEASED))
+ )
+ {
+ if ((eventmask & BUTTON1_CLICKED)
+ && (ep->bstate & BUTTON1_PRESSED))
+ {
+ ep->bstate &=~ BUTTON1_PRESSED;
+ ep->bstate |= BUTTON1_CLICKED;
+ merge = TRUE;
+ }
+ if ((eventmask & BUTTON2_CLICKED)
+ && (ep->bstate & BUTTON2_PRESSED))
+ {
+ ep->bstate &=~ BUTTON2_PRESSED;
+ ep->bstate |= BUTTON2_CLICKED;
+ merge = TRUE;
+ }
+ if ((eventmask & BUTTON3_CLICKED)
+ && (ep->bstate & BUTTON3_PRESSED))
+ {
+ ep->bstate &=~ BUTTON3_PRESSED;
+ ep->bstate |= BUTTON3_CLICKED;
+ merge = TRUE;
+ }
+ if (merge)
+ next->id = INVALID_EVENT;
+ }
+ }
+ } while
+ (merge);
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_IEVENT)
+ {
+ _trace_slot("before mouse click merge:");
+ _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
+ (long) (runp - events),
+ (long) ((eventp - events) + (EV_MAX-1)) % EV_MAX,
+ runcount);
+ }
+#endif /* TRACE */
+
+ /*
+ * Second pass; merge click runs. At this point, click events are
+ * each followed by one invalid event. We merge click events
+ * forward in the queue.
+ *
+ * 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.
+ */
+ do {
+ MEVENT *follower;
+
+ merge = FALSE;
+ for (ep = runp; next = NEXT(ep), next != eventp; ep = next)
+ if (ep->id != INVALID_EVENT)
+ {
+ if (next->id != INVALID_EVENT)
+ continue;
+ follower = NEXT(next);
+ if (follower->id == INVALID_EVENT)
+ continue;
+
+ /* merge click events forward */
+ if ((ep->bstate &
+ (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED))
+ && (follower->bstate &
+ (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED)))
+ {
+ if ((eventmask & BUTTON1_DOUBLE_CLICKED)
+ && (follower->bstate & BUTTON1_CLICKED))
+ {
+ follower->bstate &=~ BUTTON1_CLICKED;
+ follower->bstate |= BUTTON1_DOUBLE_CLICKED;
+ merge = TRUE;
+ }
+ if ((eventmask & BUTTON2_DOUBLE_CLICKED)
+ && (follower->bstate & BUTTON2_CLICKED))
+ {
+ follower->bstate &=~ BUTTON2_CLICKED;
+ follower->bstate |= BUTTON2_DOUBLE_CLICKED;
+ merge = TRUE;
+ }
+ if ((eventmask & BUTTON3_DOUBLE_CLICKED)
+ && (follower->bstate & BUTTON3_CLICKED))
+ {
+ follower->bstate &=~ BUTTON3_CLICKED;
+ follower->bstate |= BUTTON3_DOUBLE_CLICKED;
+ merge = TRUE;
+ }
+ if (merge)
+ ep->id = INVALID_EVENT;
+ }
+
+ /* merge double-click events forward */
+ if ((ep->bstate &
+ (BUTTON1_DOUBLE_CLICKED
+ | BUTTON2_DOUBLE_CLICKED
+ | BUTTON3_DOUBLE_CLICKED))
+ && (follower->bstate &
+ (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED)))
+ {
+ if ((eventmask & BUTTON1_TRIPLE_CLICKED)
+ && (follower->bstate & BUTTON1_CLICKED))
+ {
+ follower->bstate &=~ BUTTON1_CLICKED;
+ follower->bstate |= BUTTON1_TRIPLE_CLICKED;
+ merge = TRUE;
+ }
+ if ((eventmask & BUTTON2_TRIPLE_CLICKED)
+ && (follower->bstate & BUTTON2_CLICKED))
+ {
+ follower->bstate &=~ BUTTON2_CLICKED;
+ follower->bstate |= BUTTON2_TRIPLE_CLICKED;
+ merge = TRUE;
+ }
+ if ((eventmask & BUTTON3_TRIPLE_CLICKED)
+ && (follower->bstate & BUTTON3_CLICKED))
+ {
+ follower->bstate &=~ BUTTON3_CLICKED;
+ follower->bstate |= BUTTON3_TRIPLE_CLICKED;
+ merge = TRUE;
+ }
+ if (merge)
+ ep->id = INVALID_EVENT;
+ }
+ }
+ } while
+ (merge);
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_IEVENT)
+ {
+ _trace_slot("before mouse event queue compaction:");
+ _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
+ (long) (runp - events),
+ (long) ((eventp - events) + (EV_MAX-1)) % EV_MAX,
+ runcount);
+ }
+#endif /* TRACE */
+
+ /*
+ * Now try to throw away trailing events flagged invalid, or that
+ * don't match the current event mask.
+ */
+ for (; runcount; prev = PREV(eventp), runcount--)
+ if (prev->id == INVALID_EVENT || !(prev->bstate & eventmask)) {
+ eventp = prev;
+ }
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_IEVENT)
+ {
+ _trace_slot("after mouse event queue compaction:");
+ _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
+ (long) (runp - events),
+ (long) ((eventp - events) + (EV_MAX-1)) % EV_MAX,
+ runcount);
+ }
+ for (ep = runp; ep != eventp; ep = NEXT(ep))
+ if (ep->id != INVALID_EVENT)
+ TR(MY_TRACE, ("_nc_mouse_parse: returning composite mouse event %s at slot %ld",
+ _tracemouse(ep),
+ (long) (ep - events)));
+#endif /* TRACE */
+
+ /* after all this, do we have a valid event? */
+ return(PREV(eventp)->id != INVALID_EVENT);
+}
+
+static void _nc_mouse_wrap(SCREEN *sp GCC_UNUSED)
+/* release mouse -- called by endwin() before shellout/exit */
+{
+ TR(MY_TRACE, ("_nc_mouse_wrap() called"));
+
+ switch (mousetype) {
+ case M_XTERM:
+ if (eventmask)
+ mouse_activate(FALSE);
+ break;
+#if USE_GPM_SUPPORT
+ /* GPM: pass all mouse events to next client */
+ case M_GPM:
+ break;
+#endif
+ }
+}
+
+static void _nc_mouse_resume(SCREEN *sp GCC_UNUSED)
+/* re-connect to mouse -- called by doupdate() after shellout */
+{
+ TR(MY_TRACE, ("_nc_mouse_resume() called"));
+
+ /* xterm: re-enable reporting */
+ if (mousetype == M_XTERM && eventmask)
+ mouse_activate(TRUE);
+
+ /* GPM: reclaim our event set */
+}
+
+/**************************************************************************
+ *
+ * Mouse interface entry points for the API
+ *
+ **************************************************************************/
+
+int getmouse(MEVENT *aevent)
+/* grab a copy of the current mouse event */
+{
+ T((T_CALLED("getmouse(%p)"), aevent));
+
+ if (aevent && (mousetype != M_NONE))
+ {
+ /* compute the current-event pointer */
+ MEVENT *prev = PREV(eventp);
+
+ /* copy the event we find there */
+ *aevent = *prev;
+
+ TR(TRACE_IEVENT, ("getmouse: returning event %s from slot %ld",
+ _tracemouse(prev),
+ (long) (prev - events)));
+
+ prev->id = INVALID_EVENT; /* so the queue slot becomes free */
+ returnCode(OK);
+ }
+ returnCode(ERR);
+}
+
+int ungetmouse(MEVENT *aevent)
+/* enqueue a synthesized mouse event to be seen by the next wgetch() */
+{
+ /* stick the given event in the next-free slot */
+ *eventp = *aevent;
+
+ /* bump the next-free pointer into the circular list */
+ eventp = NEXT(eventp);
+
+ /* push back the notification event on the keyboard queue */
+ return ungetch(KEY_MOUSE);
+}
+
+mmask_t mousemask(mmask_t newmask, mmask_t *oldmask)
+/* set the mouse event mask */
+{
+ mmask_t result = 0;
+
+ T((T_CALLED("mousemask(%#lx,%p)"), newmask, oldmask));
+
+ if (oldmask)
+ *oldmask = eventmask;
+
+ if (!newmask && !initialized)
+ returnCode(0);
+
+ _nc_mouse_init();
+ if ( mousetype != M_NONE )
+ {
+ eventmask = newmask &
+ (BUTTON_ALT | BUTTON_CTRL | BUTTON_SHIFT
+ | BUTTON1_PRESSED | BUTTON1_RELEASED | BUTTON1_CLICKED
+ | BUTTON1_DOUBLE_CLICKED | BUTTON1_TRIPLE_CLICKED
+ | BUTTON2_PRESSED | BUTTON2_RELEASED | BUTTON2_CLICKED
+ | BUTTON2_DOUBLE_CLICKED | BUTTON2_TRIPLE_CLICKED
+ | BUTTON3_PRESSED | BUTTON3_RELEASED | BUTTON3_CLICKED
+ | BUTTON3_DOUBLE_CLICKED | BUTTON3_TRIPLE_CLICKED);
+
+ mouse_activate(eventmask != 0);
+
+ result = eventmask;
+ }
+
+ returnCode(result);
+}
+
+bool wenclose(const WINDOW *win, int y, int x)
+/* check to see if given window encloses given screen location */
+{
+ if (win)
+ {
+ y -= win->_yoffset;
+ return ((win->_begy <= y &&
+ win->_begx <= x &&
+ (win->_begx + win->_maxx) >= x &&
+ (win->_begy + win->_maxy) >= y) ? TRUE : FALSE);
+ }
+ return FALSE;
+}
+
+int mouseinterval(int maxclick)
+/* set the maximum mouse interval within which to recognize a click */
+{
+ int oldval;
+
+ if (SP != 0) {
+ oldval = SP->_maxclick;
+ if (maxclick >= 0)
+ SP->_maxclick = maxclick;
+ } else {
+ oldval = DEFAULT_MAXCLICK;
+ }
+
+ return(oldval);
+}
+
+/* This may be used by other routines to ask for the existence of mouse
+ support */
+int _nc_has_mouse(void) {
+ return (mousetype==M_NONE ? 0:1);
+}
+
+bool wmouse_trafo(const WINDOW* win, int* pY, int* pX, bool to_screen)
+{
+ bool result = FALSE;
+
+ 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;
+ }
+ }
+ return(result);
+}
+
+/* lib_mouse.c ends here */
diff --git a/contrib/ncurses/ncurses/base/lib_move.c b/contrib/ncurses/ncurses/base/lib_move.c
new file mode 100644
index 000000000000..6f5bddff33ea
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_move.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_move.c
+**
+** The routine wmove().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_move.c,v 1.8 1998/02/11 12:13:53 tom Exp $")
+
+int
+wmove(WINDOW *win, int y, int x)
+{
+ T((T_CALLED("wmove(%p,%d,%d)"), win, y, x));
+
+ if (win &&
+ x >= 0 && x <= win->_maxx &&
+ y >= 0 && y <= win->_maxy)
+ {
+ win->_curx = (short)x;
+ win->_cury = (short)y;
+
+ win->_flags &= ~_WRAPPED;
+ win->_flags |= _HASMOVED;
+ returnCode(OK);
+ } else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_mvwin.c b/contrib/ncurses/ncurses/base/lib_mvwin.c
new file mode 100644
index 000000000000..9774d9f58dfe
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_mvwin.c
@@ -0,0 +1,109 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_mvwin.c
+**
+** The routine mvwin().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_mvwin.c,v 1.7 1998/02/11 12:13:55 tom Exp $")
+
+int mvwin(WINDOW *win, int by, int bx)
+{
+ T((T_CALLED("mvwin(%p,%d,%d)"), win, by, bx));
+
+ if (!win || (win->_flags & _ISPAD))
+ returnCode(ERR);
+
+ /* Copying subwindows is allowed, but it is expensive... */
+ if (win->_flags & _SUBWIN) {
+ 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 */
+ wbkgd(win,parent->_bkgd);/* fill with parents background */
+ 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);
+ }
+
+ if (by + win->_maxy > screen_lines - 1
+ || bx + win->_maxx > screen_columns - 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 = by;
+ win->_begx = bx;
+ returnCode(touchwin(win));
+}
diff --git a/contrib/ncurses/ncurses/base/lib_newterm.c b/contrib/ncurses/ncurses/base/lib_newterm.c
new file mode 100644
index 000000000000..9a4919bf5292
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_newterm.c
@@ -0,0 +1,206 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_newterm.c
+**
+** The newterm() function.
+**
+*/
+
+#include <curses.priv.h>
+
+#if defined(SVR4_TERMIO) && !defined(_POSIX_SOURCE)
+#define _POSIX_SOURCE
+#endif
+
+#include <term.h> /* clear_screen, cup & friends, cur_term */
+
+MODULE_ID("$Id: lib_newterm.c,v 1.41 1999/07/24 20:07:48 tom Exp $")
+
+#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 inline int _nc_initscr(void)
+{
+ /* for extended XPG4 conformance requires cbreak() at this point */
+ /* (SVr4 curses does this anyway) */
+ cbreak();
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_lflag &= ~(ECHO|ECHONL);
+ cur_term->Nttyb.c_iflag &= ~(ICRNL|INLCR|IGNCR);
+ cur_term->Nttyb.c_oflag &= ~(ONLCR);
+#else
+ cur_term->Nttyb.sg_flags &= ~(ECHO|CRMOD);
+#endif
+ return _nc_set_tty_mode(&cur_term->Nttyb);
+}
+
+/*
+ * 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.
+ */
+static int filter_mode = FALSE;
+
+void filter(void)
+{
+ filter_mode = TRUE;
+}
+
+SCREEN * newterm(NCURSES_CONST char *name, FILE *ofp, FILE *ifp)
+{
+int errret;
+int slk_format = _nc_slk_format;
+SCREEN* current;
+#ifdef TRACE
+int t = _nc_getenv_num("NCURSES_TRACE");
+
+ if (t >= 0)
+ trace(t);
+#endif
+
+ T((T_CALLED("newterm(\"%s\",%p,%p)"), name, ofp, ifp));
+
+ /* this loads the capability entry, then sets LINES and COLS */
+ if (setupterm(name, fileno(ofp), &errret) == ERR)
+ return 0;
+
+ /* implement filter mode */
+ if (filter_mode) {
+ LINES = 1;
+
+ if (init_tabs != -1)
+ TABSIZE = init_tabs;
+ else
+ TABSIZE = 8;
+
+ T(("TABSIZE = %d", TABSIZE));
+
+ clear_screen = 0;
+ cursor_down = parm_down_cursor = 0;
+ cursor_address = 0;
+ cursor_up = parm_up_cursor = 0;
+ row_address = 0;
+
+ cursor_home = carriage_return;
+ }
+
+ /* 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 (num_labels <= 0 || !SLK_STDFMT(slk_format))
+ if (slk_format)
+ {
+ if (ERR==_nc_ripoffline(-SLK_LINES(slk_format),
+ _nc_slk_initialize))
+ return 0;
+ }
+ /* this actually allocates the screen structure, and saves the
+ * original terminal settings.
+ */
+ current = SP;
+ _nc_set_screen(0);
+ if (_nc_setupscreen(LINES, COLS, ofp) == ERR) {
+ _nc_set_screen(current);
+ return 0;
+ }
+
+ /* if the terminal type has real soft labels, set those up */
+ if (slk_format && num_labels > 0 && SLK_STDFMT(slk_format))
+ _nc_slk_initialize(stdscr, COLS);
+
+ SP->_ifd = fileno(ifp);
+ SP->_checkfd = fileno(ifp);
+ typeahead(fileno(ifp));
+#ifdef TERMIOS
+ SP->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 &&
+ !(cur_term->Ottyb.c_iflag & ISTRIP));
+#else
+ SP->_use_meta = FALSE;
+#endif
+ SP->_endwin = FALSE;
+
+ /* 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)));
+
+ baudrate(); /* sets a field in the SP structure */
+
+ SP->_keytry = 0;
+
+ /*
+ * 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->_use_rmso = SGR0_TEST(exit_standout_mode);
+ SP->_use_rmul = SGR0_TEST(exit_underline_mode);
+
+ /* compute movement costs so we can do better move optimization */
+ _nc_mvcur_init();
+
+ /* initialize terminal to a sane state */
+ _nc_screen_init();
+
+ /* Initialize the terminal line settings. */
+ _nc_initscr();
+
+ _nc_signal_handler(TRUE);
+
+ T((T_RETURN("%p"), SP));
+ return(SP);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_newwin.c b/contrib/ncurses/ncurses/base/lib_newwin.c
new file mode 100644
index 000000000000..61c0eb3ed548
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_newwin.c
@@ -0,0 +1,271 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_newwin.c
+**
+** The routines newwin(), subwin() and their dependent
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_newwin.c,v 1.20 1998/05/23 23:21:32 Alexander.V.Lukyanov Exp $")
+
+void _nc_freewin(WINDOW *win)
+{
+WINDOWLIST *p, *q;
+int i;
+
+ if (win != 0) {
+ for (p = _nc_windows, q = 0; p != 0; q = p, p = p->next) {
+ if (p->win == win) {
+ if (q == 0)
+ _nc_windows = p->next;
+ else
+ q->next = p->next;
+ free(p);
+
+ if (! (win->_flags & _SUBWIN)) {
+ for (i = 0; i <= win->_maxy && win->_line[i].text; i++)
+ free(win->_line[i].text);
+ }
+ free(win->_line);
+ free(win);
+
+ if (win == curscr) curscr = 0;
+ if (win == stdscr) stdscr = 0;
+ if (win == newscr) newscr = 0;
+
+ T(("...deleted win=%p", win));
+ break;
+ }
+ }
+ }
+}
+
+WINDOW * newwin(int num_lines, int num_columns, int begy, int begx)
+{
+WINDOW *win;
+chtype *ptr;
+int i;
+
+ T((T_CALLED("newwin(%d,%d,%d,%d)"), num_lines, num_columns, begy, begx));
+
+ if (begy < 0 || begx < 0 || num_lines < 0 || num_columns < 0)
+ returnWin(0);
+
+ if (num_lines == 0)
+ num_lines = SP->_lines_avail - begy;
+ if (num_columns == 0)
+ num_columns = screen_columns - begx;
+
+ if (num_columns + begx > SP->_columns || num_lines + begy > SP->_lines_avail)
+ returnWin(0);
+
+ if ((win = _nc_makenew(num_lines, num_columns, begy, begx, 0)) == 0)
+ returnWin(0);
+
+ for (i = 0; i < num_lines; i++) {
+ if ((win->_line[i].text = typeCalloc(chtype, (unsigned)num_columns)) == 0) {
+ _nc_freewin(win);
+ returnWin(0);
+ }
+ for (ptr = win->_line[i].text; ptr < win->_line[i].text + num_columns; )
+ *ptr++ = ' ';
+ }
+
+ T(("newwin: returned window is %p", win));
+
+ returnWin(win);
+}
+
+WINDOW * derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx)
+{
+WINDOW *win;
+int i;
+int flags = _SUBWIN;
+
+ T((T_CALLED("derwin(%p,%d,%d,%d,%d)"), 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 (orig->_flags & _ISPAD)
+ flags |= _ISPAD;
+
+ if ((win = _nc_makenew(num_lines, num_columns, orig->_begy + begy, orig->_begx + begx, flags)) == 0)
+ returnWin(0);
+
+ win->_pary = begy;
+ win->_parx = begx;
+ win->_attrs = orig->_attrs;
+ win->_bkgd = orig->_bkgd;
+
+ for (i = 0; i < num_lines; i++)
+ win->_line[i].text = &orig->_line[begy++].text[begx];
+
+ win->_parent = orig;
+
+ T(("derwin: returned window is %p", win));
+
+ returnWin(win);
+}
+
+
+WINDOW *subwin(WINDOW *w, int l, int c, int y, int x)
+{
+ T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), w, l, c, y, x));
+ T(("parent has begy = %d, begx = %d", w->_begy, w->_begx));
+
+ returnWin(derwin(w, l, c, y - w->_begy, x - w->_begx));
+}
+
+WINDOW *
+_nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags)
+{
+int i;
+WINDOWLIST *wp;
+WINDOW *win;
+bool is_pad = (flags & _ISPAD);
+
+ T(("_nc_makenew(%d,%d,%d,%d)", num_lines, num_columns, begy, begx));
+
+ if (num_lines <= 0 || num_columns <= 0)
+ return 0;
+
+ if ((wp = typeCalloc(WINDOWLIST, 1)) == 0)
+ return 0;
+
+ if ((win = typeCalloc(WINDOW, 1)) == 0)
+ return 0;
+
+ if ((win->_line = typeCalloc(struct ldat, ((unsigned)num_lines))) == 0) {
+ free(win);
+ return 0;
+ }
+
+ win->_curx = 0;
+ win->_cury = 0;
+ win->_maxy = num_lines - 1;
+ win->_maxx = num_columns - 1;
+ win->_begy = begy;
+ win->_begx = begx;
+ win->_yoffset = SP->_topstolen;
+
+ win->_flags = flags;
+ win->_attrs = A_NORMAL;
+ win->_bkgd = BLANK;
+
+ win->_clear = is_pad ? FALSE : (num_lines == screen_lines && num_columns == screen_columns);
+ 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 = 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 = num_columns-1;
+
+ if_USE_SCROLL_HINTS(win->_line[i].oldindex = i);
+ }
+
+ if (!is_pad && (begx + num_columns == screen_columns)) {
+ win->_flags |= _ENDLINE;
+
+ if (begx == 0 && num_lines == screen_lines && begy == 0)
+ win->_flags |= _FULLWIN;
+
+ if (begy + num_lines == screen_lines)
+ win->_flags |= _SCROLLWIN;
+ }
+
+ wp->next = _nc_windows;
+ wp->win = win;
+ _nc_windows = wp;
+
+ T((T_CREATE("window %p"), win));
+
+ return(win);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_nl.c b/contrib/ncurses/ncurses/base/lib_nl.c
new file mode 100644
index 000000000000..d5c426632f5d
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_nl.c
@@ -0,0 +1,79 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * nl.c
+ *
+ * Routines:
+ * nl()
+ * nonl()
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_nl.c,v 1.3 1998/10/14 15:14:08 Alexander.V.Lukyanov Exp $")
+
+#ifdef __EMX__
+#include <io.h>
+#include <fcntl.h>
+#endif
+
+int nl(void)
+{
+ T((T_CALLED("nl()")));
+
+ SP->_nl = TRUE;
+
+#ifdef __EMX__
+ fflush(SP->_ofp);
+ _fsetmode(SP->_ofp, "t");
+#endif
+
+ returnCode(OK);
+}
+
+int nonl(void)
+{
+ T((T_CALLED("nonl()")));
+
+ SP->_nl = FALSE;
+
+#ifdef __EMX__
+ fflush(SP->_ofp);
+ _fsetmode(SP->_ofp, "b");
+#endif
+
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_overlay.c b/contrib/ncurses/ncurses/base/lib_overlay.c
new file mode 100644
index 000000000000..db2dce1b79f6
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_overlay.c
@@ -0,0 +1,161 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.12 1998/02/11 12:13:59 tom Exp $")
+
+static int overlap(const WINDOW *const s, WINDOW *const d, int const flag)
+{
+int sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
+
+ T(("overlap : sby %d, sbx %d, smy %d, smx %d, dby %d, dbx %d, dmy %d, dmx %d",
+ s->_begy, s->_begx, s->_maxy, s->_maxx,
+ d->_begy, d->_begx, d->_maxy, d->_maxx));
+
+ if (!s || !d)
+ returnCode(ERR);
+
+ sminrow = max(s->_begy, d->_begy) - s->_begy;
+ smincol = max(s->_begx, d->_begx) - s->_begx;
+ dminrow = max(s->_begy, d->_begy) - d->_begy;
+ dmincol = max(s->_begx, d->_begx) - d->_begx;
+ dmaxrow = min(s->_maxy+s->_begy, d->_maxy+d->_begy) - d->_begy;
+ dmaxcol = min(s->_maxx+s->_begx, d->_maxx+d->_begx) - d->_begx;
+
+ return(copywin(s, d,
+ sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol,
+ flag));
+}
+
+/*
+**
+** overlay(win1, win2)
+**
+**
+** overlay() writes the overlapping area of win1 behind win2
+** on win2 non-destructively.
+**
+**/
+
+int overlay(const WINDOW *win1, WINDOW *win2)
+{
+ T((T_CALLED("overlay(%p,%p)"), win1, win2));
+ returnCode(overlap(win1, win2, TRUE));
+}
+
+/*
+**
+** overwrite(win1, win2)
+**
+**
+** overwrite() writes the overlapping area of win1 behind win2
+** on win2 destructively.
+**
+**/
+
+int overwrite(const WINDOW *win1, WINDOW *win2)
+{
+ T((T_CALLED("overwrite(%p,%p)"), win1, win2));
+ returnCode(overlap(win1, win2, FALSE));
+}
+
+int copywin(const WINDOW *src, WINDOW *dst,
+ int sminrow, int smincol,
+ int dminrow, int dmincol, int dmaxrow, int dmaxcol,
+ int over)
+{
+int sx, sy, dx, dy;
+bool touched;
+chtype bk = AttrOf(dst->_bkgd);
+chtype mask = ~(chtype)((bk&A_COLOR) ? A_COLOR : 0);
+
+ T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"),
+ src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over));
+
+ if (!src || !dst)
+ returnCode(ERR);
+
+ /* make sure rectangle exists in source */
+ if ((sminrow + dmaxrow - dminrow) > (src->_maxy + 1) ||
+ (smincol + dmaxcol - dmincol) > (src->_maxx + 1)) {
+ returnCode(ERR);
+ }
+
+ T(("rectangle exists in source"));
+
+ /* make sure rectangle fits in destination */
+ if (dmaxrow > dst->_maxy || dmaxcol > dst->_maxx) {
+ returnCode(ERR);
+ }
+
+ T(("rectangle fits in destination"));
+
+ for (dy = dminrow, sy = sminrow; dy <= dmaxrow; sy++, dy++) {
+ touched = FALSE;
+ for(dx=dmincol, sx=smincol; dx <= dmaxcol; sx++, dx++)
+ {
+ if (over)
+ {
+ if ((TextOf(src->_line[sy].text[sx]) != ' ') &&
+ (dst->_line[dy].text[dx]!=src->_line[sy].text[sx]))
+ {
+ dst->_line[dy].text[dx] =
+ (src->_line[sy].text[sx] & mask) | bk;
+ touched = TRUE;
+ }
+ }
+ else {
+ if (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,0,getmaxy(dst));
+ }
+ }
+ T(("finished copywin"));
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_pad.c b/contrib/ncurses/ncurses/base/lib_pad.c
new file mode 100644
index 000000000000..d4e341c05c75
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_pad.c
@@ -0,0 +1,280 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * 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.27 1998/06/28 00:10:16 tom Exp $")
+
+WINDOW *newpad(int l, int c)
+{
+WINDOW *win;
+chtype *ptr;
+int i;
+
+ T((T_CALLED("newpad(%d, %d)"), l, c));
+
+ if (l <= 0 || c <= 0)
+ returnWin(0);
+
+ if ((win = _nc_makenew(l,c,0,0,_ISPAD)) == NULL)
+ returnWin(0);
+
+ for (i = 0; i < l; i++) {
+ if_USE_SCROLL_HINTS(win->_line[i].oldindex = _NEWINDEX);
+ if ((win->_line[i].text = typeCalloc(chtype, ((size_t)c))) == 0) {
+ _nc_freewin(win);
+ returnWin(0);
+ }
+ for (ptr = win->_line[i].text; ptr < win->_line[i].text + c; )
+ *ptr++ = ' ';
+ }
+
+ returnWin(win);
+}
+
+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 (!(orig->_flags & _ISPAD) || ((win = derwin(orig, l, c, begy, begx)) == NULL))
+ returnWin(0);
+ }
+ returnWin(win);
+}
+
+int prefresh(WINDOW *win, int pminrow, int pmincol,
+ int sminrow, int smincol, int smaxrow, int smaxcol)
+{
+ T((T_CALLED("prefresh()")));
+ if (pnoutrefresh(win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) != ERR
+ && doupdate() != ERR) {
+ returnCode(OK);
+ }
+ returnCode(ERR);
+}
+
+int pnoutrefresh(WINDOW *win, int pminrow, int pmincol,
+ int sminrow, int smincol, int smaxrow, int smaxcol)
+{
+const int my_len = 2; /* parameterize the threshold for hardscroll */
+short i, j;
+short m, n;
+short pmaxrow;
+short pmaxcol;
+short displaced;
+bool wide;
+
+ T((T_CALLED("pnoutrefresh(%p, %d, %d, %d, %d, %d, %d)"),
+ win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol));
+
+ if (win == 0)
+ returnCode(ERR);
+
+ if (!(win->_flags & _ISPAD))
+ returnCode(ERR);
+
+ /* 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 %d, win->_maxy %d", pmaxrow, win->_maxy));
+ T((" pmincol + smaxcol - smincol %d, win->_maxx %d", pmaxcol, 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
+ || smaxcol > screen_columns
+ || sminrow > smaxrow
+ || smincol > smaxcol)
+ returnCode(ERR);
+
+ T(("pad being refreshed"));
+
+ 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;
+
+ /*
+ * 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.
+ */
+ wide = (smincol < my_len && smaxcol > (newscr->_maxx - my_len));
+
+ for (i = pminrow, m = sminrow + win->_yoffset;
+ i <= pmaxrow && m <= newscr->_maxy;
+ i++, m++) {
+ register struct ldat *nline = &newscr->_line[m];
+ register struct ldat *oline = &win->_line[i];
+
+ for (j = pmincol, n = smincol; j <= pmaxcol; j++, n++) {
+ if (oline->text[j] != nline->text[n]) {
+ nline->text[n] = oline->text[j];
+ 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 = &curscr->_line[nind];
+ for (j = 0; j <= my_len; j++) {
+ int k = newscr->_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 = smincol;
+ win->_begy = sminrow;
+
+ if (win->_clear) {
+ win->_clear = FALSE;
+ newscr->_clear = TRUE;
+ }
+
+ /*
+ * Use the pad's current position, if it will be visible.
+ * If not, don't do anything; it's not an error.
+ */
+ if (win->_leaveok == FALSE
+ && win->_cury >= pminrow
+ && win->_curx >= pmincol
+ && win->_cury <= pmaxrow
+ && win->_curx <= pmaxcol) {
+ newscr->_cury = win->_cury - pminrow + win->_begy + win->_yoffset;
+ newscr->_curx = win->_curx - pmincol + win->_begx;
+ }
+ 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 = pminrow;
+ win->_pad._pad_x = pmincol;
+ win->_pad._pad_top = sminrow;
+ win->_pad._pad_left = smincol;
+ win->_pad._pad_bottom = smaxrow;
+ win->_pad._pad_right = smaxcol;
+
+ returnCode(OK);
+}
+
+int pechochar(WINDOW *pad, const chtype ch)
+{
+ T((T_CALLED("pechochar(%p, %s)"), pad, _tracechtype(ch)));
+
+ if (pad == 0)
+ returnCode(ERR);
+
+ if (!(pad->_flags & _ISPAD))
+ 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/contrib/ncurses/ncurses/base/lib_printw.c b/contrib/ncurses/ncurses/base/lib_printw.c
new file mode 100644
index 000000000000..8d28f288d3c1
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_printw.c
@@ -0,0 +1,110 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+/*
+** lib_printw.c
+**
+** The routines printw(), wprintw() and friends.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_printw.c,v 1.7 1998/04/11 22:53:44 tom Exp $")
+
+int printw(NCURSES_CONST char *fmt, ...)
+{
+ va_list argp;
+ int code;
+
+ T(("printw(%s,...) called", _nc_visbuf(fmt)));
+
+ va_start(argp, fmt);
+ code = vwprintw(stdscr, fmt, argp);
+ va_end(argp);
+
+ return code;
+}
+
+int wprintw(WINDOW *win, NCURSES_CONST char *fmt, ...)
+{
+ va_list argp;
+ int code;
+
+ T(("wprintw(%p,%s,...) called", win, _nc_visbuf(fmt)));
+
+ va_start(argp, fmt);
+ code = vwprintw(win, fmt, argp);
+ va_end(argp);
+
+ return code;
+}
+
+int mvprintw(int y, int x, NCURSES_CONST char *fmt, ...)
+{
+ va_list argp;
+ int code = move(y, x);
+
+ if (code != ERR) {
+ va_start(argp, fmt);
+ code = vwprintw(stdscr, fmt, argp);
+ va_end(argp);
+ }
+ return code;
+}
+
+int mvwprintw(WINDOW *win, int y, int x, NCURSES_CONST char *fmt, ...)
+{
+ va_list argp;
+ int code = wmove(win, y, x);
+
+ if (code != ERR) {
+ va_start(argp, fmt);
+ code = vwprintw(win, fmt, argp);
+ va_end(argp);
+ }
+ return code;
+}
+
+int vwprintw(WINDOW *win, NCURSES_CONST char *fmt, va_list argp)
+{
+ char *buf = _nc_printf_string(fmt, argp);
+ int code = ERR;
+
+ if (buf != 0) {
+ code = waddstr(win, buf);
+#if USE_SAFE_SPRINTF
+ free(buf);
+#endif
+ }
+ return code;
+}
diff --git a/contrib/ncurses/ncurses/base/lib_redrawln.c b/contrib/ncurses/ncurses/base/lib_redrawln.c
new file mode 100644
index 000000000000..10fda917984e
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_redrawln.c
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+/*
+ * lib_redrawln.c
+ *
+ * The routine wredrawln().
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_redrawln.c,v 1.7 1998/09/19 20:09:50 Alexander.V.Lukyanov Exp $")
+
+int wredrawln(WINDOW *win, int beg, int num)
+{
+ int i;
+ int end;
+ size_t len = (win->_maxx + 1) * sizeof(chtype);
+
+ T((T_CALLED("wredrawln(%p,%d,%d)"), win, beg, num));
+
+ if (beg < 0)
+ beg = 0;
+
+ if (touchline (win, beg, num) == ERR)
+ returnCode(ERR);
+
+ end = beg + num;
+ if (end > win->_maxy + 1)
+ end = win->_maxy + 1;
+
+ for (i = beg; i < end; i++)
+ {
+ memset (curscr->_line[i+win->_begy].text+win->_begx, 0, len);
+ _nc_make_oldhash(i+win->_begy);
+ }
+
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_refresh.c b/contrib/ncurses/ncurses/base/lib_refresh.c
new file mode 100644
index 000000000000..88e3b75a56a1
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_refresh.c
@@ -0,0 +1,183 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+ * lib_refresh.c
+ *
+ * The routines wrefresh() and wnoutrefresh().
+ *
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_refresh.c,v 1.24 1999/07/31 11:36:37 juergen Exp $")
+
+int wrefresh(WINDOW *win)
+{
+int code;
+
+ T((T_CALLED("wrefresh(%p)"), win));
+
+ if (win == curscr) {
+ curscr->_clear = TRUE;
+ code = doupdate();
+ } else if ((code = wnoutrefresh(win)) == OK) {
+ if (win->_clear)
+ newscr->_clear = TRUE;
+ code = doupdate();
+ /*
+ * 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);
+}
+
+int wnoutrefresh(WINDOW *win)
+{
+short limit_x;
+short i, j;
+short begx;
+short begy;
+short m, n;
+bool wide;
+
+ T((T_CALLED("wnoutrefresh(%p)"), win));
+#ifdef TRACE
+ if (_nc_tracing & TRACE_UPDATE)
+ _tracedump("...win", win);
+#endif /* TRACE */
+
+ /*
+ * This function will break badly if we try to refresh a pad.
+ */
+ if ((win == 0)
+ || (win->_flags & _ISPAD))
+ returnCode(ERR);
+
+ /* put them here so "win == 0" won't break our code */
+ begx = win->_begx;
+ begy = win->_begy;
+
+ newscr->_bkgd = win->_bkgd;
+ newscr->_attrs = win->_attrs;
+
+ /* merge in change information from all subwindows of this window */
+ wsyncdown(win);
+
+ /*
+ * 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 >= (newscr->_maxx - 1));
+
+ 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(n) */
+ limit_x = win->_maxx;
+ /* limit(j) */
+ if (limit_x > win->_maxx)
+ limit_x = win->_maxx;
+
+ for (i = 0, m = begy + win->_yoffset;
+ i <= win->_maxy && m <= newscr->_maxy;
+ i++, m++) {
+ register struct ldat *nline = &newscr->_line[m];
+ register struct ldat *oline = &win->_line[i];
+
+ if (oline->firstchar != _NOCHANGE) {
+ int last = oline->lastchar;
+
+ if (last > limit_x)
+ last = limit_x;
+
+ for (j = oline->firstchar, n = j + begx; j <= last; j++, n++) {
+ if (oline->text[j] != nline->text[n]) {
+ nline->text[n] = oline->text[j];
+ CHANGED_CELL(nline, n);
+ }
+ }
+
+ }
+
+#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 = i);
+ }
+
+ if (win->_clear) {
+ win->_clear = FALSE;
+ newscr->_clear = TRUE;
+ }
+
+ if (! win->_leaveok) {
+ newscr->_cury = win->_cury + win->_begy + win->_yoffset;
+ newscr->_curx = win->_curx + win->_begx;
+ }
+ newscr->_leaveok = win->_leaveok;
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_UPDATE)
+ _tracedump("newscr", newscr);
+#endif /* TRACE */
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_restart.c b/contrib/ncurses/ncurses/base/lib_restart.c
new file mode 100644
index 000000000000..de0182f42691
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_restart.c
@@ -0,0 +1,90 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * Terminfo-only terminal setup routines:
+ *
+ * int restartterm(const char *, int, int *)
+ * TERMINAL *set_curterm(TERMINAL *)
+ * int del_curterm(TERMINAL *)
+ */
+
+#include <curses.priv.h>
+
+#if defined(SVR4_TERMIO) && !defined(_POSIX_SOURCE)
+#define _POSIX_SOURCE
+#endif
+
+#include <term.h> /* lines, columns, cur_term */
+
+MODULE_ID("$Id: lib_restart.c,v 1.2 1999/07/24 20:10:04 tom Exp $")
+
+int restartterm(NCURSES_CONST char *termp, int filenum, int *errret)
+{
+int saveecho = SP->_echo;
+int savecbreak = SP->_cbreak;
+int saveraw = SP->_raw;
+int savenl = SP->_nl;
+
+ T((T_CALLED("restartterm(%s,%d,%p)"), termp, filenum, errret));
+
+ setupterm(termp, filenum, errret);
+
+ if (saveecho)
+ echo();
+ else
+ noecho();
+
+ if (savecbreak) {
+ cbreak();
+ noraw();
+ } else if (saveraw) {
+ nocbreak();
+ raw();
+ } else {
+ nocbreak();
+ noraw();
+ }
+ if (savenl)
+ nl();
+ else
+ nonl();
+
+ reset_prog_mode();
+
+#if USE_SIZECHANGE
+ _nc_update_screensize();
+#endif
+
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_scanw.c b/contrib/ncurses/ncurses/base/lib_scanw.c
new file mode 100644
index 000000000000..cc66613ff52f
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_scanw.c
@@ -0,0 +1,111 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.8 1998/04/11 22:54:18 tom Exp $")
+
+#if !HAVE_VSSCANF
+#if defined(__QNX__)
+extern int vsscanf(const char *str, const char *format, __va_list __arg);
+#else
+extern int vsscanf(const char *str, const char *format, ...);
+#endif
+#endif
+
+int vwscanw(WINDOW *win, NCURSES_CONST char *fmt, va_list argp)
+{
+char buf[BUFSIZ];
+
+ if (wgetnstr(win, buf, sizeof(buf)-1) == ERR)
+ return(ERR);
+
+ return(vsscanf(buf, fmt, argp));
+}
+
+int scanw(NCURSES_CONST char *fmt, ...)
+{
+int code;
+va_list ap;
+
+ T(("scanw(\"%s\",...) called", fmt));
+
+ va_start(ap, fmt);
+ code = vwscanw(stdscr, fmt, ap);
+ va_end(ap);
+ return (code);
+}
+
+int wscanw(WINDOW *win, NCURSES_CONST char *fmt, ...)
+{
+int code;
+va_list ap;
+
+ T(("wscanw(%p,\"%s\",...) called", win, fmt));
+
+ va_start(ap, fmt);
+ code = vwscanw(win, fmt, ap);
+ va_end(ap);
+ return (code);
+}
+
+int mvscanw(int y, int x, NCURSES_CONST char *fmt, ...)
+{
+int code;
+va_list ap;
+
+ va_start(ap, fmt);
+ code = (move(y, x) == OK) ? vwscanw(stdscr, fmt, ap) : ERR;
+ va_end(ap);
+ return (code);
+}
+
+int mvwscanw(WINDOW *win, int y, int x, NCURSES_CONST char *fmt, ...)
+{
+int code;
+va_list ap;
+
+ va_start(ap, fmt);
+ code = (wmove(win, y, x) == OK) ? vwscanw(win, fmt, ap) : ERR;
+ va_end(ap);
+ return (code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_screen.c b/contrib/ncurses/ncurses/base/lib_screen.c
new file mode 100644
index 000000000000..3038393c2266
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_screen.c
@@ -0,0 +1,198 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+#include <curses.priv.h>
+
+#include <sys/stat.h>
+#include <time.h>
+#include <term.h> /* exit_ca_mode, non_rev_rmcup */
+
+MODULE_ID("$Id: lib_screen.c,v 1.15 1999/07/24 20:05:29 tom Exp $")
+
+static time_t dumptime;
+
+WINDOW *getwin(FILE *filep)
+{
+ WINDOW tmp, *nwin;
+ int n;
+
+ T((T_CALLED("getwin(%p)"), filep));
+
+ (void) fread(&tmp, sizeof(WINDOW), 1, filep);
+ if (ferror(filep))
+ returnWin(0);
+
+ if ((nwin = newwin(tmp._maxy+1, tmp._maxx+1, 0, 0)) == 0)
+ returnWin(0);
+
+ /*
+ * We deliberately do not restore the _parx, _pary, or _parent
+ * fields, because the window hierarchy within which they
+ * made sense is probably gone.
+ */
+ 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|_ISPAD);
+
+ nwin->_attrs = tmp._attrs;
+ nwin->_bkgd = tmp._bkgd;
+
+ nwin->_clear = tmp._clear;
+ nwin->_scroll = tmp._scroll;
+ nwin->_leaveok = tmp._leaveok;
+ nwin->_use_keypad = tmp._use_keypad;
+ nwin->_delay = tmp._delay;
+ nwin->_immed = tmp._immed;
+ nwin->_sync = tmp._sync;
+
+ nwin->_regtop = tmp._regtop;
+ nwin->_regbottom = tmp._regbottom;
+
+ for (n = 0; n < nwin->_maxy + 1; n++)
+ {
+ (void) fread(nwin->_line[n].text,
+ sizeof(chtype), (size_t)(nwin->_maxx + 1), filep);
+ if (ferror(filep))
+ {
+ delwin(nwin);
+ returnWin(0);
+ }
+ }
+ touchwin(nwin);
+
+ returnWin(nwin);
+}
+
+int putwin(WINDOW *win, FILE *filep)
+{
+ int code = ERR;
+ int n;
+
+ T((T_CALLED("putwin(%p,%p)"), win, filep));
+
+ if (win) {
+ (void) fwrite(win, sizeof(WINDOW), 1, filep);
+ if (ferror(filep))
+ returnCode(code);
+
+ for (n = 0; n < win->_maxy + 1; n++)
+ {
+ (void) fwrite(win->_line[n].text,
+ sizeof(chtype), (size_t)(win->_maxx + 1), filep);
+ if (ferror(filep))
+ returnCode(code);
+ }
+ code = OK;
+ }
+ returnCode(code);
+}
+
+int scr_restore(const char *file)
+{
+ FILE *fp = 0;
+
+ T((T_CALLED("scr_restore(%s)"), _nc_visbuf(file)));
+
+ if (_nc_access(file, R_OK) < 0
+ || (fp = fopen(file, "rb")) == 0)
+ returnCode(ERR);
+ else
+ {
+ delwin(newscr);
+ newscr = getwin(fp);
+ (void) fclose(fp);
+ returnCode(OK);
+ }
+}
+
+int scr_dump(const char *file)
+{
+ FILE *fp = 0;
+
+ T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file)));
+
+ if (_nc_access(file, W_OK) < 0
+ || (fp = fopen(file, "wb")) == 0)
+ returnCode(ERR);
+ else
+ {
+ (void) putwin(newscr, fp);
+ (void) fclose(fp);
+ dumptime = time((time_t *)0);
+ returnCode(OK);
+ }
+}
+
+int scr_init(const char *file)
+{
+ FILE *fp = 0;
+ struct stat stb;
+
+ T((T_CALLED("scr_init(%s)"), _nc_visbuf(file)));
+
+ if (exit_ca_mode && non_rev_rmcup)
+ returnCode(ERR);
+
+ if (_nc_access(file, R_OK) < 0
+ || (fp = fopen(file, "rb")) == 0)
+ returnCode(ERR);
+ else if (fstat(STDOUT_FILENO, &stb) || stb.st_mtime > dumptime)
+ returnCode(ERR);
+ else
+ {
+ delwin(curscr);
+ curscr = getwin(fp);
+ (void) fclose(fp);
+ returnCode(OK);
+ }
+}
+
+int scr_set(const char *file)
+{
+ T((T_CALLED("scr_set(%s)"), _nc_visbuf(file)));
+
+ if (scr_init(file) == ERR)
+ returnCode(ERR);
+ else
+ {
+ delwin(newscr);
+ newscr = dupwin(curscr);
+ returnCode(OK);
+ }
+}
diff --git a/contrib/ncurses/ncurses/base/lib_scroll.c b/contrib/ncurses/ncurses/base/lib_scroll.c
new file mode 100644
index 000000000000..197bb221a07c
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_scroll.c
@@ -0,0 +1,118 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.16 1998/02/11 12:13:55 tom Exp $")
+
+void _nc_scroll_window(WINDOW *win, int const n, short const top, short const bottom, chtype blank)
+{
+int line, j;
+size_t to_copy = (size_t)(sizeof(chtype) * (win->_maxx + 1));
+
+ TR(TRACE_MOVE, ("_nc_scroll_window(%p, %d, %d, %d)", win, n, top,bottom));
+
+ /*
+ * 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.
+ */
+
+ /* shift n lines downwards */
+ if (n < 0) {
+ for (line = bottom; line >= top-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 < top-n; 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) {
+ for (line = top; line <= bottom-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 = bottom; line > bottom-n; 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);
+}
+
+int
+wscrl(WINDOW *win, int n)
+{
+ T((T_CALLED("wscrl(%p,%d)"), win, n));
+
+ if (!win || !win->_scroll)
+ returnCode(ERR);
+
+ if (n == 0)
+ returnCode(OK);
+
+ if ((n > (win->_regbottom - win->_regtop)) ||
+ (-n > (win->_regbottom - win->_regtop)))
+ returnCode(ERR);
+
+ _nc_scroll_window(win, n, win->_regtop, win->_regbottom, _nc_background(win));
+
+ _nc_synchook(win);
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_scrollok.c b/contrib/ncurses/ncurses/base/lib_scrollok.c
new file mode 100644
index 000000000000..f24eb8ebb0c6
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_scrollok.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:01 tom Exp $")
+
+int scrollok(WINDOW *win, bool flag)
+{
+ T((T_CALLED("scrollok(%p,%d)"), win, flag));
+
+ if (win) {
+ win->_scroll = flag;
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_scrreg.c b/contrib/ncurses/ncurses/base/lib_scrreg.c
new file mode 100644
index 000000000000..ddeab2498bfd
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_scrreg.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.7 1998/02/11 12:13:53 tom Exp $")
+
+int wsetscrreg(WINDOW *win, int top, int bottom)
+{
+ T((T_CALLED("wsetscrreg(%p,%d,%d)"), win, top, bottom));
+
+ if (win &&
+ top >= 0 && top <= win->_maxy &&
+ bottom >= 0 && bottom <= win->_maxy &&
+ bottom > top)
+ {
+ win->_regtop = (short)top;
+ win->_regbottom = (short)bottom;
+
+ returnCode(OK);
+ } else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_set_term.c b/contrib/ncurses/ncurses/base/lib_set_term.c
new file mode 100644
index 000000000000..443236cf9cda
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_set_term.c
@@ -0,0 +1,315 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_set_term.c
+**
+** The routine set_term().
+**
+*/
+
+#include <curses.priv.h>
+
+#include <term.h> /* cur_term */
+
+MODULE_ID("$Id: lib_set_term.c,v 1.46 1999/07/24 20:05:49 tom Exp $")
+
+SCREEN * set_term(SCREEN *screenp)
+{
+SCREEN *oldSP;
+
+ T((T_CALLED("set_term(%p)"), screenp));
+
+ oldSP = SP;
+ _nc_set_screen(screenp);
+
+ set_curterm(SP->_term);
+ curscr = SP->_curscr;
+ newscr = SP->_newscr;
+ stdscr = SP->_stdscr;
+ COLORS = SP->_color_count;
+ COLOR_PAIRS = SP->_pair_count;
+ memcpy(acs_map, SP->_acs_map, sizeof(chtype)*ACS_LEN);
+
+ T((T_RETURN("%p"), oldSP));
+ return(oldSP);
+}
+
+static void _nc_free_keytry(struct tries *kt)
+{
+ if (kt != 0) {
+ _nc_free_keytry(kt->child);
+ _nc_free_keytry(kt->sibling);
+ free(kt);
+ }
+}
+
+/*
+ * Free the storage associated with the given SCREEN sp.
+ */
+void delscreen(SCREEN *sp)
+{
+ SCREEN **scan = &_nc_screen_chain;
+
+ T((T_CALLED("delscreen(%p)"), sp));
+
+ while(*scan)
+ {
+ if (*scan == sp)
+ {
+ *scan = sp->_next_screen;
+ break;
+ }
+ scan = &(*scan)->_next_screen;
+ }
+
+ _nc_freewin(sp->_curscr);
+ _nc_freewin(sp->_newscr);
+ _nc_freewin(sp->_stdscr);
+ _nc_free_keytry(sp->_keytry);
+ _nc_free_keytry(sp->_key_ok);
+
+ FreeIfNeeded(sp->_color_table);
+ FreeIfNeeded(sp->_color_pairs);
+
+ FreeIfNeeded(sp->oldhash);
+ FreeIfNeeded(sp->newhash);
+
+ del_curterm(sp->_term);
+
+ 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 (sp == SP) {
+ curscr = 0;
+ newscr = 0;
+ stdscr = 0;
+ COLORS = 0;
+ COLOR_PAIRS = 0;
+ _nc_set_screen(0);
+ }
+ returnVoid;
+}
+
+static ripoff_t rippedoff[5];
+static ripoff_t *rsp = rippedoff;
+#define N_RIPS SIZEOF(rippedoff)
+
+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 (int code GCC_UNUSED) { return TRUE; }
+static void no_mouse_resume(SCREEN *sp GCC_UNUSED) { }
+static void no_mouse_wrap (SCREEN *sp GCC_UNUSED) { }
+
+int _nc_setupscreen(short slines, short const scolumns, FILE *output)
+/* OS-independent screen initializations */
+{
+int bottom_stolen = 0;
+size_t i;
+
+ assert(SP==0); /* has been reset in newterm() ! */
+ if (!_nc_alloc_screen())
+ return ERR;
+
+ SP->_next_screen = _nc_screen_chain;
+ _nc_screen_chain = SP;
+
+ _nc_set_buffer(output, TRUE);
+ SP->_term = cur_term;
+ SP->_lines = slines;
+ SP->_lines_avail = slines;
+ SP->_columns = scolumns;
+ SP->_cursrow = -1;
+ SP->_curscol = -1;
+ SP->_nl = TRUE;
+ SP->_raw = FALSE;
+ SP->_cbreak = 0;
+ SP->_echo = TRUE;
+ SP->_fifohead = -1;
+ SP->_endwin = TRUE;
+ SP->_ofp = output;
+ SP->_cursor = -1; /* cannot know real cursor shape */
+#ifdef NCURSES_NO_PADDING
+ SP->_no_padding = getenv("NCURSES_NO_PADDING") != 0;
+#endif
+
+ 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;
+
+ /* initialize the panel hooks */
+ SP->_panelHook.top_panel = (struct panel*)0;
+ SP->_panelHook.bottom_panel = (struct panel*)0;
+ SP->_panelHook.stdscr_pseudo_panel = (struct panel*)0;
+
+ /*
+ * 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. Note that this impacts the alternate character set mapping
+ * as well.
+ */
+ if (magic_cookie_glitch > 0) {
+
+ SP->_xmc_triggers = termattrs() & (
+ A_ALTCHARSET |
+ A_BLINK |
+ A_BOLD |
+ A_REVERSE |
+ A_STANDOUT |
+ A_UNDERLINE
+ );
+ SP->_xmc_suppress = SP->_xmc_triggers & (chtype)~(A_BOLD);
+
+ T(("magic cookie attributes %s", _traceattr(SP->_xmc_suppress)));
+#if USE_XMC_SUPPORT
+ /*
+ * To keep this simple, suppress all of the optimization hooks
+ * except for clear_screen and the cursor addressing.
+ */
+ clr_eol = 0;
+ clr_eos = 0;
+ set_attributes = 0;
+#else
+ magic_cookie_glitch = -1;
+ acs_chars = 0;
+#endif
+ }
+ _nc_init_acs();
+ memcpy(SP->_acs_map, acs_map, sizeof(chtype)*ACS_LEN);
+
+ _nc_idcok = TRUE;
+ _nc_idlok = FALSE;
+
+ _nc_windows = 0; /* no windows yet */
+
+ SP->oldhash = 0;
+ SP->newhash = 0;
+
+ T(("creating newscr"));
+ if ((newscr = newwin(slines, scolumns, 0, 0)) == 0)
+ return ERR;
+
+ T(("creating curscr"));
+ if ((curscr = newwin(slines, scolumns, 0, 0)) == 0)
+ return ERR;
+
+ SP->_newscr = newscr;
+ SP->_curscr = curscr;
+#if USE_SIZECHANGE
+ SP->_resize = resizeterm;
+#endif
+
+ newscr->_clear = TRUE;
+ curscr->_clear = FALSE;
+
+ for (i=0, rsp = rippedoff; rsp->line && (i < N_RIPS); rsp++, i++) {
+ if (rsp->hook) {
+ WINDOW *w;
+ int count = (rsp->line < 0) ? -rsp->line : rsp->line;
+
+ if (rsp->line < 0) {
+ w = newwin(count,scolumns,SP->_lines_avail - count,0);
+ if (w) {
+ rsp->w = w;
+ rsp->hook(w, scolumns);
+ bottom_stolen += count;
+ }
+ else
+ return ERR;
+ } else {
+ w = newwin(count,scolumns, 0, 0);
+ if (w) {
+ rsp->w = w;
+ rsp->hook(w, scolumns);
+ SP->_topstolen += count;
+ }
+ else
+ return ERR;
+ }
+ SP->_lines_avail -= count;
+ }
+ rsp->line = 0;
+ }
+ /* reset the stack */
+ rsp = rippedoff;
+
+ T(("creating stdscr"));
+ assert ((SP->_lines_avail + SP->_topstolen + bottom_stolen) == slines);
+ if ((stdscr = newwin(LINES = SP->_lines_avail, scolumns, 0, 0)) == 0)
+ return ERR;
+ SP->_stdscr = stdscr;
+
+ def_shell_mode();
+ def_prog_mode();
+
+ return OK;
+}
+
+/* The internal implementation interprets line as the number of
+ lines to rip off from the top or bottom.
+ */
+int
+_nc_ripoffline(int line, int (*init)(WINDOW *,int))
+{
+ if (line == 0)
+ return(OK);
+
+ if (rsp >= rippedoff + N_RIPS)
+ return(ERR);
+
+ rsp->line = line;
+ rsp->hook = init;
+ rsp->w = 0;
+ rsp++;
+
+ return(OK);
+}
+
+int
+ripoffline(int line, int (*init)(WINDOW *, int))
+{
+ T((T_CALLED("ripoffline(%d,%p)"), line, init));
+
+ if (line == 0)
+ returnCode(OK);
+
+ returnCode(_nc_ripoffline ((line<0) ? -1 : 1, init));
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slk.c b/contrib/ncurses/ncurses/base/lib_slk.c
new file mode 100644
index 000000000000..9b9b09a4d064
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slk.c
@@ -0,0 +1,214 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slk.c
+ * Soft key routines.
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <term.h> /* num_labels, label_*, plab_norm */
+
+MODULE_ID("$Id: lib_slk.c,v 1.16 1999/03/03 23:44:22 juergen Exp $")
+
+/*
+ * We'd like to move these into the screen context structure, but cannot,
+ * because slk_init() is called before initscr()/newterm().
+ */
+int _nc_slk_format; /* one more than format specified in slk_init() */
+
+/*
+ * Paint the info line for the PC style SLK emulation.
+ *
+ */
+static void
+slk_paint_info(WINDOW *win)
+{
+ if (win && SP->slk_format==4)
+ {
+ int i;
+
+ mvwhline (win,0,0,0,getmaxx(win));
+ wmove (win,0,0);
+
+ for (i = 0; i < SP->_slk->maxlab; i++) {
+ if (win && SP->slk_format==4)
+ {
+ mvwaddch(win,0,SP->_slk->ent[i].x,'F');
+ if (i<9)
+ waddch(win,'1'+i);
+ else
+ {
+ waddch(win,'1');
+ waddch(win,'0' + (i-9));
+ }
+ }
+ }
+ }
+}
+
+/*
+ * Initialize soft labels.
+ * Called from newterm()
+ */
+int
+_nc_slk_initialize(WINDOW *stwin, int cols)
+{
+int i, x;
+int res = OK;
+char *p;
+
+ T(("slk_initialize()"));
+
+ if (SP->_slk)
+ { /* we did this already, so simply return */
+ return(OK);
+ }
+ else
+ if ((SP->_slk = typeCalloc(SLK, 1)) == 0)
+ return(ERR);
+
+ SP->_slk->ent = NULL;
+ SP->_slk->buffer = NULL;
+ SP->_slk->attr = A_STANDOUT;
+
+ SP->_slk->maxlab = (num_labels > 0) ?
+ num_labels : MAX_SKEY(_nc_slk_format);
+ SP->_slk->maxlen = (num_labels > 0) ?
+ label_width * label_height : MAX_SKEY_LEN(_nc_slk_format);
+ SP->_slk->labcnt = (SP->_slk->maxlab < MAX_SKEY(_nc_slk_format)) ?
+ MAX_SKEY(_nc_slk_format) : SP->_slk->maxlab;
+
+ SP->_slk->ent = typeCalloc(slk_ent, SP->_slk->labcnt);
+ if (SP->_slk->ent == NULL)
+ goto exception;
+
+ p = SP->_slk->buffer = (char*) calloc(2*SP->_slk->labcnt,(1+SP->_slk->maxlen));
+ if (SP->_slk->buffer == NULL)
+ goto exception;
+
+ for (i = 0; i < SP->_slk->labcnt; i++) {
+ SP->_slk->ent[i].text = p;
+ p += (1 + SP->_slk->maxlen);
+ SP->_slk->ent[i].form_text = p;
+ p += (1 + SP->_slk->maxlen);
+ memset(SP->_slk->ent[i].form_text, ' ', (unsigned)(SP->_slk->maxlen));
+ SP->_slk->ent[i].visible = (i < SP->_slk->maxlab);
+ }
+ if (_nc_slk_format >= 3) /* PC style */
+ {
+ int gap = (cols - 3 * (3 + 4*SP->_slk->maxlen))/2;
+
+ if (gap < 1)
+ gap = 1;
+
+ for (i = x = 0; i < SP->_slk->maxlab; i++) {
+ SP->_slk->ent[i].x = x;
+ x += SP->_slk->maxlen;
+ x += (i==3 || i==7) ? gap : 1;
+ }
+ if (_nc_slk_format == 4)
+ slk_paint_info (stwin);
+ }
+ else {
+ if (_nc_slk_format == 2) { /* 4-4 */
+ int gap = cols - (SP->_slk->maxlab * SP->_slk->maxlen) - 6;
+
+ if (gap < 1)
+ gap = 1;
+ for (i = x = 0; i < SP->_slk->maxlab; i++) {
+ SP->_slk->ent[i].x = x;
+ x += SP->_slk->maxlen;
+ x += (i == 3) ? gap : 1;
+ }
+ }
+ else
+ {
+ if (_nc_slk_format == 1) { /* 1 -> 3-2-3 */
+ int gap = (cols - (SP->_slk->maxlab * SP->_slk->maxlen) - 5) / 2;
+
+ if (gap < 1)
+ gap = 1;
+ for (i = x = 0; i < SP->_slk->maxlab; i++) {
+ SP->_slk->ent[i].x = x;
+ x += SP->_slk->maxlen;
+ x += (i == 2 || i == 4) ? gap : 1;
+ }
+ }
+ else
+ goto exception;
+ }
+ }
+ SP->_slk->dirty = TRUE;
+ if ((SP->_slk->win = stwin) == NULL)
+ {
+ exception:
+ if (SP->_slk)
+ {
+ FreeIfNeeded(SP->_slk->buffer);
+ FreeIfNeeded(SP->_slk->ent);
+ free(SP->_slk);
+ SP->_slk = (SLK*)0;
+ res = (ERR);
+ }
+ }
+
+ /* 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)
+ */
+ SP->slk_format = _nc_slk_format;
+ _nc_slk_format = 0;
+ return(res);
+}
+
+
+/*
+ * Restore the soft labels on the screen.
+ */
+int
+slk_restore(void)
+{
+ T((T_CALLED("slk_restore()")));
+
+ if (SP->_slk == NULL)
+ return(ERR);
+ SP->_slk->hidden = FALSE;
+ SP->_slk->dirty = TRUE;
+ /* we have to repaint info line eventually */
+ slk_paint_info(SP->_slk->win);
+
+ returnCode(slk_refresh());
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkatr_set.c b/contrib/ncurses/ncurses/base/lib_slkatr_set.c
new file mode 100644
index 000000000000..0695d186bb5d
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkatr_set.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1998 *
+ ****************************************************************************/
+
+/*
+ * lib_slkatr_set.c
+ * Soft key routines.
+ * Set the labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatr_set.c,v 1.3 1999/05/16 17:13:59 juergen Exp $")
+
+int
+slk_attr_set(const attr_t attr, short color_pair_number, void* opts)
+{
+ T((T_CALLED("slk_attr_set(%s,%d)"), _traceattr(attr), color_pair_number));
+
+ if (SP!=0 && SP->_slk!=0 && !opts &&
+ color_pair_number>=0 && color_pair_number<COLOR_PAIRS)
+ {
+ SP->_slk->attr = attr;
+ toggle_attr_on(SP->_slk->attr,COLOR_PAIR(color_pair_number));
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkatrof.c b/contrib/ncurses/ncurses/base/lib_slkatrof.c
new file mode 100644
index 000000000000..5e4f5f5593a3
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkatrof.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slkatrof.c
+ * Soft key routines.
+ * Switch off labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatrof.c,v 1.4 1998/03/11 19:26:07 juergen Exp $")
+
+int
+slk_attroff(const chtype attr)
+{
+ T((T_CALLED("slk_attroff(%s)"), _traceattr(attr)));
+
+ if (SP!=0 && SP->_slk!=0)
+ {
+ toggle_attr_off(SP->_slk->attr,attr);
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkatron.c b/contrib/ncurses/ncurses/base/lib_slkatron.c
new file mode 100644
index 000000000000..a24886522cde
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkatron.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slkatron.c
+ * Soft key routines.
+ * Switch on labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatron.c,v 1.4 1998/03/11 19:26:07 juergen Exp $")
+
+int
+slk_attron(const chtype attr)
+{
+ T((T_CALLED("slk_attron(%s)"), _traceattr(attr)));
+
+ if (SP!=0 && SP->_slk!=0)
+ {
+ toggle_attr_on(SP->_slk->attr,attr);
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkatrset.c b/contrib/ncurses/ncurses/base/lib_slkatrset.c
new file mode 100644
index 000000000000..391c7ffe8cb7
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkatrset.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slkatrset.c
+ * Soft key routines.
+ * Set the labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkatrset.c,v 1.4 1998/03/11 19:26:01 juergen Exp $")
+
+int
+slk_attrset(const chtype attr)
+{
+ T((T_CALLED("slk_attrset(%s)"), _traceattr(attr)));
+
+ if (SP!=0 && SP->_slk!=0)
+ {
+ SP->_slk->attr = attr;
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkattr.c b/contrib/ncurses/ncurses/base/lib_slkattr.c
new file mode 100644
index 000000000000..a13240324e51
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkattr.c
@@ -0,0 +1,54 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slkattr.c
+ * Soft key routines.
+ * Fetch the labels attributes
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkattr.c,v 1.3 1998/02/11 12:13:56 tom Exp $")
+
+attr_t
+slk_attr(void)
+{
+ T((T_CALLED("slk_attr()")));
+
+ if (SP!=0 && SP->_slk!=0)
+ {
+ returnAttr(SP->_slk->attr);
+ }
+ else
+ returnAttr(0);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkclear.c b/contrib/ncurses/ncurses/base/lib_slkclear.c
new file mode 100644
index 000000000000..ac6e414beaa2
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkclear.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slkclear.c
+ * Soft key routines.
+ * Remove soft labels from the screen.
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkclear.c,v 1.4 1999/03/03 23:44:22 juergen Exp $")
+
+int
+slk_clear(void)
+{
+ T((T_CALLED("slk_clear()")));
+
+ if (SP == NULL || SP->_slk == NULL)
+ returnCode(ERR);
+ SP->_slk->hidden = TRUE;
+ /* For simulated SLK's it's looks much more natural to
+ inherit those attributes from the standard screen */
+ SP->_slk->win->_bkgd = stdscr->_bkgd;
+ SP->_slk->win->_attrs = stdscr->_attrs;
+ if (SP->_slk->win == stdscr) {
+ returnCode(OK);
+ }
+ else {
+ werase(SP->_slk->win);
+ returnCode(wrefresh(SP->_slk->win));
+ }
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkcolor.c b/contrib/ncurses/ncurses/base/lib_slkcolor.c
new file mode 100644
index 000000000000..3728808f9b6c
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkcolor.c
@@ -0,0 +1,54 @@
+/****************************************************************************
+ * Copyright (c) 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: Juergen Pfeifer <juergen.pfeifer@gmx.net> 1998 *
+ ****************************************************************************/
+
+/*
+ * lib_slkcolor.c
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slkcolor.c,v 1.5 1999/05/16 17:14:13 juergen Exp $")
+
+int
+slk_color(short color_pair_number)
+{
+ T((T_CALLED("slk_color(%d)"), color_pair_number));
+
+ if (SP!=0 && SP->_slk!=0 &&
+ color_pair_number>=0 && color_pair_number<COLOR_PAIRS)
+ {
+ T(("... current %ld", (long) PAIR_NUMBER(SP->_slk->attr)));
+ toggle_attr_on(SP->_slk->attr,COLOR_PAIR(color_pair_number));
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkinit.c b/contrib/ncurses/ncurses/base/lib_slkinit.c
new file mode 100644
index 000000000000..708442604d91
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkinit.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * 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.3 1998/02/11 12:13:56 tom Exp $")
+
+int
+slk_init(int format)
+{
+ T((T_CALLED("slk_init(%d)"), format));
+ if (format < 0 || format > 3)
+ returnCode(ERR);
+ _nc_slk_format = 1 + format;
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slklab.c b/contrib/ncurses/ncurses/base/lib_slklab.c
new file mode 100644
index 000000000000..03039ad696ca
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slklab.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slklab.c
+ * Soft key routines.
+ * Fetch the label text.
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_slklab.c,v 1.4 1998/02/11 12:13:54 tom Exp $")
+
+char*
+slk_label(int n)
+{
+ T((T_CALLED("slk_label(%d)"), n));
+
+ if (SP == NULL || SP->_slk == NULL || n < 1 || n > SP->_slk->labcnt)
+ returnPtr(0);
+ returnPtr(SP->_slk->ent[n-1].text);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkrefr.c b/contrib/ncurses/ncurses/base/lib_slkrefr.c
new file mode 100644
index 000000000000..ee3c91dbee67
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkrefr.c
@@ -0,0 +1,126 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slkrefr.c
+ * Write SLK window to the (virtual) screen.
+ */
+#include <curses.priv.h>
+#include <term.h> /* num_labels, label_*, plab_norm */
+
+MODULE_ID("$Id: lib_slkrefr.c,v 1.8 1999/03/14 00:10:27 Alexander.V.Lukyanov Exp $")
+
+/*
+ * Write the soft labels to the soft-key window.
+ */
+static void
+slk_intern_refresh(SLK *slk)
+{
+int i;
+int fmt = SP->slk_format;
+
+ for (i = 0; i < slk->labcnt; i++) {
+ if (slk->dirty || slk->ent[i].dirty) {
+ if (slk->ent[i].visible) {
+ if (num_labels > 0 && SLK_STDFMT(fmt))
+ {
+ if (i < num_labels) {
+ TPUTS_TRACE("plab_norm");
+ putp(tparm(plab_norm, i+1, slk->ent[i].form_text));
+ }
+ }
+ else
+ {
+ wmove(slk->win,SLK_LINES(fmt)-1,slk->ent[i].x);
+ if (SP && SP->_slk)
+ wattrset(slk->win,SP->_slk->attr);
+ waddnstr(slk->win,slk->ent[i].form_text,
+ MAX_SKEY_LEN(fmt));
+ /* if we simulate SLK's, it's looking much more
+ natural to use the current ATTRIBUTE also
+ for the label window */
+ wattrset(slk->win,stdscr->_attrs);
+ }
+ }
+ slk->ent[i].dirty = FALSE;
+ }
+ }
+ slk->dirty = FALSE;
+
+ if (num_labels > 0) {
+ if (slk->hidden)
+ {
+ TPUTS_TRACE("label_off");
+ putp(label_off);
+ }
+ else
+ {
+ TPUTS_TRACE("label_on");
+ putp(label_on);
+ }
+ }
+}
+
+/*
+ * Refresh the soft labels.
+ */
+int
+slk_noutrefresh(void)
+{
+ T((T_CALLED("slk_noutrefresh()")));
+
+ if (SP == NULL || SP->_slk == NULL)
+ returnCode(ERR);
+ if (SP->_slk->hidden)
+ returnCode(OK);
+ slk_intern_refresh(SP->_slk);
+
+ returnCode(wnoutrefresh(SP->_slk->win));
+}
+
+/*
+ * Refresh the soft labels.
+ */
+int
+slk_refresh(void)
+{
+ T((T_CALLED("slk_refresh()")));
+
+ if (SP == NULL || SP->_slk == NULL)
+ returnCode(ERR);
+ if (SP->_slk->hidden)
+ returnCode(OK);
+ slk_intern_refresh(SP->_slk);
+
+ returnCode(wrefresh(SP->_slk->win));
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slkset.c b/contrib/ncurses/ncurses/base/lib_slkset.c
new file mode 100644
index 000000000000..27471add77fa
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slkset.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_slkset.c
+ * Set soft label text.
+ */
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_slkset.c,v 1.3 1998/02/11 12:13:56 tom Exp $")
+
+int
+slk_set(int i, const char *astr, int format)
+{
+SLK *slk = SP->_slk;
+size_t len;
+const char *str = astr;
+const char *p;
+
+ T((T_CALLED("slk_set(%d, \"%s\", %d)"), i, str, format));
+
+ if (slk == NULL || i < 1 || i > slk->labcnt || format < 0 || format > 2)
+ returnCode(ERR);
+ if (str == NULL)
+ str = "";
+
+ while (isspace(*str)) str++; /* skip over leading spaces */
+ p = str;
+ while (isprint(*p)) p++; /* The first non-print stops */
+
+ --i; /* Adjust numbering of labels */
+
+ len = (size_t)(p - str);
+ if (len > (unsigned)slk->maxlen)
+ len = slk->maxlen;
+ if (len==0)
+ slk->ent[i].text[0] = 0;
+ else
+ (void) strncpy(slk->ent[i].text, str, len);
+ memset(slk->ent[i].form_text,' ', (unsigned)slk->maxlen);
+ slk->ent[i].text[slk->maxlen] = 0;
+ /* len = strlen(slk->ent[i].text); */
+
+ switch(format) {
+ case 0: /* left-justified */
+ memcpy(slk->ent[i].form_text,
+ slk->ent[i].text,
+ len);
+ break;
+ case 1: /* centered */
+ memcpy(slk->ent[i].form_text+(slk->maxlen - len)/2,
+ slk->ent[i].text,
+ len);
+ break;
+ case 2: /* right-justified */
+ memcpy(slk->ent[i].form_text+ slk->maxlen - len,
+ slk->ent[i].text,
+ len);
+ break;
+ }
+ slk->ent[i].form_text[slk->maxlen] = 0;
+ slk->ent[i].dirty = TRUE;
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_slktouch.c b/contrib/ncurses/ncurses/base/lib_slktouch.c
new file mode 100644
index 000000000000..c2829aed0e18
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_slktouch.c
@@ -0,0 +1,53 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * 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.3 1998/02/11 12:13:56 tom Exp $")
+
+int
+slk_touch(void)
+{
+ T((T_CALLED("slk_touch()")));
+
+ if (SP == NULL || SP->_slk == NULL)
+ returnCode(ERR);
+ SP->_slk->dirty = TRUE;
+
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_touch.c b/contrib/ncurses/ncurses/base/lib_touch.c
new file mode 100644
index 000000000000..7ce863d06f10
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_touch.c
@@ -0,0 +1,87 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.6 1998/04/11 22:55:02 tom Exp $")
+
+bool is_linetouched(WINDOW *win, int line)
+{
+ T((T_CALLED("is_linetouched(%p,%d)"), win, line));
+
+ /* XSI doesn't define any error */
+ if (!win || (line > win->_maxy) || (line < 0))
+ returnCode(ERR);
+
+ returnCode(win->_line[line].firstchar != _NOCHANGE ? TRUE : FALSE);
+}
+
+bool is_wintouched(WINDOW *win)
+{
+int i;
+
+ T((T_CALLED("is_wintouched(%p)"), win));
+
+ if (win)
+ for (i = 0; i <= win->_maxy; i++)
+ if (win->_line[i].firstchar != _NOCHANGE)
+ returnCode(TRUE);
+ returnCode(FALSE);
+}
+
+int wtouchln(WINDOW *win, int y, int n, int changed)
+{
+int i;
+
+ T((T_CALLED("wtouchln(%p,%d,%d,%d)"), 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 = changed ? 0 : _NOCHANGE;
+ win->_line[i].lastchar = changed ? win->_maxx : _NOCHANGE;
+ }
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_ungetch.c b/contrib/ncurses/ncurses/base/lib_ungetch.c
new file mode 100644
index 000000000000..5fdfb47d490f
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_ungetch.c
@@ -0,0 +1,74 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_ungetch.c
+**
+** The routine ungetch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_ungetch.c,v 1.2 1998/02/11 12:13:56 tom Exp $")
+
+#include <fifo_defs.h>
+
+#ifdef TRACE
+void _nc_fifo_dump(void)
+{
+int i;
+ T(("head = %d, tail = %d, peek = %d", head, tail, peek));
+ for (i = 0; i < 10; i++)
+ T(("char %d = %s", i, _trace_key(SP->_fifo[i])));
+}
+#endif /* TRACE */
+
+int ungetch(int ch)
+{
+ if (tail == -1)
+ return ERR;
+ if (head == -1) {
+ head = 0;
+ t_inc()
+ peek = tail; /* no raw keys */
+ } else
+ h_dec();
+
+ SP->_fifo[head] = ch;
+ T(("ungetch %#x ok", ch));
+#ifdef TRACE
+ if (_nc_tracing & TRACE_IEVENT) _nc_fifo_dump();
+#endif
+ return OK;
+}
diff --git a/contrib/ncurses/ncurses/base/lib_vline.c b/contrib/ncurses/ncurses/base/lib_vline.c
new file mode 100644
index 000000000000..007ef55cd3ba
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_vline.c
@@ -0,0 +1,77 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** lib_vline.c
+**
+** The routine wvline().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_vline.c,v 1.4 1998/06/28 00:10:12 tom Exp $")
+
+int wvline(WINDOW *win, chtype ch, int n)
+{
+int code = ERR;
+short row, col;
+short end;
+
+ T((T_CALLED("wvline(%p,%s,%d)"), win, _tracechtype(ch), n));
+
+ if (win) {
+ row = win->_cury;
+ col = win->_curx;
+ end = row + n - 1;
+ if (end > win->_maxy)
+ end = win->_maxy;
+
+ if (ch == 0)
+ ch = ACS_VLINE;
+ ch = _nc_render(win, ch);
+
+ while(end >= row) {
+ struct ldat *line = &(win->_line[end]);
+ line->text[col] = ch;
+ CHANGED_CELL(line, col);
+ end--;
+ }
+
+ _nc_synchook(win);
+ code = OK;
+ }
+ returnCode(code);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_wattroff.c b/contrib/ncurses/ncurses/base/lib_wattroff.c
new file mode 100644
index 000000000000..a6c9f0f1804e
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_wattroff.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_wattroff.c
+**
+** The routine wattr_off().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_wattroff.c,v 1.4 1998/05/10 12:02:11 tom Exp $")
+
+int wattr_off(WINDOW *win, NCURSES_CONST attr_t at, void *opts GCC_UNUSED)
+{
+ T((T_CALLED("wattr_off(%p,%s)"), win, _traceattr(at)));
+ if (win) {
+ T(("... current %s", _traceattr(win->_attrs)));
+ toggle_attr_off(win->_attrs,at);
+ returnCode(OK);
+ } else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_wattron.c b/contrib/ncurses/ncurses/base/lib_wattron.c
new file mode 100644
index 000000000000..a951c576fa44
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_wattron.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** lib_wattron.c
+**
+** The routines wattr_on().
+**
+*/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_wattron.c,v 1.4 1998/05/10 12:02:28 tom Exp $")
+
+int wattr_on(WINDOW *win, NCURSES_CONST attr_t at, void *opts GCC_UNUSED)
+{
+ T((T_CALLED("wattr_on(%p,%s)"), win, _traceattr(at)));
+ if (win) {
+ T(("... current %s", _traceattr(win->_attrs)));
+ toggle_attr_on(win->_attrs,at);
+ returnCode(OK);
+ } else
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/base/lib_winch.c b/contrib/ncurses/ncurses/base/lib_winch.c
new file mode 100644
index 000000000000..119c731ebe3b
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_winch.c
@@ -0,0 +1,52 @@
+/****************************************************************************
+ * Copyright (c) 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 *
+ ****************************************************************************/
+
+/*
+** lib_winch.c
+**
+** The routine winch().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_winch.c,v 1.1 1998/11/14 22:06:09 tom Exp $")
+
+chtype winch(WINDOW *win)
+{
+ T((T_CALLED("winch(%p)"), win));
+ if (win != 0) {
+ returnCode(win->_line[win->_cury].text[win->_curx]);
+ } else {
+ returnCode(0);
+ }
+}
diff --git a/contrib/ncurses/ncurses/base/lib_window.c b/contrib/ncurses/ncurses/base/lib_window.c
new file mode 100644
index 000000000000..5eae9b1a57fb
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/lib_window.c
@@ -0,0 +1,221 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.13 1998/06/28 00:10:59 tom Exp $")
+
+void _nc_synchook(WINDOW *win)
+/* hook to be called after each window change */
+{
+ if (win->_immed) wrefresh(win);
+ if (win->_sync) wsyncup(win);
+}
+
+int mvderwin(WINDOW *win, int y, int x)
+/* move a derived window */
+{
+ WINDOW *orig;
+ int i;
+
+ T((T_CALLED("mvderwin(%p,%d,%d)"), win, y, x));
+
+ if (win && (orig = win->_parent))
+ {
+ if (win->_parx==x && win->_pary==y)
+ returnCode(OK);
+ if (x<0 || y<0)
+ returnCode(ERR);
+ if ( (x+getmaxx(win) > getmaxx(orig)) ||
+ (y+getmaxy(win) > getmaxy(orig)) )
+ returnCode(ERR);
+ }
+ else
+ returnCode(ERR);
+ wsyncup(win);
+ win->_parx = x;
+ win->_pary = y;
+ for(i=0;i<getmaxy(win);i++)
+ win->_line[i].text = &(orig->_line[y++].text[x]);
+ returnCode(OK);
+}
+
+int syncok(WINDOW *win, bool bf)
+/* enable/disable automatic wsyncup() on each change to window */
+{
+ T((T_CALLED("syncok(%p,%d)"), win, bf));
+
+ if (win) {
+ win->_sync = bf;
+ returnCode(OK);
+ } else
+ returnCode(ERR);
+}
+
+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;
+
+ 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);
+ }
+ }
+ }
+}
+
+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...) */
+{
+ if (win && win->_parent)
+ {
+ 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 maybe outside the childs range */
+ if (left<0)
+ left = 0;
+ if (right > win->_maxx)
+ right = win->_maxx;
+ CHANGED_RANGE(line, left, right);
+ }
+ }
+ }
+}
+
+void wcursyncup(WINDOW *win)
+/* sync the cursor in all derived windows to its value in the base window */
+{
+ WINDOW *wp;
+ for( wp = win; wp && wp->_parent; wp = wp->_parent ) {
+ wmove( wp->_parent, wp->_pary + wp->_cury, wp->_parx + wp->_curx );
+ }
+}
+
+WINDOW *dupwin(WINDOW *win)
+/* make an exact duplicate of the given window */
+{
+WINDOW *nwin;
+size_t linesize;
+int i;
+
+ T((T_CALLED("dupwin(%p)"), win));
+
+ if ((win==NULL) ||
+ ((nwin = newwin(win->_maxy + 1, win->_maxx + 1, win->_begy, win->_begx)) == NULL))
+ returnWin(0);
+
+ 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.
+ */
+
+ nwin->_attrs = win->_attrs;
+ nwin->_bkgd = win->_bkgd;
+
+ nwin->_clear = win->_clear;
+ nwin->_scroll = win->_scroll;
+ nwin->_leaveok = win->_leaveok;
+ nwin->_use_keypad = win->_use_keypad;
+ nwin->_delay = win->_delay;
+ nwin->_immed = win->_immed;
+ nwin->_sync = win->_sync;
+
+ 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;
+
+ linesize = (win->_maxx + 1) * sizeof(chtype);
+ 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;
+ }
+
+ returnWin(nwin);
+}
diff --git a/contrib/ncurses/ncurses/base/memmove.c b/contrib/ncurses/ncurses/base/memmove.c
new file mode 100644
index 000000000000..55a410632f98
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/memmove.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * Copyright (c) 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. *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: memmove.c,v 1.2 1999/02/27 19:55:57 tom Exp $")
+
+/****************************************************************************
+ * Author: Thomas E. Dickey <dickey@clark.net> 1998 *
+ ****************************************************************************/
+
+#if USE_MY_MEMMOVE
+#define DST ((char *)s1)
+#define SRC ((const char *)s2)
+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];
+ SRC = bfr;
+ }
+ while (n-- != 0)
+ DST[n] = SRC[n];
+ }
+ return s1;
+}
+#else
+extern void _nc_memmove(void); /* quiet's gcc warning */
+void _nc_memmove(void) { } /* nonempty for strict ANSI compilers */
+#endif /* USE_MY_MEMMOVE */
diff --git a/contrib/ncurses/ncurses/base/nc_panel.c b/contrib/ncurses/ncurses/base/nc_panel.c
new file mode 100644
index 000000000000..536aab385dfd
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/nc_panel.c
@@ -0,0 +1,41 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: nc_panel.c,v 1.2 1998/02/11 12:13:56 tom Exp $")
+
+struct panelhook*
+_nc_panelhook(void)
+{
+ return (SP ? &(SP->_panelHook) : NULL);
+}
diff --git a/contrib/ncurses/ncurses/base/resizeterm.c b/contrib/ncurses/ncurses/base/resizeterm.c
new file mode 100644
index 000000000000..860355024cc3
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/resizeterm.c
@@ -0,0 +1,121 @@
+/****************************************************************************
+ * Copyright (c) 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> 1996,1997 *
+ ****************************************************************************/
+
+/*
+ * 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>
+#include <term.h>
+
+MODULE_ID("$Id: resizeterm.c,v 1.7 1998/09/19 19:27:43 Alexander.V.Lukyanov Exp $")
+
+/*
+ * 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.
+ */
+int
+resizeterm(int ToLines, int ToCols)
+{
+ int stolen = screen_lines - SP->_lines_avail;
+ int bottom = screen_lines + SP->_topstolen - stolen;
+
+ T((T_CALLED("resizeterm(%d,%d) old(%d,%d)"),
+ ToLines, ToCols,
+ screen_lines, screen_columns));
+
+ SP->_sig_winch = FALSE;
+
+ if (ToLines != screen_lines
+ || ToCols != screen_columns) {
+ WINDOWLIST *wp;
+
+#if USE_SIGWINCH
+ ungetch(KEY_RESIZE); /* so application can know this */
+ clearok(curscr, TRUE); /* screen contents are unknown */
+#endif
+
+ for (wp = _nc_windows; wp != 0; wp = wp->next) {
+ WINDOW *win = wp->win;
+ int myLines = win->_maxy + 1;
+ int myCols = win->_maxx + 1;
+
+ /* pads aren't treated this way */
+ if (win->_flags & _ISPAD)
+ continue;
+
+ if (win->_begy >= bottom) {
+ win->_begy += (ToLines - screen_lines);
+ } else {
+ if (myLines == screen_lines - stolen
+ && ToLines != screen_lines)
+ myLines = ToLines - stolen;
+ else
+ if (myLines == screen_lines
+ && ToLines != screen_lines)
+ myLines = ToLines;
+ }
+
+ if (myCols == screen_columns
+ && ToCols != screen_columns)
+ myCols = ToCols;
+
+ if (wresize(win, myLines, myCols) != OK)
+ returnCode(ERR);
+ }
+
+ screen_lines = lines = ToLines;
+ screen_columns = columns = ToCols;
+
+ SP->_lines_avail = lines - stolen;
+
+ if (SP->oldhash) { FreeAndNull(SP->oldhash); }
+ if (SP->newhash) { FreeAndNull(SP->newhash); }
+ }
+
+ /*
+ * Always update LINES, to allow for call from lib_doupdate.c which
+ * needs to have the count adjusted by the stolen (ripped off) lines.
+ */
+ LINES = ToLines - stolen;
+ COLS = ToCols;
+
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/base/safe_sprintf.c b/contrib/ncurses/ncurses/base/safe_sprintf.c
new file mode 100644
index 000000000000..0809225cd94c
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/safe_sprintf.c
@@ -0,0 +1,243 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: safe_sprintf.c,v 1.10 1999/02/27 19:56:37 tom Exp $")
+
+#if USE_SAFE_SPRINTF
+
+typedef enum { Flags, Width, Prec, Type, Format } PRINTF;
+
+#define VA_INTGR(type) ival = 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;
+
+ if (fmt == 0 || *fmt == '\0')
+ return -1;
+ if ((format = typeMalloc(char, strlen(fmt)+1)) == 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(*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;
+ }
+ sprintf(&format[--f], "%d", ival);
+ f = strlen(format);
+ } else if (isalpha(*fmt)) {
+ done = TRUE;
+ switch (*fmt) {
+ case 'Z': /* FALLTHRU */
+ case 'h': /* FALLTHRU */
+ case 'l': /* 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 */
+ if (type == 'L')
+ VA_FLOAT(long double);
+ else
+ VA_FLOAT(double);
+ used = 'f';
+ break;
+ case 'c':
+ VA_INTGR(int);
+ used = 'i';
+ break;
+ case 's':
+ VA_POINT(char *);
+ if (prec < 0)
+ prec = strlen(pval);
+ if (prec > (int)length) {
+ length = length + 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':
+ sprintf(buffer, format, ival);
+ break;
+ case 'f':
+ sprintf(buffer, format, fval);
+ break;
+ default:
+ sprintf(buffer, format, pval);
+ break;
+ }
+ len += (int)strlen(buffer);
+ } else {
+ fmt++;
+ len++;
+ }
+ }
+
+ free(buffer);
+ free(format);
+ return len;
+}
+#endif
+
+/*
+ * Wrapper for vsprintf that allocates a buffer big enough to hold the result.
+ */
+char *
+_nc_printf_string(const char *fmt, va_list ap)
+{
+#if USE_SAFE_SPRINTF
+ char *buf = 0;
+ int len = _nc_printf_length(fmt, ap);
+
+ if (len > 0) {
+ if ((buf = typeMalloc(char, len+1)) == 0)
+ return(0);
+ vsprintf(buf, fmt, ap);
+ }
+#else
+ static int rows, cols;
+ static char *buf;
+ static size_t len;
+
+ if (screen_lines > rows || screen_columns > cols) {
+ if (screen_lines > rows) rows = screen_lines;
+ if (screen_columns > cols) cols = screen_columns;
+ len = (rows * (cols + 1)) + 1;
+ buf = typeRealloc(char, len, buf);
+ if (buf == 0) {
+ return(0);
+ }
+ }
+
+ if (buf != 0) {
+# if HAVE_VSNPRINTF
+ vsnprintf(buf, len, fmt, ap); /* GNU extension */
+# else
+ vsprintf(buf, fmt, ap); /* ANSI */
+# endif
+ }
+#endif
+ return buf;
+}
diff --git a/contrib/ncurses/ncurses/base/sigaction.c b/contrib/ncurses/ncurses/base/sigaction.c
new file mode 100644
index 000000000000..ab1e569fae6a
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/sigaction.c
@@ -0,0 +1,106 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <signal.h>
+#include <SigAction.h>
+
+/* This file provides sigaction() emulation using sigvec() */
+/* Use only if this is non POSIX system */
+
+#if !HAVE_SIGACTION && HAVE_SIGVEC
+
+MODULE_ID("$Id: sigaction.c,v 1.9 1999/06/19 23:05:16 tom Exp $")
+
+int
+sigaction (int sig, sigaction_t * sigact, sigaction_t * osigact)
+{
+ return sigvec(sig, sigact, osigact);
+}
+
+int
+sigemptyset (sigset_t * mask)
+{
+ *mask = 0;
+ return 0;
+}
+
+int
+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;
+}
+
+int
+sigsuspend (sigset_t * mask)
+{
+ return sigpause (*mask);
+}
+
+int
+sigdelset (sigset_t * mask, int sig)
+{
+ *mask &= ~sigmask (sig);
+ return 0;
+}
+
+int
+sigaddset (sigset_t * mask, int sig)
+{
+ *mask |= sigmask (sig);
+ return 0;
+}
+
+int
+sigismember (sigset_t * mask, int sig)
+{
+ return (*mask & sigmask (sig)) != 0;
+}
+
+#else
+extern void _nc_sigaction(void); /* quiet's gcc warning */
+void _nc_sigaction(void) { } /* nonempty for strict ANSI compilers */
+#endif
diff --git a/contrib/ncurses/ncurses/base/tries.c b/contrib/ncurses/ncurses/base/tries.c
new file mode 100644
index 000000000000..3c396529d654
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/tries.c
@@ -0,0 +1,138 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+/*
+** tries.c
+**
+** Functions to manage the tree of partial-completions for keycodes.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: tries.c,v 1.12 1999/03/01 23:23:59 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.
+ */
+char *_nc_expand_try(struct tries *tree, unsigned short code, int *count, size_t len)
+{
+ struct 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 ((result[len] = ptr->ch) == 0)
+ *((unsigned char *)(result+len)) = 128;
+#ifdef TRACE
+ if (len == 0)
+ _tracef("expand_key %s %s", _trace_key(code), _nc_visbuf(result));
+#endif
+ }
+ return result;
+}
+
+/*
+ * Remove a code from the specified tree, freeing the unused nodes. Returns
+ * true if the code was found/removed.
+ */
+int _nc_remove_key(struct tries **tree, unsigned short code)
+{
+ T((T_CALLED("_nc_remove_key(%p,%d)"), 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 {
+ struct 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.
+ */
+int _nc_remove_string(struct tries **tree, char *string)
+{
+ T((T_CALLED("_nc_remove_string(%p,%s)"), tree, _nc_visbuf(string)));
+
+ if (string == 0 || *string == 0)
+ returnCode(FALSE);
+
+ while (*tree != 0) {
+ if ((unsigned char)(*tree)->ch == (unsigned char)*string) {
+ if (string[1] != 0)
+ returnCode(_nc_remove_string(&(*tree)->child, string+1));
+ if((*tree)->child) {
+ /* don't cut the whole sub-tree */
+ (*tree)->value = 0;
+ } else {
+ struct tries *to_free = *tree;
+ *tree = (*tree)->sibling;
+ free(to_free);
+ }
+ returnCode(TRUE);
+ }
+ tree = &(*tree)->sibling;
+ }
+ returnCode(FALSE);
+}
diff --git a/contrib/ncurses/ncurses/base/vsscanf.c b/contrib/ncurses/ncurses/base/vsscanf.c
new file mode 100644
index 000000000000..ac2bf9f2e783
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/vsscanf.c
@@ -0,0 +1,47 @@
+/*
+ * This function is needed to support vwscanw
+ */
+
+#include <curses.priv.h>
+
+#if !HAVE_VSSCANF
+
+MODULE_ID("$Id: vsscanf.c,v 1.10 1996/12/21 14:24:06 tom Exp $")
+
+#if defined(_IOREAD) && defined(_NFILE)
+/*VARARGS2*/
+int vsscanf(const char *str, const char *format, va_list ap)
+{
+ /*
+ * 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
+/*VARARGS2*/
+int vsscanf(const char *str, const char *format, va_list ap)
+{
+ /*
+ * You don't have a native vsscanf(3), and you don't have System-V
+ * compatible stdio internals. You're probably using a BSD
+ * older than 4.4 or a really old Linux. You lose. Upgrade
+ * to a current C library to win.
+ */
+ return -1; /* not implemented */
+}
+#endif
+#else
+extern void _nc_vsscanf(void); /* quiet's gcc warning */
+void _nc_vsscanf(void) { } /* nonempty for strict ANSI compilers */
+#endif /* !HAVE_VSSCANF */
diff --git a/contrib/ncurses/ncurses/base/wresize.c b/contrib/ncurses/ncurses/base/wresize.c
new file mode 100644
index 000000000000..1b91476cbfd3
--- /dev/null
+++ b/contrib/ncurses/ncurses/base/wresize.c
@@ -0,0 +1,166 @@
+/****************************************************************************
+ * Copyright (c) 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> 1996,1997 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: wresize.c,v 1.12 1999/02/27 18:57:31 tom Exp $")
+
+/*
+ * 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.
+ */
+
+#define DOALLOC(p,t,n) typeRealloc(t, n, p)
+#define ld_ALLOC(p,n) DOALLOC(p,struct ldat,n)
+#define c_ALLOC(p,n) DOALLOC(p,chtype,n)
+
+int
+wresize(WINDOW *win, int ToLines, int ToCols)
+{
+ register int row;
+ int size_x, size_y;
+ struct ldat *pline;
+ chtype blank;
+
+#ifdef TRACE
+ T((T_CALLED("wresize(%p,%d,%d)"), win, ToLines, ToCols));
+ if (win) {
+ TR(TRACE_UPDATE, ("...beg (%d, %d), max(%d,%d), reg(%d,%d)",
+ win->_begy, win->_begx,
+ win->_maxy, win->_maxx,
+ win->_regtop, win->_regbottom));
+ if (_nc_tracing & TRACE_UPDATE)
+ _tracedump("...before", win);
+ }
+#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);
+
+ pline = (win->_flags & _SUBWIN) ? win->_parent->_line : 0;
+
+ /*
+ * If the number of lines has changed, adjust the size of the overall
+ * vector:
+ */
+ if (ToLines != size_y) {
+ if (! (win->_flags & _SUBWIN)) {
+ for (row = ToLines+1; row <= size_y; row++)
+ free((char *)(win->_line[row].text));
+ }
+
+ win->_line = ld_ALLOC(win->_line, ToLines+1);
+ if (win->_line == 0)
+ returnCode(ERR);
+
+ for (row = size_y+1; row <= ToLines; row++) {
+ win->_line[row].text = 0;
+ win->_line[row].firstchar = 0;
+ win->_line[row].lastchar = ToCols;
+ if ((win->_flags & _SUBWIN)) {
+ win->_line[row].text =
+ &pline[win->_begy + row].text[win->_begx];
+ }
+ }
+ }
+
+ /*
+ * Adjust the width of the columns:
+ */
+ blank = _nc_background(win);
+ for (row = 0; row <= ToLines; row++) {
+ chtype *s = win->_line[row].text;
+ int begin = (s == 0) ? 0 : size_x + 1;
+ int end = ToCols;
+
+ if_USE_SCROLL_HINTS(win->_line[row].oldindex = row);
+
+ if (ToCols != size_x || s == 0) {
+ if (! (win->_flags & _SUBWIN)) {
+ win->_line[row].text = s = c_ALLOC(s, ToCols+1);
+ if (win->_line[row].text == 0)
+ returnCode(ERR);
+ } else if (s == 0) {
+ win->_line[row].text = s =
+ &pline[win->_begy + row].text[win->_begx];
+ }
+
+ if (end >= begin) { /* growing */
+ if (win->_line[row].firstchar < begin)
+ win->_line[row].firstchar = begin;
+ win->_line[row].lastchar = ToCols;
+ do {
+ s[end] = blank;
+ } while (--end >= begin);
+ } else { /* shrinking */
+ win->_line[row].firstchar = 0;
+ win->_line[row].lastchar = ToCols;
+ }
+ }
+ }
+
+ /*
+ * Finally, adjust the parameters showing screen size and cursor
+ * position:
+ */
+ win->_maxx = ToCols;
+ win->_maxy = 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;
+
+#ifdef TRACE
+ TR(TRACE_UPDATE, ("...beg (%d, %d), max(%d,%d), reg(%d,%d)",
+ win->_begy, win->_begx,
+ win->_maxy, win->_maxx,
+ win->_regtop, win->_regbottom));
+ if (_nc_tracing & TRACE_UPDATE)
+ _tracedump("...after:", win);
+#endif
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/curses.priv.h b/contrib/ncurses/ncurses/curses.priv.h
new file mode 100644
index 000000000000..02b81a4ccc93
--- /dev/null
+++ b/contrib/ncurses/ncurses/curses.priv.h
@@ -0,0 +1,791 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * $Id: curses.priv.h,v 1.142 1999/07/04 01:21:35 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
+
+#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>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if HAVE_SYS_BSDTYPES_H
+#include <sys/bsdtypes.h> /* needed for ISC */
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#elif HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#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
+
+#include <assert.h>
+#include <stdio.h>
+
+#include <errno.h>
+
+#if DECL_ERRNO
+extern int errno;
+#endif
+
+#include <nc_panel.h>
+
+/* Some systems have a broken 'select()', but workable 'poll()'. Use that */
+#if HAVE_POLL && HAVE_SYS_STROPTS_H && HAVE_POLL_H
+#define USE_FUNC_POLL 1
+#else
+#define USE_FUNC_POLL 0
+#endif
+
+/* 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
+#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.
+ */
+#ifndef NCURSES_EXT_FUNCS
+#undef HAVE_SIZECHANGE
+#endif
+
+#if HAVE_SIZECHANGE
+#define USE_SIZECHANGE 1
+#else
+#undef USE_SIGWINCH
+#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 void * _nc_memmove(void *, const void *, size_t);
+#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
+
+/*
+ * 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.
+ */
+
+struct tries {
+ struct tries *child; /* ptr to child. NULL if none */
+ struct 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. */
+};
+
+/*
+ * Definitions for color pairs
+ */
+#define C_SHIFT 8 /* we need more bits than there are colors */
+#define C_MASK ((1 << C_SHIFT) - 1)
+
+#define PAIR_OF(fg, bg) ((((fg) & C_MASK) << C_SHIFT) | ((bg) & C_MASK))
+
+/*
+ * Common/troublesome character definitions
+ */
+#define L_BRACE '{'
+#define R_BRACE '}'
+#define S_QUOTE '\''
+
+/*
+ * Structure for palette tables
+ */
+
+typedef struct
+{
+ short red, green, blue;
+}
+color_t;
+
+#define MAXCOLUMNS 135
+#define MAXLINES 66
+#define FIFO_SIZE MAXCOLUMNS+2 /* for nocbreak mode input */
+
+#define ACS_LEN 128
+
+#define WINDOWLIST struct _win_list
+
+#include <curses.h> /* we'll use -Ipath directive to get the right one! */
+
+/*
+ * Structure for soft labels.
+ */
+
+typedef struct
+{
+ char *text; /* text for the label */
+ char *form_text; /* formatted text (left/center/...) */
+ int x; /* x coordinate of this field */
+ char dirty; /* this label has changed */
+ char visible; /* field is visible */
+} slk_ent;
+
+typedef struct {
+ char dirty; /* all labels have changed */
+ char hidden; /* soft labels are hidden */
+ struct _win_st *win;
+ slk_ent *ent;
+ char* buffer; /* buffer for labels */
+ short maxlab; /* number of available labels */
+ short labcnt; /* number of allocated labels */
+ short maxlen; /* length of labels */
+ chtype attr; /* soft label attribute */
+} SLK;
+
+struct screen {
+ int _ifd; /* input file ptr for screen */
+ FILE *_ofp; /* output file ptr for screen */
+ char *_setbuf; /* buffered I/O for output */
+ int _buffered; /* setvbuf uses _setbuf data */
+ int _checkfd; /* filedesc for typeahead check */
+ struct term *_term; /* terminal type information */
+ short _lines; /* screen lines */
+ short _columns; /* screen columns */
+ short _lines_avail; /* lines available for stdscr */
+ short _topstolen; /* lines stolen from top */
+
+ WINDOW *_curscr; /* current screen */
+ WINDOW *_newscr; /* virtual screen to be updated to */
+ WINDOW *_stdscr; /* screen's full-window context */
+
+ struct tries *_keytry; /* "Try" for use with keypad mode */
+ struct tries *_key_ok; /* Disabled keys via keyok(,FALSE) */
+ int _tried; /* keypad mode was initialized */
+
+ unsigned 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? */
+ unsigned long _current_attr; /* terminal attribute current set */
+ int _coloron; /* is color enabled? */
+ int _cursor; /* visibility of the cursor */
+ int _cursrow; /* physical cursor row */
+ int _curscol; /* physical cursor column */
+ 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? */
+ SLK *_slk; /* ptr to soft key struct / NULL */
+ int slk_format; /* selected format for this screen */
+ /* cursor movement costs; units are 10ths of milliseconds */
+#ifdef NCURSES_NO_PADDING
+ int _no_padding; /* flag to set if padding disabled */
+#endif
+ 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 (backtab) */
+#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) */
+ /* used in lib_doupdate.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 _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;
+ int _carriage_return_length;
+ int _cursor_home_length;
+ int _cursor_to_ll_length;
+ int _scrolling; /* 1 if terminal's smart enough to */
+
+ /* used in lib_color.c */
+ color_t *_color_table; /* screen's color palette */
+ int _color_count; /* count of colors in palette */
+ unsigned short *_color_pairs; /* screen's color pair list */
+ int _pair_count; /* count of color pairs */
+ int _default_color; /* use default colors */
+ chtype _xmc_suppress; /* attributes to suppress if xmc */
+ chtype _xmc_triggers; /* attributes to process if xmc */
+ chtype _acs_map[ACS_LEN];
+
+ /* 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;
+#define _nc_idlok SP->_nc_sp_idlok
+#define _nc_idcok SP->_nc_sp_idcok
+
+ /*
+ * These are the data that support the mouse interface.
+ */
+ int _maxclick;
+ bool (*_mouse_event) (SCREEN *);
+ bool (*_mouse_inline)(SCREEN *);
+ bool (*_mouse_parse) (int);
+ void (*_mouse_resume)(SCREEN *);
+ void (*_mouse_wrap) (SCREEN *);
+ int _mouse_fd; /* file-descriptor, if any */
+
+ /*
+ * This supports automatic resizing
+ */
+#if USE_SIZECHANGE
+ int (*_resize)(int,int);
+#endif
+
+ /*
+ * These are data that support the proper handling of the panel stack on an
+ * per screen basis.
+ */
+ struct panelhook _panelHook;
+ /*
+ * Linked-list of all windows, to support '_nc_resizeall()' and
+ * '_nc_freeall()'
+ */
+ WINDOWLIST *_nc_sp_windows;
+#define _nc_windows SP->_nc_sp_windows
+
+ bool _sig_winch;
+ SCREEN *_next_screen;
+
+ /* hashes for old and new lines */
+ unsigned long *oldhash, *newhash;
+};
+
+extern SCREEN *_nc_screen_chain;
+
+#ifdef NCURSES_NOMACROS
+#include <nomacros.h>
+#endif
+
+ WINDOWLIST {
+ WINDOWLIST *next;
+ WINDOW *win;
+};
+
+typedef struct {
+ int line; /* lines to take, < 0 => from bottom*/
+ int (*hook)(struct _win_st *, int); /* callback for user */
+ struct _win_st *w; /* maybe we need this for cleanup */
+} ripoff_t;
+
+/* The terminfo source is assumed to be 7-bit ASCII */
+#define is7bits(c) ((unsigned)(c) < 128)
+
+#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
+
+#define TextOf(c) ((c) & (chtype)A_CHARTEXT)
+#define AttrOf(c) ((c) & (chtype)A_ATTRIBUTES)
+
+#define BLANK (' '|A_NORMAL)
+
+#define CHANGED -1
+
+#define CHANGED_CELL(line,col) \
+ if (line->firstchar == _NOCHANGE) \
+ line->firstchar = line->lastchar = col; \
+ else if ((col) < line->firstchar) \
+ line->firstchar = col; \
+ else if ((col) > line->lastchar) \
+ line->lastchar = col
+
+#define CHANGED_RANGE(line,start,end) \
+ if (line->firstchar == _NOCHANGE \
+ || line->firstchar > (start)) \
+ line->firstchar = start; \
+ if (line->lastchar == _NOCHANGE \
+ || line->lastchar < (end)) \
+ line->lastchar = end
+
+#define CHANGED_TO_EOL(line,start,end) \
+ if (line->firstchar == _NOCHANGE \
+ || line->firstchar > (start)) \
+ line->firstchar = start; \
+ line->lastchar = end
+
+#define SIZEOF(v) (sizeof(v)/sizeof(v[0]))
+#define typeMalloc(type,elts) (type *)malloc((elts)*sizeof(type))
+#define typeCalloc(type,elts) (type *)calloc((elts),sizeof(type))
+#define typeRealloc(type,elts,ptr) (type *)_nc_doalloc(ptr, (elts)*sizeof(type))
+#define FreeIfNeeded(p) if(p != 0) free(p)
+#define FreeAndNull(p) free(p); p = 0
+
+#include <nc_alloc.h>
+
+/*
+ * 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
+
+#ifdef TRACE
+#define TR(n, a) if (_nc_tracing & (n)) _tracef a
+#define T(a) TR(TRACE_CALLS, a)
+#define TPUTS_TRACE(s) _nc_tputs_trace = s;
+#define TRACE_RETURN(value,type) return _nc_retrace_##type(value)
+#define returnAttr(code) TRACE_RETURN(code,attr_t)
+#define returnCode(code) TRACE_RETURN(code,int)
+#define returnPtr(code) TRACE_RETURN(code,ptr)
+#define returnVoid T((T_RETURN(""))); return
+#define returnWin(code) TRACE_RETURN(code,win)
+extern WINDOW * _nc_retrace_win(WINDOW *);
+extern attr_t _nc_retrace_attr_t(attr_t);
+extern char *_nc_retrace_ptr(char *);
+extern const char *_nc_tputs_trace;
+extern int _nc_retrace_int(int);
+extern long _nc_outchars;
+extern void _nc_fifo_dump(void);
+#else
+#define T(a)
+#define TR(n, a)
+#define TPUTS_TRACE(s)
+#define returnAttr(code) return code
+#define returnCode(code) return code
+#define returnPtr(code) return code
+#define returnVoid return
+#define returnWin(code) return code
+#endif
+
+extern unsigned _nc_tracing;
+extern const char *_nc_visbuf2(int, const char *);
+
+#define _trace_key(ch) ((ch > KEY_MIN) ? keyname(ch) : _tracechar((unsigned char)ch))
+
+#define ALL_BUT_COLOR ((chtype)~(A_COLOR))
+#define IGNORE_COLOR_OFF FALSE
+#define NONBLANK_ATTR (A_BOLD|A_DIM|A_BLINK)
+#define XMC_CHANGES(c) ((c) & SP->_xmc_suppress)
+
+
+#define toggle_attr_on(S,at) \
+ if (PAIR_NUMBER(at) > 0)\
+ (S) = ((S) & ALL_BUT_COLOR) | (at);\
+ else\
+ (S) |= (at);\
+ T(("new attribute is %s", _traceattr((S))))
+
+
+#define toggle_attr_off(S,at) \
+ if (IGNORE_COLOR_OFF == TRUE) {\
+ if (PAIR_NUMBER(at) == 0xff) /* turn off color */\
+ (S) &= ~(at);\
+ else /* leave color alone */\
+ (S) &= ~((at)&ALL_BUT_COLOR);\
+ } else {\
+ if (PAIR_NUMBER(at) > 0x00) /* turn off color */\
+ (S) &= ~(at|A_COLOR);\
+ else /* leave color alone */\
+ (S) &= ~(at);\
+ }\
+ T(("new attribute is %s", _traceattr((S))));
+
+#define DelCharCost(count) \
+ ((parm_dch != 0) \
+ ? SP->_dch_cost \
+ : ((delete_character != 0) \
+ ? (SP->_dch1_cost * count) \
+ : INFINITY))
+
+#define InsCharCost(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 * count) \
+ : INFINITY)))
+
+#if USE_XMC_SUPPORT
+#define UpdateAttrs(c) if (SP->_current_attr != AttrOf(c)) { \
+ attr_t chg = SP->_current_attr; \
+ vidattr(AttrOf(c)); \
+ if (magic_cookie_glitch > 0 \
+ && XMC_CHANGES((chg ^ SP->_current_attr))) { \
+ T(("%s @%d before glitch %d,%d", \
+ __FILE__, __LINE__, \
+ SP->_cursrow, \
+ SP->_curscol)); \
+ _nc_do_xmc_glitch(chg); \
+ } \
+ }
+#else
+#define UpdateAttrs(c) if (SP->_current_attr != AttrOf(c)) \
+ vidattr(AttrOf(c));
+#endif
+
+/*
+ * 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.
+ */
+#define can_clear_with(ch) \
+ ((ch & ~(NONBLANK_ATTR|(back_color_erase ? A_COLOR:0))) == BLANK)
+
+#ifdef NCURSES_EXPANDED
+
+#undef toggle_attr_on
+#define toggle_attr_on(S,at) _nc_toggle_attr_on(&(S), at)
+extern 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 void _nc_toggle_attr_off(attr_t *, attr_t);
+
+#undef can_clear_with
+#define can_clear_with(ch) _nc_can_clear_with(ch)
+extern int _nc_can_clear_with(chtype);
+
+#undef DelCharCost
+#define DelCharCost(count) _nc_DelCharCost(count)
+extern int _nc_DelCharCost(int);
+
+#undef InsCharCost
+#define InsCharCost(count) _nc_InsCharCost(count)
+extern int _nc_InsCharCost(int);
+
+#undef UpdateAttrs
+#define UpdateAttrs(c) _nc_UpdateAttrs(c)
+extern void _nc_UpdateAttrs(chtype);
+
+#else
+
+extern void _nc_expanded(void);
+
+#endif
+
+#if !HAVE_GETCWD
+#define getcwd(buf,len) getwd(buf)
+#endif
+
+/* doalloc.c */
+extern void *_nc_doalloc(void *, size_t);
+#if !HAVE_STRDUP
+#define strdup _nc_strdup
+extern char *_nc_strdup(const char *);
+#endif
+
+/* doupdate.c */
+#if USE_XMC_SUPPORT
+extern void _nc_do_xmc_glitch(attr_t);
+#endif
+
+/* hardscroll.c */
+#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG)
+extern void _nc_linedump(void);
+#endif
+
+/* lib_acs.c */
+extern void _nc_init_acs(void); /* corresponds to traditional 'init_acs()' */
+extern int _nc_msec_cost(const char *const, int); /* used by 'tack' program */
+
+/* lib_mvcur.c */
+#define INFINITY 1000000 /* cost: too high to use */
+
+extern void _nc_mvcur_init(void);
+extern void _nc_mvcur_resume(void);
+extern void _nc_mvcur_wrap(void);
+
+extern int _nc_scrolln(int, int, int, int);
+
+extern void _nc_screen_init(void);
+extern void _nc_screen_resume(void);
+extern void _nc_screen_wrap(void);
+
+#if !HAVE_STRSTR
+#define strstr _nc_strstr
+extern char *_nc_strstr(const char *, const char *);
+#endif
+
+/* lib_mouse.c */
+extern int _nc_has_mouse(void);
+
+/* safe_sprintf.c */
+extern char * _nc_printf_string(const char *fmt, va_list ap);
+
+/* tries.c */
+extern void _nc_add_to_try(struct tries **tree, char *str, unsigned short code);
+extern char *_nc_expand_try(struct tries *tree, unsigned short code, int *count, size_t len);
+extern int _nc_remove_key(struct tries **tree, unsigned short code);
+extern int _nc_remove_string(struct tries **tree, char *string);
+
+/* elsewhere ... */
+extern WINDOW *_nc_makenew(int, int, int, int, int);
+extern char *_nc_home_terminfo(void);
+extern char *_nc_trace_buf(int, size_t);
+extern chtype _nc_background(WINDOW *);
+extern chtype _nc_render(WINDOW *, chtype);
+extern int _nc_access(const char *, int);
+extern int _nc_baudrate(int);
+extern int _nc_getenv_num(const char *);
+extern int _nc_keypad(bool);
+extern int _nc_ospeed(int);
+extern int _nc_outch(int);
+extern int _nc_setupscreen(short, short const, FILE *);
+extern int _nc_timed_wait(int, int, int *);
+extern int _nc_waddch_nosync(WINDOW *, const chtype);
+extern void _nc_do_color(int, bool, int (*)(int));
+extern void _nc_freeall(void);
+extern void _nc_freewin(WINDOW *win);
+extern void _nc_hash_map(void);
+extern void _nc_init_keytry(void);
+extern void _nc_keep_tic_dir(const char *);
+extern void _nc_make_oldhash(int i);
+extern void _nc_outstr(const char *str);
+extern void _nc_scroll_oldhash(int n, int top, int bot);
+extern void _nc_scroll_optimize(void);
+extern void _nc_scroll_window(WINDOW *, int const, short const, short const, chtype);
+extern void _nc_set_buffer(FILE *ofp, bool buffered);
+extern void _nc_signal_handler(bool);
+extern void _nc_synchook(WINDOW *win);
+extern void _nc_trace_tries(struct tries *tree);
+
+#if USE_SIZECHANGE
+extern void _nc_update_screensize(void);
+#endif
+
+/* scroll indices */
+extern int *_nc_oldnums;
+
+#define USE_SETBUF_0 0
+
+#define NC_BUFFERED(flag) \
+ if ((SP->_buffered != 0) != flag) \
+ _nc_set_buffer(SP->_ofp, flag)
+
+/*
+ * On systems with a broken linker, define 'SP' as a function to force the
+ * linker to pull in the data-only module with 'SP'.
+ */
+#ifndef BROKEN_LINKER
+#define BROKEN_LINKER 0
+#endif
+
+#if BROKEN_LINKER
+#define SP _nc_screen()
+extern SCREEN *_nc_screen(void);
+extern int _nc_alloc_screen(void);
+extern void _nc_set_screen(SCREEN *);
+#else
+/* current screen is private data; avoid possible linking conflicts too */
+extern SCREEN *SP;
+#define _nc_alloc_screen() ((SP = typeCalloc(SCREEN, 1)) != 0)
+#define _nc_set_screen(sp) SP = sp
+#endif
+
+/*
+ * We don't want to use the lines or columns capabilities internally,
+ * because if the application is running multiple screens under
+ * X windows, it's quite possible they could all have type xterm
+ * but have different sizes! So...
+ */
+#define screen_lines SP->_lines
+#define screen_columns SP->_columns
+
+extern int _nc_slk_format; /* != 0 if slk_init() called */
+extern int _nc_slk_initialize(WINDOW *, int);
+
+/*
+ * 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)
+
+extern int _nc_ripoffline(int line, int (*init)(WINDOW *,int));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CURSES_PRIV_H */
diff --git a/contrib/ncurses/ncurses/fifo_defs.h b/contrib/ncurses/ncurses/fifo_defs.h
new file mode 100644
index 000000000000..f4dd7be324f5
--- /dev/null
+++ b/contrib/ncurses/ncurses/fifo_defs.h
@@ -0,0 +1,59 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:13:56 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();}
+#define p_inc() { peek == FIFO_SIZE-1 ? peek = 0 : peek++;}
+
+#define cooked_key_in_fifo() (head!=-1 && peek!=head)
+#define raw_key_in_fifo() (head!=-1 && peek!=tail)
+
+#undef HIDE_EINTR
+
+#endif /* FIFO_DEFS_H */
diff --git a/contrib/ncurses/ncurses/llib-lncurses b/contrib/ncurses/ncurses/llib-lncurses
new file mode 100644
index 000000000000..c30c6eb1cb9d
--- /dev/null
+++ b/contrib/ncurses/ncurses/llib-lncurses
@@ -0,0 +1,2868 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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,1998,1999 *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./tty/hardscroll.c */
+
+#include <curses.priv.h>
+
+#undef _nc_oldnums
+int *_nc_oldnums;
+
+#undef _nc_scroll_optimize
+void _nc_scroll_optimize(void)
+ { /* void */ }
+
+/* ./tty/hashmap.c */
+
+#include <term.h>
+
+typedef struct
+{
+ unsigned long hashval;
+ int oldcount, newcount;
+ int oldindex, newindex;
+}
+ sym;
+
+#undef _nc_hash_map
+void _nc_hash_map(void)
+ { /* void */ }
+
+#undef _nc_make_oldhash
+void _nc_make_oldhash(
+ int i)
+ { /* void */ }
+
+#undef _nc_scroll_oldhash
+void _nc_scroll_oldhash(
+ int n,
+ int top,
+ int bot)
+ { /* void */ }
+
+/* ./base/lib_addch.c */
+
+#include <ctype.h>
+
+#undef _nc_background
+chtype _nc_background(
+ WINDOW *win)
+ { return(*(chtype *)0); }
+
+#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 *const astr,
+ int n)
+ { return(*(int *)0); }
+
+#undef waddchnstr
+int waddchnstr(
+ WINDOW *win,
+ const chtype *const astr,
+ int n)
+ { return(*(int *)0); }
+
+/* ./base/lib_beep.c */
+
+#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,
+ const 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 color,
+ 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,
+ 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 start_color
+int start_color(void)
+ { return(*(int *)0); }
+
+#undef init_pair
+int init_pair(
+ short pair,
+ short f,
+ 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
+bool can_change_color(void)
+ { return(*(bool *)0); }
+
+#undef has_colors
+bool has_colors(void)
+ { return(*(bool *)0); }
+
+#undef color_content
+int color_content(
+ short color,
+ short *r,
+ short *g,
+ short *b)
+ { return(*(int *)0); }
+
+#undef pair_content
+int pair_content(
+ short pair,
+ short *f,
+ short *b)
+ { return(*(int *)0); }
+
+#undef _nc_do_color
+void _nc_do_color(
+ int pair,
+ bool reverse,
+ int (*outc)(
+ int p1))
+ { /* void */ }
+
+/* ./base/lib_colorset.c */
+
+#undef wcolor_set
+int wcolor_set(
+ WINDOW *win,
+ short color_pair_number,
+ 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
+int echo(void)
+ { return(*(int *)0); }
+
+#undef noecho
+int noecho(void)
+ { return(*(int *)0); }
+
+/* ./base/lib_endwin.c */
+
+#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
+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 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 untouchwin
+int untouchwin(
+ WINDOW *z)
+ { return(*(int *)0); }
+
+#undef vline
+int vline(
+ chtype a1,
+ int z)
+ { return(*(int *)0); }
+
+#undef vw_printw
+int vw_printw(
+ WINDOW *a1,
+ char *a2,
+ va_list z)
+ { return(*(int *)0); }
+
+#undef vw_scanw
+int vw_scanw(
+ WINDOW *a1,
+ char *a2,
+ va_list 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 mouse_trafo
+bool mouse_trafo(
+ int *a1,
+ int *a2,
+ bool z)
+ { return(*(bool *)0); }
+
+/* ./base/lib_getch.c */
+
+#include <fifo_defs.h>
+
+#undef ESCDELAY
+int ESCDELAY;
+
+#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,
+ bool flag)
+ { /* void */ }
+
+/* ./base/lib_inchstr.c */
+
+#undef winchnstr
+int winchnstr(
+ WINDOW *win,
+ chtype *str,
+ int n)
+ { return(*(int *)0); }
+
+/* ./base/lib_initscr.c */
+
+#include <tic.h>
+
+#undef initscr
+WINDOW *initscr(void)
+ { return(*(WINDOW **)0); }
+
+/* ./base/lib_insch.c */
+
+#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_insstr.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
+bool isendwin(void)
+ { return(*(bool *)0); }
+
+/* ./base/lib_leaveok.c */
+
+#undef leaveok
+int leaveok(
+ WINDOW *win,
+ bool flag)
+ { return(*(int *)0); }
+
+/* ./base/lib_mouse.c */
+
+#undef getmouse
+int getmouse(
+ MEVENT *aevent)
+ { return(*(int *)0); }
+
+#undef ungetmouse
+int ungetmouse(
+ MEVENT *aevent)
+ { return(*(int *)0); }
+
+#undef mousemask
+mmask_t mousemask(
+ mmask_t newmask,
+ mmask_t *oldmask)
+ { return(*(mmask_t *)0); }
+
+#undef wenclose
+bool wenclose(
+ const WINDOW *win,
+ int y,
+ int x)
+ { return(*(bool *)0); }
+
+#undef mouseinterval
+int mouseinterval(
+ int maxclick)
+ { return(*(int *)0); }
+
+#undef _nc_has_mouse
+int _nc_has_mouse(void)
+ { return(*(int *)0); }
+
+#undef wmouse_trafo
+bool wmouse_trafo(
+ const WINDOW *win,
+ int *pY,
+ int *pX,
+ bool to_screen)
+ { return(*(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
+int _nc_msec_cost(
+ const char *const cap,
+ int affcnt)
+ { return(*(int *)0); }
+
+#undef _nc_mvcur_resume
+void _nc_mvcur_resume(void)
+ { /* void */ }
+
+#undef _nc_mvcur_init
+void _nc_mvcur_init(void)
+ { /* void */ }
+
+#undef _nc_mvcur_wrap
+void _nc_mvcur_wrap(void)
+ { /* void */ }
+
+#undef mvcur
+int mvcur(
+ int yold,
+ int xold,
+ int ynew,
+ int xnew)
+ { return(*(int *)0); }
+
+/* ./base/lib_mvwin.c */
+
+#undef mvwin
+int mvwin(
+ WINDOW *win,
+ int by,
+ int bx)
+ { return(*(int *)0); }
+
+/* ./base/lib_newterm.c */
+
+#undef filter
+void filter(void)
+ { /* void */ }
+
+#undef newterm
+SCREEN *newterm(
+ char *term,
+ FILE *ofp,
+ FILE *ifp)
+ { return(*(SCREEN **)0); }
+
+/* ./base/lib_newwin.c */
+
+#undef _nc_freewin
+void _nc_freewin(
+ WINDOW *win)
+ { /* void */ }
+
+#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
+WINDOW *_nc_makenew(
+ int num_lines,
+ int num_columns,
+ int begy,
+ int begx,
+ int flags)
+ { return(*(WINDOW **)0); }
+
+/* ./base/lib_nl.c */
+
+#undef nl
+int nl(void)
+ { 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
+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(
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+#undef wprintw
+int wprintw(
+ WINDOW *win,
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+#undef mvprintw
+int mvprintw(
+ int y,
+ int x,
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+#undef mvwprintw
+int mvwprintw(
+ WINDOW *win,
+ int y,
+ int x,
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+#undef vwprintw
+int vwprintw(
+ WINDOW *win,
+ 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
+int restartterm(
+ char *term,
+ int filenum,
+ int *errret)
+ { return(*(int *)0); }
+
+/* ./base/lib_scanw.c */
+
+#undef vwscanw
+int vwscanw(
+ WINDOW *win,
+ char *fmt,
+ va_list argp)
+ { return(*(int *)0); }
+
+#undef scanw
+int scanw(
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+#undef wscanw
+int wscanw(
+ WINDOW *win,
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+#undef mvscanw
+int mvscanw(
+ int y,
+ int x,
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+#undef mvwscanw
+int mvwscanw(
+ WINDOW *win,
+ int y,
+ int x,
+ char *fmt,
+ ...)
+ { return(*(int *)0); }
+
+/* ./base/lib_screen.c */
+
+#include <sys/stat.h>
+#include <time.h>
+
+#undef getwin
+WINDOW *getwin(
+ FILE *filep)
+ { return(*(WINDOW **)0); }
+
+#undef putwin
+int putwin(
+ WINDOW *win,
+ FILE *filep)
+ { 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
+int scr_init(
+ 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,
+ short const top,
+ short 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,
+ 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 *screen)
+ { return(*(SCREEN **)0); }
+
+#undef delscreen
+void delscreen(
+ SCREEN *sp)
+ { /* void */ }
+
+#undef _nc_setupscreen
+int _nc_setupscreen(
+ short slines,
+ short const scolumns,
+ FILE *output)
+ { return(*(int *)0); }
+
+#undef _nc_ripoffline
+int _nc_ripoffline(
+ 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_slk_format
+int _nc_slk_format;
+
+#undef _nc_slk_initialize
+int _nc_slk_initialize(
+ WINDOW *stwin,
+ int cols)
+ { return(*(int *)0); }
+
+#undef slk_restore
+int slk_restore(void)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkatr_set.c */
+
+#undef slk_attr_set
+int slk_attr_set(
+ const attr_t attr,
+ short color_pair_number,
+ void *opts)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkatrof.c */
+
+#undef slk_attroff
+int slk_attroff(
+ const chtype attr)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkatron.c */
+
+#undef slk_attron
+int slk_attron(
+ const chtype attr)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkatrset.c */
+
+#undef slk_attrset
+int slk_attrset(
+ const chtype attr)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkattr.c */
+
+#undef slk_attr
+attr_t slk_attr(void)
+ { return(*(attr_t *)0); }
+
+/* ./base/lib_slkclear.c */
+
+#undef slk_clear
+int slk_clear(void)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkcolor.c */
+
+#undef slk_color
+int slk_color(
+ short color_pair_number)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkinit.c */
+
+#undef slk_init
+int slk_init(
+ int format)
+ { return(*(int *)0); }
+
+/* ./base/lib_slklab.c */
+
+#undef slk_label
+char *slk_label(
+ int n)
+ { return(*(char **)0); }
+
+/* ./base/lib_slkrefr.c */
+
+#undef slk_noutrefresh
+int slk_noutrefresh(void)
+ { return(*(int *)0); }
+
+#undef slk_refresh
+int slk_refresh(void)
+ { return(*(int *)0); }
+
+/* ./base/lib_slkset.c */
+
+#undef slk_set
+int slk_set(
+ int i,
+ const char *astr,
+ int format)
+ { return(*(int *)0); }
+
+/* ./base/lib_slktouch.c */
+
+#undef slk_touch
+int slk_touch(void)
+ { return(*(int *)0); }
+
+/* ./base/lib_touch.c */
+
+#undef is_linetouched
+bool is_linetouched(
+ WINDOW *win,
+ int line)
+ { return(*(bool *)0); }
+
+#undef is_wintouched
+bool is_wintouched(
+ WINDOW *win)
+ { return(*(bool *)0); }
+
+#undef wtouchln
+int wtouchln(
+ WINDOW *win,
+ int y,
+ int n,
+ int changed)
+ { return(*(int *)0); }
+
+/* ./trace/lib_traceatr.c */
+
+#undef _nc_lib_traceatr
+void _nc_lib_traceatr(void)
+ { /* void */ }
+
+/* ./trace/lib_tracedmp.c */
+
+#undef _nc_lib_tracedmp
+void _nc_lib_tracedmp(void)
+ { /* void */ }
+
+/* ./trace/lib_tracemse.c */
+
+#undef _nc_lib_tracemouse
+void _nc_lib_tracemouse(void)
+ { /* void */ }
+
+/* ./tty/lib_tstp.c */
+
+#include <signal.h>
+#include <SigAction.h>
+
+#undef _nc_signal_handler
+void _nc_signal_handler(
+ bool enable)
+ { /* void */ }
+
+/* ./base/lib_ungetch.c */
+
+#undef ungetch
+int ungetch(
+ int ch)
+ { return(*(int *)0); }
+
+/* ./tty/lib_vidattr.c */
+
+#undef vidputs
+int vidputs(
+ attr_t newmode,
+ int (*outc)(
+ int p1))
+ { return(*(int *)0); }
+
+#undef vidattr
+int vidattr(
+ attr_t newmode)
+ { return(*(int *)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,
+ 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
+struct panelhook *_nc_panelhook(void)
+ { return(*(struct panelhook **)0); }
+
+/* ./base/safe_sprintf.c */
+
+#undef _nc_printf_string
+char *_nc_printf_string(
+ const char *fmt,
+ va_list ap)
+ { return(*(char **)0); }
+
+/* ./tty/tty_update.c */
+
+#include <sys/time.h>
+
+#undef doupdate
+int doupdate(void)
+ { return(*(int *)0); }
+
+#undef _nc_outstr
+void _nc_outstr(
+ const char *str)
+ { /* void */ }
+
+#undef _nc_scrolln
+int _nc_scrolln(
+ int n,
+ int top,
+ int bot,
+ int maxy)
+ { return(*(int *)0); }
+
+#undef _nc_screen_resume
+void _nc_screen_resume(void)
+ { /* void */ }
+
+#undef _nc_screen_init
+void _nc_screen_init(void)
+ { /* void */ }
+
+#undef _nc_screen_wrap
+void _nc_screen_wrap(void)
+ { /* void */ }
+
+#undef _nc_do_xmc_glitch
+void _nc_do_xmc_glitch(
+ attr_t previous)
+ { /* void */ }
+
+/* ./base/memmove.c */
+
+#undef _nc_memmove
+void _nc_memmove(void)
+ { /* void */ }
+
+/* ./base/sigaction.c */
+
+#undef _nc_sigaction
+void _nc_sigaction(void)
+ { /* void */ }
+
+/* ./base/vsscanf.c */
+
+#undef _nc_vsscanf
+void _nc_vsscanf(void)
+ { /* void */ }
+
+/* ./base/define_key.c */
+
+#undef define_key
+int define_key(
+ char *str,
+ int keycode)
+ { return(*(int *)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_can_clear_with
+int _nc_can_clear_with(
+ chtype ch)
+ { return(*(int *)0); }
+
+#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/keybound.c */
+
+#undef keybound
+char *keybound(
+ int code,
+ int count)
+ { return(*(char **)0); }
+
+/* ./base/keyok.c */
+
+#undef keyok
+int keyok(
+ int c,
+ bool flag)
+ { return(*(int *)0); }
+
+/* ./base/lib_dft_fgbg.c */
+
+#undef use_default_colors
+int use_default_colors(void)
+ { return(*(int *)0); }
+
+/* ./base/lib_freeall.c */
+
+#undef _nc_freeall
+void _nc_freeall(void)
+ { /* void */ }
+
+/* ./tinfo/lib_print.c */
+
+#undef mcprint
+int mcprint(
+ char *data,
+ int len)
+ { return(*(int *)0); }
+
+/* ./base/resizeterm.c */
+
+#undef resizeterm
+int resizeterm(
+ int ToLines,
+ int ToCols)
+ { return(*(int *)0); }
+
+/* ./trace/trace_tries.c */
+
+#undef _nc_trace_tries
+void _nc_trace_tries(
+ struct tries *tree)
+ { /* void */ }
+
+/* ./trace/trace_xnames.c */
+
+#include <term_entry.h>
+
+#undef _nc_trace_xnames
+void _nc_trace_xnames(
+ TERMTYPE *tp)
+ { /* void */ }
+
+/* ./base/tries.c */
+
+#undef _nc_expand_try
+char *_nc_expand_try(
+ struct tries *tree,
+ unsigned short code,
+ int *count,
+ size_t len)
+ { return(*(char **)0); }
+
+#undef _nc_remove_key
+int _nc_remove_key(
+ struct tries **tree,
+ unsigned short code)
+ { return(*(int *)0); }
+
+#undef _nc_remove_string
+int _nc_remove_string(
+ struct tries **tree,
+ char *string)
+ { return(*(int *)0); }
+
+/* ./base/wresize.c */
+
+#undef wresize
+int wresize(
+ WINDOW *win,
+ int ToLines,
+ int ToCols)
+ { return(*(int *)0); }
+
+/* ./tinfo/access.c */
+
+#undef _nc_access
+int _nc_access(
+ const char *path,
+ int mode)
+ { return(*(int *)0); }
+
+/* ./tinfo/alloc_entry.c */
+
+#undef _nc_init_entry
+void _nc_init_entry(
+ TERMTYPE *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 *const string)
+ { return(*(char **)0); }
+
+#undef _nc_wrap_entry
+void _nc_wrap_entry(
+ ENTRY *const ep)
+ { /* void */ }
+
+#undef _nc_merge_entry
+void _nc_merge_entry(
+ TERMTYPE *const to,
+ TERMTYPE *const from)
+ { /* void */ }
+
+/* ./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,
+ TERMTYPE *src)
+ { /* void */ }
+
+/* ./tinfo/captoinfo.c */
+
+#undef _nc_captoinfo
+char *_nc_captoinfo(
+ const char *cap,
+ const char *s,
+ int const parametrized)
+ { return(*(char **)0); }
+
+#undef _nc_infotocap
+char *_nc_infotocap(
+ const char *cap,
+ const char *str,
+ int const parametrized)
+ { return(*(char **)0); }
+
+/* ./codes.c */
+
+#undef boolcodes
+char *const boolcodes[] = {0};
+#undef numcodes
+char *const numcodes[] = {0};
+#undef strcodes
+char *const strcodes[] = {0};
+
+/* ./comp_captab.c */
+
+#include <ncurses_cfg.h>
+
+#undef _nc_info_hash_table
+const struct name_table_entry *const _nc_info_hash_table[995] = {0};
+#undef _nc_cap_hash_table
+const struct name_table_entry *const _nc_cap_hash_table[995] = {0};
+#undef _nc_capalias_table
+const struct alias _nc_capalias_table[] = {0};
+#undef _nc_infoalias_table
+const struct alias _nc_infoalias_table[] = {0};
+
+#undef _nc_get_table
+const struct name_table_entry *_nc_get_table(
+ bool termcap)
+ { return(*(const struct name_table_entry **)0); }
+
+#undef _nc_get_hash_table
+const struct name_table_entry *const *_nc_get_hash_table(
+ bool termcap)
+ { return(*(const struct name_table_entry **)0); }
+
+/* ./tinfo/comp_error.c */
+
+#undef _nc_suppress_warnings
+bool _nc_suppress_warnings;
+#undef _nc_curr_line
+int _nc_curr_line;
+#undef _nc_curr_col
+int _nc_curr_col;
+
+#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_expand.c */
+
+#undef _nc_tic_expand
+char *_nc_tic_expand(
+ const char *srcp,
+ bool tic_format,
+ bool numbers)
+ { return(*(char **)0); }
+
+/* ./tinfo/comp_hash.c */
+
+#include <hashsize.h>
+
+#undef _nc_find_entry
+struct name_table_entry const *_nc_find_entry(
+ const char *string,
+ const struct name_table_entry *const *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,
+ const struct name_table_entry *table)
+ { return(*(struct name_table_entry const **)0); }
+
+/* ./tinfo/comp_parse.c */
+
+#undef _nc_check_termtype
+void (*_nc_check_termtype)(
+ TERMTYPE *p1);
+#undef _nc_head
+ENTRY *_nc_head;
+#undef _nc_tail
+ENTRY *_nc_tail;
+
+#undef _nc_free_entries
+void _nc_free_entries(
+ ENTRY *head)
+ { /* void */ }
+
+#undef _nc_entry_match
+bool _nc_entry_match(
+ char *n1,
+ char *n2)
+ { return(*(bool *)0); }
+
+#undef _nc_read_entry_source
+void _nc_read_entry_source(
+ FILE *fp,
+ char *buf,
+ int literal,
+ bool silent,
+ bool (*hook)(
+ ENTRY *p1))
+ { /* void */ }
+
+#undef _nc_resolve_uses
+int _nc_resolve_uses(void)
+ { return(*(int *)0); }
+
+/* ./tinfo/comp_scan.c */
+
+#undef _nc_syntax
+int _nc_syntax;
+#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_get_token
+int _nc_get_token(void)
+ { return(*(int *)0); }
+
+#undef _nc_trans_string
+char _nc_trans_string(
+ char *ptr)
+ { return(*(char *)0); }
+
+#undef _nc_push_token
+void _nc_push_token(
+ int tokclass)
+ { /* void */ }
+
+#undef _nc_panic_mode
+void _nc_panic_mode(
+ char ch)
+ { /* void */ }
+
+#undef _nc_reset_input
+void _nc_reset_input(
+ FILE *fp,
+ char *buf)
+ { /* void */ }
+
+/* ./tinfo/doalloc.c */
+
+#undef _nc_doalloc
+void *_nc_doalloc(
+ void *oldp,
+ size_t amount)
+ { return(*(void **)0); }
+
+/* ./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_user_definable
+bool _nc_user_definable;
+
+#undef use_extended_names
+int use_extended_names(
+ bool flag)
+ { return(*(int *)0); }
+
+/* ./tinfo/getenv_num.c */
+
+#undef _nc_getenv_num
+int _nc_getenv_num(
+ const char *name)
+ { return(*(int *)0); }
+
+/* ./tinfo/home_terminfo.c */
+
+#undef _nc_home_terminfo
+char *_nc_home_terminfo(void)
+ { return(*(char **)0); }
+
+/* ./tinfo/init_keytry.c */
+
+#if 0
+
+#include <init_keytry.h>
+
+#undef _nc_tinfo_fkeys
+struct tinfo_fkeys _nc_tinfo_fkeys[];
+
+#endif
+
+#undef _nc_init_keytry
+void _nc_init_keytry(void)
+ { /* void */ }
+
+/* ./tinfo/lib_acs.c */
+
+#undef acs_map
+chtype acs_map[128 ];
+
+#undef _nc_init_acs
+void _nc_init_acs(void)
+ { /* void */ }
+
+/* ./tinfo/lib_baudrate.c */
+
+#include <termcap.h>
+
+struct speed {
+ speed_t s;
+ int sp;
+};
+
+#undef _nc_baudrate
+int _nc_baudrate(
+ int OSpeed)
+ { return(*(int *)0); }
+
+#undef _nc_ospeed
+int _nc_ospeed(
+ int BaudRate)
+ { 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
+TERMINAL *set_curterm(
+ TERMINAL *term)
+ { return(*(TERMINAL **)0); }
+
+#undef del_curterm
+int del_curterm(
+ TERMINAL *term)
+ { 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;
+
+/* ./tinfo/lib_has_cap.c */
+
+#undef has_ic
+bool has_ic(void)
+ { return(*(bool *)0); }
+
+#undef has_il
+bool has_il(void)
+ { return(*(bool *)0); }
+
+/* ./tinfo/lib_kernel.c */
+
+#undef erasechar
+char erasechar(void)
+ { return(*(char *)0); }
+
+#undef killchar
+char killchar(void)
+ { return(*(char *)0); }
+
+#undef flushinp
+int flushinp(void)
+ { return(*(int *)0); }
+
+/* ./lib_keyname.c */
+
+#include <stdlib.h>
+#include <string.h>
+#include <curses.h>
+
+#undef _nc_key_names
+const struct kn _nc_key_names[] = {0};
+
+#undef keyname
+char *keyname(
+ int c)
+ { return(*(char **)0); }
+
+/* ./tinfo/lib_longname.c */
+
+#undef longname
+char *longname(void)
+ { return(*(char **)0); }
+
+/* ./tinfo/lib_napms.c */
+
+#undef napms
+int napms(
+ int ms)
+ { return(*(int *)0); }
+
+/* ./tinfo/lib_options.c */
+
+#undef idlok
+int idlok(
+ WINDOW *win,
+ bool flag)
+ { return(*(int *)0); }
+
+#undef idcok
+void idcok(
+ WINDOW *win,
+ bool flag)
+ { /* void */ }
+
+#undef halfdelay
+int halfdelay(
+ int t)
+ { return(*(int *)0); }
+
+#undef nodelay
+int nodelay(
+ WINDOW *win,
+ bool flag)
+ { return(*(int *)0); }
+
+#undef notimeout
+int notimeout(
+ WINDOW *win,
+ bool f)
+ { return(*(int *)0); }
+
+#undef wtimeout
+void wtimeout(
+ WINDOW *win,
+ int delay)
+ { /* void */ }
+
+#undef keypad
+int keypad(
+ WINDOW *win,
+ bool flag)
+ { return(*(int *)0); }
+
+#undef meta
+int meta(
+ WINDOW *win,
+ bool flag)
+ { return(*(int *)0); }
+
+#undef curs_set
+int curs_set(
+ int vis)
+ { return(*(int *)0); }
+
+#undef typeahead
+int typeahead(
+ int fd)
+ { return(*(int *)0); }
+
+#undef has_key
+int has_key(
+ int keycode)
+ { return(*(int *)0); }
+
+#undef _nc_keypad
+int _nc_keypad(
+ bool flag)
+ { return(*(int *)0); }
+
+/* ./tinfo/lib_raw.c */
+
+#undef raw
+int raw(void)
+ { return(*(int *)0); }
+
+#undef cbreak
+int cbreak(void)
+ { return(*(int *)0); }
+
+#undef qiflush
+void qiflush(void)
+ { /* void */ }
+
+#undef noraw
+int noraw(void)
+ { return(*(int *)0); }
+
+#undef nocbreak
+int nocbreak(void)
+ { return(*(int *)0); }
+
+#undef noqiflush
+void noqiflush(void)
+ { /* void */ }
+
+#undef intrflush
+int intrflush(
+ WINDOW *win,
+ bool flag)
+ { return(*(int *)0); }
+
+/* ./tinfo/lib_setup.c */
+
+#include <sys/ioctl.h>
+
+#undef use_env
+void use_env(
+ bool f)
+ { /* void */ }
+
+#undef LINES
+int LINES;
+#undef COLS
+int COLS;
+#undef TABSIZE
+int TABSIZE;
+
+#undef _nc_update_screensize
+void _nc_update_screensize(void)
+ { /* void */ }
+
+#undef ttytype
+char ttytype[256 ];
+
+#undef setupterm
+int setupterm(
+ char *tname,
+ int Filedes,
+ int *errret)
+ { return(*(int *)0); }
+
+/* ./tinfo/lib_termcap.c */
+
+#undef UP
+char *UP;
+#undef BC
+char *BC;
+
+#undef tgetent
+int tgetent(
+ char *bufp,
+ const char *name)
+ { return(*(int *)0); }
+
+#if 0
+
+#include <capdefaults.c>
+
+#endif
+
+#undef tgetflag
+int tgetflag(
+ char *id)
+ { return(*(int *)0); }
+
+#undef tgetnum
+int tgetnum(
+ char *id)
+ { return(*(int *)0); }
+
+#undef tgetstr
+char *tgetstr(
+ char *id,
+ char **area)
+ { return(*(char **)0); }
+
+#undef tgoto
+char *tgoto(
+ const char *string,
+ int x,
+ int y)
+ { return(*(char **)0); }
+
+/* ./tinfo/lib_termname.c */
+
+#undef termname
+char *termname(void)
+ { return(*(char **)0); }
+
+/* ./tinfo/lib_ti.c */
+
+#undef tigetflag
+int tigetflag(
+ char *str)
+ { return(*(int *)0); }
+
+#undef tigetnum
+int tigetnum(
+ char *str)
+ { return(*(int *)0); }
+
+#undef tigetstr
+char *tigetstr(
+ char *str)
+ { return(*(char **)0); }
+
+/* ./tinfo/lib_tparm.c */
+
+typedef union {
+ unsigned int num;
+ char *str;
+} stack_frame;
+
+#undef tparm
+char *tparm(
+ char *string,
+ ...)
+ { return(*(char **)0); }
+
+/* ./tinfo/lib_tputs.c */
+
+#undef PC
+char PC;
+#undef ospeed
+speed_t ospeed;
+#undef _nc_nulls_sent
+int _nc_nulls_sent;
+
+#undef delay_output
+int delay_output(
+ int ms)
+ { return(*(int *)0); }
+
+#undef _nc_outch
+int _nc_outch(
+ int ch)
+ { return(*(int *)0); }
+
+#undef putp
+int putp(
+ const char *string)
+ { return(*(int *)0); }
+
+#undef tputs
+int tputs(
+ const char *string,
+ int affcnt,
+ int (*outc)(
+ int p1))
+ { return(*(int *)0); }
+
+/* ./trace/lib_trace.c */
+
+#include <fcntl.h>
+
+#undef _nc_tracing
+unsigned _nc_tracing;
+
+#undef trace
+void trace(
+ const unsigned int tracelevel)
+ { /* void */ }
+
+#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); }
+
+/* ./trace/lib_tracebits.c */
+
+#undef _nc_tracebits
+char *_nc_tracebits(void)
+ { return(*(char **)0); }
+
+/* ./trace/lib_tracechr.c */
+
+#undef _tracechar
+char *_tracechar(
+ const unsigned char ch)
+ { return(*(char **)0); }
+
+/* ./tinfo/lib_ttyflags.c */
+
+#undef _nc_get_tty_mode
+int _nc_get_tty_mode(
+ 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
+int def_shell_mode(void)
+ { return(*(int *)0); }
+
+#undef def_prog_mode
+int def_prog_mode(void)
+ { return(*(int *)0); }
+
+#undef reset_prog_mode
+int reset_prog_mode(void)
+ { return(*(int *)0); }
+
+#undef reset_shell_mode
+int reset_shell_mode(void)
+ { return(*(int *)0); }
+
+#undef savetty
+int savetty(void)
+ { return(*(int *)0); }
+
+#undef resetty
+int resetty(void)
+ { return(*(int *)0); }
+
+/* ./tty/lib_twait.c */
+
+#undef _nc_timed_wait
+int _nc_timed_wait(
+ 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
+char *const boolnames[] = {0};
+#undef boolfnames
+char *const boolfnames[] = {0};
+#undef numnames
+char *const numnames[] = {0};
+#undef numfnames
+char *const numfnames[] = {0};
+#undef strnames
+char *const strnames[] = {0};
+#undef strfnames
+char *const strfnames[] = {0};
+
+/* ./tinfo/parse_entry.c */
+#undef _nc_curr_token
+struct token _nc_curr_token;
+
+#undef _nc_parse_entry
+int _nc_parse_entry(
+ struct entry *entryp,
+ int literal,
+ bool silent)
+ { return(*(int *)0); }
+
+#undef _nc_capcmp
+int _nc_capcmp(
+ const char *s,
+ const char *t)
+ { return(*(int *)0); }
+
+typedef struct {const char *from; const char *to;} assoc;
+
+/* ./tinfo/read_entry.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_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 tn,
+ char *const filename,
+ TERMTYPE *const tp)
+ { return(*(int *)0); }
+
+/* ./tinfo/read_termcap.c */
+
+#undef _nc_read_termcap
+void _nc_read_termcap(void)
+ { /* void */ }
+
+/* ./tinfo/setbuf.c */
+
+#undef _nc_set_buffer
+void _nc_set_buffer(
+ FILE *ofp,
+ bool buffered)
+ { /* void */ }
+
+/* ./trace/trace_buf.c */
+
+typedef struct {
+ char *text;
+ size_t size;
+} LIST;
+
+#undef _nc_trace_buf
+char *_nc_trace_buf(
+ int bufnum,
+ size_t want)
+ { return(*(char **)0); }
+
+/* ./tinfo/add_tries.c */
+
+#undef _nc_add_to_try
+void _nc_add_to_try(
+ struct tries **tree,
+ char *str,
+ unsigned short code)
+ { /* void */ }
+
+/* ./unctrl.c */
+
+#undef unctrl
+char *unctrl(
+ chtype ch)
+ { return(*(char **)0); }
+
+/* ./tinfo/write_entry.c */
+
+#undef _nc_set_writedir
+void _nc_set_writedir(
+ char *dir)
+ { /* void */ }
+
+#undef _nc_write_entry
+void _nc_write_entry(
+ TERMTYPE *const tp)
+ { /* void */ }
+
+#undef _nc_tic_written
+int _nc_tic_written(void)
+ { return(*(int *)0); }
diff --git a/contrib/ncurses/ncurses/modules b/contrib/ncurses/ncurses/modules
new file mode 100644
index 000000000000..5bb8227270c5
--- /dev/null
+++ b/contrib/ncurses/ncurses/modules
@@ -0,0 +1,186 @@
+# $Id: modules,v 1.69 1999/07/18 02:38:37 tom Exp $
+##############################################################################
+# Copyright (c) 1998,1999 Free Software Foundation, Inc. #
+# #
+# Permission is hereby granted, free of charge, to any person obtaining a #
+# copy of this software and associated documentation files (the "Software"), #
+# to deal in the Software without restriction, including without limitation #
+# the rights to use, copy, modify, merge, publish, distribute, distribute #
+# with modifications, sublicense, and/or sell copies of the Software, and to #
+# permit persons to whom the Software is furnished to do so, subject to the #
+# following conditions: #
+# #
+# The above copyright notice and this permission notice shall be included in #
+# all copies or substantial portions of the Software. #
+# #
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
+# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
+# DEALINGS IN THE SOFTWARE. #
+# #
+# Except as contained in this notice, the name(s) of the above copyright #
+# holders 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,1998
+#
+
+@ base
+# Library objects
+hardscroll lib $(serial)
+hashmap lib $(serial) ../include/term.h
+lib_addch lib $(base)
+lib_addstr lib $(base)
+lib_beep lib $(base) ../include/term.h
+lib_bkgd lib $(base)
+lib_box lib $(base)
+lib_chgat lib $(base)
+lib_clear lib $(base)
+lib_clearok lib $(base)
+lib_clrbot lib $(base)
+lib_clreol lib $(base)
+lib_color lib $(base) ../include/term.h
+lib_colorset lib $(base)
+lib_delch lib $(base)
+lib_delwin lib $(base)
+lib_echo lib $(base)
+lib_endwin lib $(base) ../include/term.h
+lib_erase lib $(base)
+lib_flash lib $(base) ../include/term.h
+lib_gen lib . ../include/curses.h
+lib_getch lib $(base)
+lib_getstr lib $(base) ../include/term.h
+lib_hline lib $(base)
+lib_immedok lib $(base)
+lib_inchstr lib $(base)
+lib_initscr lib $(base) $(INCDIR)/tic.h
+lib_insch lib $(base)
+lib_insdel lib $(base)
+lib_insstr lib $(base)
+lib_instr lib $(base)
+lib_isendwin lib $(base)
+lib_leaveok lib $(base)
+lib_mouse lib $(base) ../include/term.h
+lib_move lib $(base)
+lib_mvcur lib $(serial) ../include/term.h $(INCDIR)/tic.h
+lib_mvwin lib $(base)
+lib_newterm lib $(base) ../include/term.h
+lib_newwin lib $(base)
+lib_nl lib $(base)
+lib_overlay lib $(base)
+lib_pad lib $(base)
+lib_printw lib $(base)
+lib_redrawln lib $(base)
+lib_refresh lib $(base)
+lib_restart lib $(base) ../include/term.h
+lib_scanw lib $(base)
+lib_screen lib $(base) ../include/term.h
+lib_scroll lib $(base)
+lib_scrollok lib $(base)
+lib_scrreg lib $(base)
+lib_set_term lib $(base) ../include/term.h
+lib_slk lib $(base) ../include/term.h
+lib_slkatr_set lib $(base)
+lib_slkatrof lib $(base)
+lib_slkatron lib $(base)
+lib_slkatrset lib $(base)
+lib_slkattr lib $(base)
+lib_slkclear lib $(base)
+lib_slkcolor lib $(base)
+lib_slkinit lib $(base)
+lib_slklab lib $(base)
+lib_slkrefr lib $(base) ../include/term.h
+lib_slkset lib $(base)
+lib_slktouch lib $(base)
+lib_touch lib $(base)
+lib_traceatr lib $(trace) ../include/term.h
+lib_tracedmp lib $(trace)
+lib_tracemse lib $(trace)
+lib_tstp lib $(serial)
+lib_ungetch lib $(base)
+lib_vidattr lib $(serial) ../include/term.h
+lib_vline lib $(base)
+lib_wattroff lib $(base)
+lib_wattron lib $(base)
+lib_winch lib $(base)
+lib_window lib $(base)
+nc_panel lib $(base)
+safe_sprintf lib $(base)
+tty_update lib $(serial) ../include/term.h
+
+# Modules for porting
+memmove lib $(base)
+sigaction lib $(base)
+vsscanf lib $(base)
+
+# Extensions to the base library
+@ ext_funcs
+define_key lib $(base)
+expanded lib .
+keybound lib $(base)
+keyok lib $(base)
+lib_dft_fgbg lib $(base) ../include/term.h
+lib_freeall lib $(base)
+lib_print lib $(tinfo) ../include/term.h
+resizeterm lib $(base) ../include/term.h
+trace_xnames lib $(trace) ../include/term.h $(INCDIR)/term_entry.h
+tries lib $(base)
+wresize lib $(base) ../include/term.h
+
+# Support for termcap (and tic, etc.), which can be a separate library
+@ termlib
+access lib $(tinfo)
+add_tries lib $(tinfo)
+alloc_entry lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+alloc_ttype lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+captoinfo lib $(tinfo) $(INCDIR)/tic.h
+codes lib .
+comp_captab lib . $(INCDIR)/tic.h ../include/term.h ../include/hashsize.h
+comp_error lib $(tinfo) $(INCDIR)/tic.h
+comp_expand lib $(tinfo) $(INCDIR)/tic.h
+comp_hash lib $(tinfo) ../include/term.h $(INCDIR)/tic.h ../include/hashsize.h
+comp_parse lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+comp_scan lib $(tinfo) $(INCDIR)/tic.h
+doalloc lib $(tinfo)
+fallback lib . ../include/term.h $(INCDIR)/tic.h
+free_ttype lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+getenv_num lib $(tinfo)
+home_terminfo lib $(tinfo)
+init_keytry lib $(tinfo) ../include/term.h $(INCDIR)/tic.h init_keytry.h
+lib_acs lib $(tinfo) ../include/term.h
+lib_baudrate lib $(tinfo) ../include/term.h
+lib_cur_term lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h
+lib_data lib $(tinfo)
+lib_has_cap lib $(tinfo) ../include/term.h
+lib_kernel lib $(tinfo) ../include/term.h
+lib_keyname lib . ../include/term.h
+lib_longname lib $(tinfo)
+lib_napms lib $(tinfo)
+lib_options lib $(tinfo) ../include/term.h
+lib_raw lib $(tinfo) ../include/term.h
+lib_setup lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h
+lib_termcap lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+lib_termname lib $(tinfo) $(INCDIR)/tic.h
+lib_ti lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+lib_tparm lib $(tinfo) ../include/term.h $(INCDIR)/tic.h
+lib_tputs lib $(tinfo) ../include/term.h $(INCDIR)/tic.h
+lib_trace lib $(trace) $(INCDIR)/tic.h
+lib_tracebits lib $(trace) ../include/term.h
+lib_tracechr lib $(trace)
+lib_ttyflags lib $(tinfo) ../include/term.h
+lib_twait lib $(serial)
+name_match lib $(tinfo) ../include/term.h $(INCDIR)/tic.h
+names lib .
+parse_entry lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h ../include/parametrized.h
+read_entry lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+read_termcap lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
+setbuf lib $(tinfo)
+trace_buf lib $(trace)
+trace_tries lib $(trace)
+unctrl lib .
+write_entry lib $(tinfo) ../include/term.h $(INCDIR)/term_entry.h $(INCDIR)/tic.h
diff --git a/contrib/ncurses/ncurses/tinfo/MKcaptab.awk b/contrib/ncurses/ncurses/tinfo/MKcaptab.awk
new file mode 100644
index 000000000000..910af94b7a48
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/MKcaptab.awk
@@ -0,0 +1,70 @@
+#!/bin/sh
+# $Id: MKcaptab.awk,v 1.11 1999/01/24 02:46:42 Jeffrey.C.Honig Exp $
+AWK=${1-awk}
+DATA=${2-../include/Caps}
+
+cat <<'EOF'
+/*
+ * comp_captab.c -- The names of the capabilities indexed via a hash
+ * table for the compiler.
+ *
+ */
+
+#include <ncurses_cfg.h>
+#include <tic.h>
+#include <term.h>
+
+EOF
+
+./make_hash 1 info <$DATA
+./make_hash 3 cap <$DATA
+
+cat <<'EOF'
+const struct alias _nc_capalias_table[] =
+{
+EOF
+
+$AWK <$DATA '
+$1 == "capalias" {
+ if ($3 == "IGNORE")
+ to = "(char *)NULL";
+ else
+ to = "\"" $3 "\"";
+ printf "\t{\"%s\", %s, \"%s\"},\t /* %s */\n",
+ $2, to, $4, $5
+ }
+'
+
+cat <<'EOF'
+ {(char *)NULL, (char *)NULL, (char *)NULL}
+};
+
+const struct alias _nc_infoalias_table[] =
+{
+EOF
+
+$AWK <$DATA '
+$1 == "infoalias" {
+ if ($3 == "IGNORE")
+ to = "(char *)NULL";
+ else
+ to = "\"" $3 "\"";
+ printf "\t{\"%s\", %s, \"%s\"},\t /* %s */\n",
+ $2, to, $4, $5
+ }
+'
+
+cat <<'EOF'
+ {(char *)NULL, (char *)NULL, (char *)NULL}
+};
+
+const struct name_table_entry *_nc_get_table(bool termcap)
+{
+ return termcap ? _nc_cap_table: _nc_info_table ;
+}
+
+const struct name_table_entry * const * _nc_get_hash_table(bool termcap)
+{
+ return termcap ? _nc_cap_hash_table: _nc_info_hash_table ;
+}
+EOF
diff --git a/contrib/ncurses/ncurses/tinfo/MKfallback.sh b/contrib/ncurses/ncurses/tinfo/MKfallback.sh
new file mode 100755
index 000000000000..2a76f6239b2b
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/MKfallback.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+# $Id: MKfallback.sh,v 1.9 1999/06/15 22:57:45 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.
+#
+cat <<EOF
+/*
+ * DO NOT EDIT THIS FILE BY HAND! It is generated by MKfallback.sh.
+ */
+
+#include <curses.priv.h>
+#include <term.h>
+
+EOF
+
+if [ "$*" ]
+then
+ cat <<EOF
+#include <tic.h>
+
+/* fallback entries for: $* */
+EOF
+ for x in $*
+ do
+ echo "/* $x */"
+ infocmp -E $x
+ done
+
+ cat <<EOF
+static const TERMTYPE fallbacks[$#] =
+{
+EOF
+ comma=""
+ for x in $*
+ do
+ echo "$comma /* $x */"
+ infocmp -e $x
+ comma=","
+ done
+
+ cat <<EOF
+};
+
+EOF
+fi
+
+cat <<EOF
+const TERMTYPE *_nc_fallback(const char *name GCC_UNUSED)
+{
+EOF
+
+if [ "$*" ]
+then
+ cat <<EOF
+ const TERMTYPE *tp;
+
+ for (tp = fallbacks;
+ tp < fallbacks + sizeof(fallbacks)/sizeof(TERMTYPE);
+ tp++)
+ if (_nc_name_match(tp->term_names, name, "|"))
+ return(tp);
+EOF
+else
+ echo " /* the fallback list is empty */";
+fi
+
+cat <<EOF
+ return((TERMTYPE *)0);
+}
+EOF
diff --git a/contrib/ncurses/ncurses/tinfo/MKnames.awk b/contrib/ncurses/ncurses/tinfo/MKnames.awk
new file mode 100644
index 000000000000..b97eccc15e38
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/MKnames.awk
@@ -0,0 +1,98 @@
+# $Id: MKnames.awk,v 1.10 1999/01/16 23:36:34 tom Exp $
+BEGIN {
+ print "/* This file was generated by MKnames.awk */" > "namehdr"
+ print "" > "namehdr"
+ print "#include <curses.priv.h>" > "namehdr"
+ print "" > "namehdr"
+ print "#define IT NCURSES_CONST char * const" > "namehdr"
+ print "" > "namehdr"
+ print "#if BROKEN_LINKER" > "namehdr"
+ print "#include <term.h>" > "namehdr"
+ print "#define DCL(it) static IT data##it[]" > "namehdr"
+ print "#else" > "namehdr"
+ print "#define DCL(it) IT it[]" > "namehdr"
+ print "#endif" > "namehdr"
+ print "" > "namehdr"
+ print "/*" > "boolnames"
+ print " * names.c - Arrays of capability names and codes" > "boolnames"
+ print " *" > "boolnames"
+ print " */" > "boolnames"
+ print "" > "boolnames"
+ print "DCL(boolnames) = {" > "boolnames"
+ print "DCL(boolfnames) = {" > "boolfnames"
+ print "DCL(boolcodes) = {" > "boolcodes"
+ print "DCL(numnames) = {" > "numnames"
+ print "DCL(numfnames) = {" > "numfnames"
+ print "DCL(numcodes) = {" > "numcodes"
+ print "DCL(strnames) = {" > "strnames"
+ print "DCL(strfnames) = {" > "strfnames"
+ print "DCL(strcodes) = {" > "strcodes"
+ }
+
+$1 ~ /^#/ {next;}
+
+$1 == "SKIPWARN" {next;}
+
+$3 == "bool" {
+ printf "\t\t\"%s\",\n", $2 > "boolnames"
+ printf "\t\t\"%s\",\n", $1 > "boolfnames"
+ printf "\t\t\"%s\",\n", $4 > "boolcodes"
+ }
+
+$3 == "num" {
+ printf "\t\t\"%s\",\n", $2 > "numnames"
+ printf "\t\t\"%s\",\n", $1 > "numfnames"
+ printf "\t\t\"%s\",\n", $4 > "numcodes"
+ }
+
+$3 == "str" {
+ printf "\t\t\"%s\",\n", $2 > "strnames"
+ printf "\t\t\"%s\",\n", $1 > "strfnames"
+ printf "\t\t\"%s\",\n", $4 > "strcodes"
+ }
+
+END {
+ print "\t\t(NCURSES_CONST char *)0," > "boolnames"
+ print "};" > "boolnames"
+ print "" > "boolnames"
+ print "\t\t(NCURSES_CONST char *)0," > "boolfnames"
+ print "};" > "boolfnames"
+ print "" > "boolfnames"
+ print "\t\t(NCURSES_CONST char *)0," > "boolcodes"
+ print "};" > "boolcodes"
+ print "" > "boolcodes"
+ print "\t\t(NCURSES_CONST char *)0," > "numnames"
+ print "};" > "numnames"
+ print "" > "numnames"
+ print "\t\t(NCURSES_CONST char *)0," > "numfnames"
+ print "};" > "numfnames"
+ print "" > "numfnames"
+ print "\t\t(NCURSES_CONST char *)0," > "numcodes"
+ print "};" > "numcodes"
+ print "" > "numcodes"
+ print "\t\t(NCURSES_CONST char *)0," > "strnames"
+ print "};" > "strnames"
+ print "" > "strnames"
+ print "\t\t(NCURSES_CONST char *)0," > "strfnames"
+ print "};" > "strfnames"
+ print "" > "strfnames"
+ print "\t\t(NCURSES_CONST char *)0," > "strcodes"
+ print "};" > "strcodes"
+ print "" > "strcodes"
+ print "#if BROKEN_LINKER" > "nameftr"
+ print "#define FIX(it) IT *_nc_##it(void) { return data##it; }" > "nameftr"
+ print "FIX(boolnames)" > "nameftr"
+ print "FIX(boolfnames)" > "nameftr"
+ print "FIX(numnames)" > "nameftr"
+ print "FIX(numfnames)" > "nameftr"
+ print "FIX(strnames)" > "nameftr"
+ print "FIX(strfnames)" > "nameftr"
+ print "#endif /* BROKEN_LINKER */" > "nameftr"
+ print "" > "codeftr"
+ print "#if BROKEN_LINKER" > "codeftr"
+ print "#define FIX(it) IT *_nc_##it(void) { return data##it; }" > "codeftr"
+ print "FIX(boolcodes)" > "codeftr"
+ print "FIX(numcodes)" > "codeftr"
+ print "FIX(strcodes)" > "codeftr"
+ print "#endif /* BROKEN_LINKER */" > "codeftr"
+ }
diff --git a/contrib/ncurses/ncurses/tinfo/README b/contrib/ncurses/ncurses/tinfo/README
new file mode 100644
index 000000000000..8b092c1ba41c
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/README
@@ -0,0 +1,8 @@
+-- $Id: README,v 1.1 1998/11/07 22:59:07 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/contrib/ncurses/ncurses/tinfo/access.c b/contrib/ncurses/ncurses/tinfo/access.c
new file mode 100644
index 000000000000..54e549497c94
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/access.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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 *
+ ****************************************************************************/
+
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: access.c,v 1.1 1998/07/25 20:17:09 tom Exp $")
+
+int _nc_access(const char *path, int mode)
+{
+ if (access(path, mode) < 0) {
+ if ((mode & W_OK) != 0
+ && errno == ENOENT) {
+ char head[PATH_MAX];
+ char *leaf = strrchr(strcpy(head, path), '/');
+ if (leaf == 0)
+ leaf = head;
+ *leaf = '\0';
+ if (head == leaf)
+ (void)strcpy(head, ".");
+ return access(head, R_OK|W_OK|X_OK);
+ }
+ return -1;
+ }
+ return 0;
+}
diff --git a/contrib/ncurses/ncurses/tinfo/add_tries.c b/contrib/ncurses/ncurses/tinfo/add_tries.c
new file mode 100644
index 000000000000..95a9e965c5a7
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/add_tries.c
@@ -0,0 +1,124 @@
+/****************************************************************************
+ * Copyright (c) 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 *
+ ****************************************************************************/
+
+/*
+** add_tries.c
+**
+** Add keycode/string to tries-tree.
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: add_tries.c,v 1.1 1998/11/08 00:04:18 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))
+
+void _nc_add_to_try(struct tries **tree, char *str, unsigned short code)
+{
+ static bool out_of_memory = FALSE;
+ struct tries *ptr, *savedptr;
+ unsigned char *txt = (unsigned char *)str;
+
+ if (txt == 0 || *txt == '\0' || out_of_memory || code == 0)
+ return;
+
+ 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 = code;
+ return;
+ }
+ if (ptr->child != 0)
+ ptr = ptr->child;
+ else
+ break;
+ } else {
+ if ((ptr->sibling = typeCalloc(struct tries,1)) == 0) {
+ out_of_memory = TRUE;
+ return;
+ }
+
+ 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(struct tries,1);
+
+ if (ptr == 0) {
+ out_of_memory = TRUE;
+ return;
+ }
+
+ SET_TRY(ptr,txt);
+ ptr->value = 0;
+ }
+
+ /* at this point, we are adding to the try. ptr->child == 0 */
+
+ while (*txt) {
+ ptr->child = typeCalloc(struct tries,1);
+
+ ptr = ptr->child;
+
+ if (ptr == 0) {
+ out_of_memory = TRUE;
+
+ while ((ptr = savedptr) != 0) {
+ savedptr = ptr->child;
+ free(ptr);
+ }
+
+ return;
+ }
+
+ SET_TRY(ptr,txt);
+ ptr->value = 0;
+ }
+
+ ptr->value = code;
+ return;
+}
diff --git a/contrib/ncurses/ncurses/tinfo/alloc_entry.c b/contrib/ncurses/ncurses/tinfo/alloc_entry.c
new file mode 100644
index 000000000000..570b48a9af80
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/alloc_entry.c
@@ -0,0 +1,225 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * 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>
+#include <term_entry.h>
+
+MODULE_ID("$Id: alloc_entry.c,v 1.30 1999/03/01 02:03:45 tom Exp $")
+
+#define ABSENT_OFFSET -1
+#define CANCELLED_OFFSET -2
+
+#define MAX_STRTAB 4096 /* documented maximum entry size */
+
+static char stringbuf[MAX_STRTAB]; /* buffer for string capabilities */
+static size_t next_free; /* next free character in stringbuf */
+
+void _nc_init_entry(TERMTYPE *const tp)
+/* initialize a terminal type data block */
+{
+int i;
+
+#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)
+ tp->Booleans = typeMalloc(char,BOOLCOUNT);
+ if (tp->Numbers == 0)
+ tp->Numbers = typeMalloc(short,NUMCOUNT);
+ if (tp->Strings == 0)
+ tp->Strings = typeMalloc(char *,STRCOUNT);
+
+ 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;
+
+ next_free = 0;
+}
+
+ENTRY *_nc_copy_entry(ENTRY *oldp)
+{
+ ENTRY *newp = typeCalloc(ENTRY,1);
+
+ if (newp != 0) {
+ *newp = *oldp;
+ _nc_copy_termtype(&(newp->tterm), &(oldp->tterm));
+ }
+ return newp;
+}
+
+char *_nc_save_str(const char *const string)
+/* save a copy of string in the string buffer */
+{
+size_t old_next_free = next_free;
+size_t len = strlen(string) + 1;
+
+ if (next_free + len < MAX_STRTAB)
+ {
+ strcpy(&stringbuf[next_free], string);
+ DEBUG(7, ("Saved string %s", _nc_visbuf(string)));
+ DEBUG(7, ("at location %d", (int) next_free));
+ next_free += len;
+ }
+ return(stringbuf + old_next_free);
+}
+
+void _nc_wrap_entry(ENTRY *const ep)
+/* copy the string parts to allocated storage, preserving pointers to it */
+{
+int offsets[MAX_ENTRY_SIZE/2], useoffsets[MAX_USES];
+int i, n;
+TERMTYPE *tp = &(ep->tterm);
+
+ n = tp->term_names - stringbuf;
+ for_each_string(i, &(ep->tterm)) {
+ if (tp->Strings[i] == ABSENT_STRING)
+ offsets[i] = ABSENT_OFFSET;
+ else if (tp->Strings[i] == CANCELLED_STRING)
+ offsets[i] = CANCELLED_OFFSET;
+ else
+ offsets[i] = tp->Strings[i] - stringbuf;
+ }
+
+ for (i=0; i < ep->nuses; i++) {
+ if (ep->uses[i].parent == (void *)0)
+ useoffsets[i] = ABSENT_OFFSET;
+ else
+ useoffsets[i] = (char *)(ep->uses[i].parent) - stringbuf;
+ }
+
+ if ((tp->str_table = typeMalloc(char, next_free)) == (char *)0)
+ _nc_err_abort("Out of memory");
+ (void) memcpy(tp->str_table, stringbuf, next_free);
+
+ tp->term_names = tp->str_table + n;
+ for_each_string(i, &(ep->tterm)) {
+ 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 ((n = NUM_EXT_NAMES(tp)) != 0) {
+ unsigned length = 0;
+ for (i = 0; i < n; i++) {
+ length += strlen(tp->ext_Names[i]) + 1;
+ offsets[i] = tp->ext_Names[i] - stringbuf;
+ }
+ if ((tp->ext_str_table = typeMalloc(char, length)) == 0)
+ _nc_err_abort("Out of memory");
+ for (i = 0, length = 0; i < n; i++) {
+ tp->ext_Names[i] = tp->ext_str_table + length;
+ strcpy(tp->ext_Names[i], stringbuf + offsets[i]);
+ length += strlen(tp->ext_Names[i]) + 1;
+ }
+ }
+#endif
+
+ for (i=0; i < ep->nuses; i++) {
+ if (useoffsets[i] == ABSENT_OFFSET)
+ ep->uses[i].parent = (void *)0;
+ else
+ ep->uses[i].parent = (char *)(tp->str_table + useoffsets[i]);
+ }
+}
+
+void _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from)
+/* merge capabilities from `from' entry into `to' entry */
+{
+ int i;
+
+#if NCURSES_XNAMES
+ _nc_align_termtype(to, from);
+#endif
+ for_each_boolean(i, from)
+ {
+ int mergebool = from->Booleans[i];
+
+ if (mergebool == CANCELLED_BOOLEAN)
+ to->Booleans[i] = FALSE;
+ else if (mergebool == TRUE)
+ to->Booleans[i] = mergebool;
+ }
+
+ for_each_number(i, from)
+ {
+ int mergenum = from->Numbers[i];
+
+ if (mergenum == CANCELLED_NUMERIC)
+ to->Numbers[i] = ABSENT_NUMERIC;
+ else if (mergenum != ABSENT_NUMERIC)
+ to->Numbers[i] = 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)
+ {
+ char *mergestring = from->Strings[i];
+
+ if (mergestring == CANCELLED_STRING)
+ to->Strings[i] = ABSENT_STRING;
+ else if (mergestring != ABSENT_STRING)
+ to->Strings[i] = mergestring;
+ }
+}
diff --git a/contrib/ncurses/ncurses/tinfo/alloc_ttype.c b/contrib/ncurses/ncurses/tinfo/alloc_ttype.c
new file mode 100644
index 000000000000..a1bf9b0733f0
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/alloc_ttype.c
@@ -0,0 +1,461 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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 *
+ ****************************************************************************/
+
+
+/*
+ * align_ttype.c -- functions for TERMTYPE
+ *
+ * _nc_align_termtype()
+ * _nc_copy_termtype()
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+#include <term_entry.h>
+
+MODULE_ID("$Id: alloc_ttype.c,v 1.6 1999/03/01 22:10:44 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 && nb) {
+ int cmp = strcmp(*a, *b);
+ if (cmp < 0) {
+ dst[n++] = *a++;
+ na--;
+ } else if (cmp > 0) {
+ dst[n++] = *b++;
+ nb--;
+ } else if (cmp == 0) {
+ 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 length, char *name)
+{
+ while (length-- > 0) {
+ if (!strcmp(*table++, name)) {
+ DEBUG(4, ("found name '%s'", name));
+ return TRUE;
+ }
+ }
+ DEBUG(4, ("did not find name '%s'", name));
+ return FALSE;
+}
+
+static void realign_data(TERMTYPE *to, char **ext_Names, int ext_Booleans, int ext_Numbers, int ext_Strings)
+{
+ int n, m, base;
+ int limit = (to->ext_Booleans + to->ext_Numbers + to->ext_Strings);
+
+ if (to->ext_Booleans != ext_Booleans) {
+ to->num_Booleans += (ext_Booleans - to->ext_Booleans);
+ to->Booleans = typeRealloc(char, 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, limit, ext_Names[m])) {
+ to->Booleans[base + m] = to->Booleans[base + n--];
+ } else {
+ to->Booleans[base + m] = FALSE;
+ }
+ }
+ to->ext_Booleans = ext_Booleans;
+ }
+ if (to->ext_Numbers != ext_Numbers) {
+ to->num_Numbers += (ext_Numbers - to->ext_Numbers);
+ to->Numbers = typeRealloc(short, 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, limit, ext_Names[m+ext_Booleans])) {
+ to->Numbers[base + m] = to->Numbers[base + n--];
+ } else {
+ to->Numbers[base + m] = ABSENT_NUMERIC;
+ }
+ }
+ to->ext_Numbers = ext_Numbers;
+ }
+ if (to->ext_Strings != ext_Strings) {
+ to->num_Strings += (ext_Strings - to->ext_Strings);
+ to->Strings = typeRealloc(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, limit, ext_Names[m+ext_Booleans+ext_Numbers])) {
+ to->Strings[base + m] = to->Strings[base + n--];
+ } else {
+ to->Strings[base + m] = ABSENT_STRING;
+ }
+ }
+ to->ext_Strings = ext_Strings;
+ }
+}
+
+/*
+ * Returns the first index in ext_Names[] for the given token-type
+ */
+static int _nc_first_ext_name(TERMTYPE *tp, int token_type)
+{
+ int first;
+
+ switch (token_type) {
+ case BOOLEAN:
+ first = 0;
+ break;
+ case NUMBER:
+ first = tp->ext_Booleans;
+ break;
+ case STRING:
+ first = 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 int _nc_last_ext_name(TERMTYPE *tp, int token_type)
+{
+ int last;
+
+ switch (token_type) {
+ case BOOLEAN:
+ last = tp->ext_Booleans;
+ break;
+ case NUMBER:
+ last = 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(TERMTYPE *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 j;
+ }
+ }
+ return -1;
+}
+
+/*
+ * Translate an index into ext_Names[] into the corresponding index into data
+ * (e.g., Booleans[]).
+ */
+static int _nc_ext_data_index(TERMTYPE *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 void _nc_del_ext_name(TERMTYPE *tp, char *name, int token_type)
+{
+ int j;
+ int first, last;
+
+ if ((first = _nc_find_ext_name(tp, name, token_type)) >= 0) {
+ last = 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 -= 1;
+ tp->num_Booleans -= 1;
+ break;
+ case NUMBER:
+ last = tp->num_Numbers - 1;
+ for (j = first; j < last; j++)
+ tp->Numbers[j] = tp->Numbers[j+1];
+ tp->ext_Numbers -= 1;
+ tp->num_Numbers -= 1;
+ break;
+ case STRING:
+ last = tp->num_Strings - 1;
+ for (j = first; j < last; j++)
+ tp->Strings[j] = tp->Strings[j+1];
+ tp->ext_Strings -= 1;
+ tp->num_Strings -= 1;
+ break;
+ }
+ }
+}
+
+/*
+ * 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(TERMTYPE *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, j, token_type);
+ if (cmp < 0) {
+ break;
+ }
+ }
+
+ tp->ext_Names = typeRealloc(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 = _nc_ext_data_index(tp, j, token_type);
+
+ switch (token_type) {
+ case BOOLEAN:
+ tp->ext_Booleans += 1;
+ tp->num_Booleans += 1;
+ tp->Booleans = typeRealloc(char, tp->num_Booleans, tp->Booleans);
+ for (k = tp->num_Booleans-1; k > j; k--)
+ tp->Booleans[k] = tp->Booleans[k-1];
+ break;
+ case NUMBER:
+ tp->ext_Numbers += 1;
+ tp->num_Numbers += 1;
+ tp->Numbers = typeRealloc(short, tp->num_Numbers, tp->Numbers);
+ for (k = tp->num_Numbers-1; k > j; k--)
+ tp->Numbers[k] = tp->Numbers[k-1];
+ break;
+ case STRING:
+ tp->ext_Strings += 1;
+ tp->num_Strings += 1;
+ tp->Strings = typeRealloc(char *, tp->num_Strings, tp->Strings);
+ for (k = tp->num_Strings-1; k > j; k--)
+ tp->Strings[k] = tp->Strings[k-1];
+ break;
+ }
+ return 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(TERMTYPE *to, TERMTYPE *from)
+{
+ int first = to->ext_Booleans + to->ext_Numbers;
+ int last = first + to->ext_Strings;
+ int j, k;
+
+ for (j = first; j < last; ) {
+ char *name = to->ext_Names[j];
+ unsigned j_str = to->num_Strings - first - to->ext_Strings;
+
+ if (to->Strings[j + j_str] == CANCELLED_STRING) {
+ if ((k = _nc_find_ext_name(from, to->ext_Names[j], BOOLEAN)) >= 0) {
+ _nc_del_ext_name(to, name, STRING);
+ k = _nc_ins_ext_name(to, name, BOOLEAN);
+ to->Booleans[k] = FALSE;
+ } else if ((k = _nc_find_ext_name(from, to->ext_Names[j], NUMBER)) >= 0) {
+ _nc_del_ext_name(to, name, STRING);
+ k = _nc_ins_ext_name(to, name, NUMBER);
+ to->Numbers[k] = CANCELLED_NUMERIC;
+ }
+ } else {
+ j++;
+ }
+ }
+}
+
+void _nc_align_termtype(TERMTYPE *to, TERMTYPE *from)
+{
+ int na = NUM_EXT_NAMES(to);
+ int nb = NUM_EXT_NAMES(from);
+ int n;
+ bool same;
+ char **ext_Names;
+ int ext_Booleans, ext_Numbers, ext_Strings;
+
+ DEBUG(2, ("align_termtype to(%d:%s), from(%d:%s)", na, to->term_names, nb, from->term_names));
+
+ if (na != 0 || nb != 0) {
+ 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)) {
+ for (n = 0, same = TRUE; n < na; n++) {
+ if (strcmp(to->ext_Names[n], from->ext_Names[n])) {
+ same = FALSE;
+ break;
+ }
+ }
+ if (same)
+ 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).
+ */
+ ext_Names = typeMalloc(char *, na+nb);
+
+ 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);
+ free(to->ext_Names);
+ to->ext_Names = ext_Names;
+ DEBUG(2, ("realigned %d extended names for '%s' (to)", NUM_EXT_NAMES(to), to->term_names));
+ }
+ 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);
+ from->ext_Names = typeRealloc(char *, nb, from->ext_Names);
+ memcpy(from->ext_Names, ext_Names, sizeof(char *) * nb);
+ DEBUG(2, ("realigned %d extended names for '%s' (from)", NUM_EXT_NAMES(from), from->term_names));
+ }
+ }
+}
+#endif
+
+void _nc_copy_termtype(TERMTYPE *dst, TERMTYPE *src)
+{
+ int i;
+
+ *dst = *src; /* ...to copy the sizes and string-tables */
+ dst->Booleans = typeMalloc(char, NUM_BOOLEANS(dst));
+ dst->Numbers = typeMalloc(short, NUM_NUMBERS(dst));
+ dst->Strings = typeMalloc(char *, NUM_STRINGS(dst));
+
+ /* FIXME: use memcpy for these and similar loops */
+ for_each_boolean(i,dst)
+ dst->Booleans[i] = src->Booleans[i];
+ for_each_number(i,dst)
+ dst->Numbers[i] = src->Numbers[i];
+ for_each_string(i,dst)
+ dst->Strings[i] = src->Strings[i];
+
+ /* FIXME: we probably should also copy str_table and ext_str_table,
+ * but tic and infocmp are not written to exploit that (yet).
+ */
+
+#if NCURSES_XNAMES
+ if ((i = NUM_EXT_NAMES(src)) != 0) {
+ dst->ext_Names = typeMalloc(char *, i);
+ memcpy(dst->ext_Names, src->ext_Names, i * sizeof(char *));
+ }
+#endif
+
+}
diff --git a/contrib/ncurses/ncurses/tinfo/captoinfo.c b/contrib/ncurses/ncurses/tinfo/captoinfo.c
new file mode 100644
index 000000000000..d0881ecd4792
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/captoinfo.c
@@ -0,0 +1,807 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+ * captoinfo.c --- 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>.
+ *
+ * There is just one entry point:
+ *
+ * char *captoinfo(n, s, parametrized)
+ *
+ * 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.24 1999/07/24 20:06:13 tom Exp $")
+
+#define MAX_PUSHED 16 /* max # args we can push onto the stack */
+#define MAX_ENTRY 2048 /* maximum chars in a translated capability */
+
+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)
+ my_string = typeMalloc(char, my_length = 256);
+ if (my_string == 0)
+ _nc_err_abort("Out of memory");
+
+ *my_string = '\0';
+ return my_string;
+}
+
+static char *save_string(char *d, const char *const s)
+{
+ size_t have = (d - my_string);
+ size_t need = have + strlen(s) + 2;
+ if (need > my_length) {
+ my_string = (char *)realloc(my_string, my_length = (need + need));
+ if (my_string == 0)
+ _nc_err_abort("Out of memory");
+ d = my_string + have;
+ }
+ (void) strcpy(d, s);
+ return d + strlen(d);
+}
+
+static inline char *save_char(char *s, char c)
+{
+ static char temp[2];
+ temp[0] = 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 = *sp;
+ len = 2;
+ break;
+ case '\0':
+ c = '\\';
+ len = 1;
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ len = 1;
+ while (isdigit(*sp))
+ {
+ c = 8 * c + (*sp++ - '0');
+ len++;
+ }
+ break;
+ default:
+ c = *sp;
+ len = 2;
+ break;
+ }
+ break;
+ case '^':
+ c = (*++sp & 0x1f);
+ len = 2;
+ break;
+ default:
+ c = *sp;
+ len = 1;
+ }
+ if (isgraph(c) && c != ',' && c != '\'' && c != '\\' && c != ':') {
+ *dp++ = '%'; *dp++ = '\''; *dp++ = c; *dp++ = '\'';
+ } else {
+ *dp++ = '%'; *dp++ = '{';
+ if (c > 99)
+ *dp++ = c / 100 + '0';
+ if (c > 9)
+ *dp++ = ((int)(c / 10)) % 10 + '0';
+ *dp++ = c % 10 + '0';
+ *dp++ = '}';
+ }
+ return len;
+}
+
+static void getparm(int parm, int n)
+/* push n copies of param on the terminfo stack if not already there */
+{
+ if (seenr) {
+ if (parm == 1)
+ parm = 2;
+ else if (parm == 2)
+ parm = 1;
+ }
+ if (onstack == parm) {
+ if (n > 1) {
+ _nc_warning("string may not be optimal");
+ *dp++ = '%'; *dp++ = 'P'; *dp++ = 'a';
+ while(n--) {
+ *dp++ = '%'; *dp++ = 'g'; *dp++ = 'a';
+ }
+ }
+ return;
+ }
+ if (onstack != 0)
+ push();
+
+ onstack = parm;
+
+ while(n--) { /* %p0 */
+ *dp++ = '%'; *dp++ = 'p'; *dp++ = '0' + parm;
+ }
+
+ if (seenn && parm < 3) { /* %{96}%^ */
+ *dp++ = '%'; *dp++ = '{'; *dp++ = '9'; *dp++ = '6'; *dp++ = '}';
+ *dp++ = '%'; *dp++ = '^';
+ }
+
+ if (seenm && parm < 3) { /* %{127}%^ */
+ *dp++ = '%'; *dp++ = '{'; *dp++ = '1'; *dp++ = '2'; *dp++ = '7';
+ *dp++ = '}'; *dp++ = '%'; *dp++ = '^';
+ }
+}
+
+char *_nc_captoinfo(
+/* convert a termcap string to terminfo format */
+register const char *cap, /* relevant terminfo capability index */
+register const char *s, /* string value of the capability */
+int const parametrized) /* do % translations if 1, pad translations if >=0 */
+{
+ static char line[MAX_ENTRY];
+ const char *capstart;
+
+ stackptr = 0;
+ onstack = 0;
+ seenm = 0;
+ seenn = 0;
+ seenr = 0;
+ param = 1;
+
+ dp = line;
+
+ /* skip the initial padding (if we haven't been told not to) */
+ capstart = 0;
+ if (s == 0)
+ s = "";
+ if (parametrized >= 0 && isdigit(*s))
+ for (capstart = s; ; s++)
+ if (!(isdigit(*s) || *s == '*' || *s == '.'))
+ break;
+
+ while(*s != '\0') {
+ switch(*s) {
+ case '%':
+ s++;
+ if (parametrized < 1) {
+ *dp++ = '%';
+ break;
+ }
+ switch(*s++) {
+ case '%': *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++ = '%'; *dp++ = 'i'; break;
+ case '6':
+ case 'B':
+ getparm(param, 2);
+ /* %{6}%*%+ */
+ *dp++ = '%'; *dp++ = '{'; *dp++ = '6';
+ *dp++ = '}'; *dp++ = '%'; *dp++ = '*';
+ *dp++ = '%'; *dp++ = '+';
+ break;
+ case '8':
+ case 'D':
+ getparm(param, 2);
+ /* %{2}%*%- */
+ *dp++ = '%'; *dp++ = '{'; *dp++ = '2';
+ *dp++ = '}'; *dp++ = '%'; *dp++ = '*';
+ *dp++ = '%'; *dp++ = '-';
+ break;
+ case '>':
+ getparm(param, 2);
+ /* %?%{x}%>%t%{y}%+%; */
+ *dp++ = '%'; *dp++ = '?';
+ s += cvtchar(s);
+ *dp++ = '%'; *dp++ = '>';
+ *dp++ = '%'; *dp++ = 't';
+ s += cvtchar(s);
+ *dp++ = '%'; *dp++ = '+';
+ *dp++ = '%'; *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++ = '%'; *dp++ = '+';
+ break;
+ case '-':
+ *dp++ = '%'; *dp++ = '-';
+ break;
+ case '*':
+ *dp++ = '%'; *dp++ = '*';
+ break;
+ case '/':
+ *dp++ = '%'; *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++ = '%'; *dp++ = '+';
+ break;
+ case '+':
+ getparm(param, 1);
+ s += cvtchar(s);
+ *dp++ = '%'; *dp++ = '+';
+ *dp++ = '%'; *dp++ = 'c';
+ pop();
+ break;
+ case 's':
+#ifdef WATERLOO
+ s += cvtchar(s);
+ getparm(param, 1);
+ *dp++ = '%'; *dp++ = '-';
+#else
+ getparm(param, 1);
+ *dp++ = '%'; *dp++ = 's';
+ pop();
+#endif /* WATERLOO */
+ break;
+ case '-':
+ s += cvtchar(s);
+ getparm(param, 1);
+ *dp++ = '%'; *dp++ = '-';
+ *dp++ = '%'; *dp++ = 'c';
+ pop();
+ break;
+ case '.':
+ getparm(param, 1);
+ *dp++ = '%'; *dp++ = 'c';
+ pop();
+ break;
+ case '0': /* not clear any of the historical termcaps did this */
+ if (*s == '3')
+ goto see03;
+ else if (*s != '2')
+ goto invalid;
+ /* FALLTHRU */
+ case '2':
+ getparm(param, 1);
+ *dp++ = '%'; /* *dp++ = '0'; */
+ *dp++ = '2'; *dp++ = 'd';
+ pop();
+ break;
+ case '3': see03:
+ getparm(param, 1);
+ *dp++ = '%'; /* *dp++ = '0'; */
+ *dp++ = '3'; *dp++ = 'd';
+ pop();
+ break;
+ case 'd':
+ getparm(param, 1);
+ *dp++ = '%'; *dp++ = 'd';
+ pop();
+ break;
+ case 'f':
+ param++;
+ break;
+ case 'b':
+ param--;
+ break;
+ case '\\':
+ *dp++ = '%';
+ *dp++ = '\\';
+ break;
+ default: invalid:
+ *dp++ = '%';
+ s--;
+ _nc_warning("unknown %% code %s in %s",
+ _tracechar(*s), cap);
+ break;
+ }
+ break;
+#ifdef REVISIBILIZE
+ case '\\':
+ *dp++ = *s++; *dp++ = *s++; break;
+ case '\n':
+ *dp++ = '\\'; *dp++ = 'n'; s++; break;
+ case '\t':
+ *dp++ = '\\'; *dp++ = 't'; s++; break;
+ case '\r':
+ *dp++ = '\\'; *dp++ = 'r'; s++; break;
+ case '\200':
+ *dp++ = '\\'; *dp++ = '0'; s++; break;
+ case '\f':
+ *dp++ = '\\'; *dp++ = 'f'; s++; break;
+ case '\b':
+ *dp++ = '\\'; *dp++ = 'b'; s++; break;
+ case ' ':
+ *dp++ = '\\'; *dp++ = 's'; s++; break;
+ case '^':
+ *dp++ = '\\'; *dp++ = '^'; s++; break;
+ case ':':
+ *dp++ = '\\'; *dp++ = ':'; s++; break;
+ case ',':
+ *dp++ = '\\'; *dp++ = ','; s++; break;
+ default:
+ if (*s == '\033') {
+ *dp++ = '\\';
+ *dp++ = 'E';
+ s++;
+ } else if (*s > 0 && *s < 32) {
+ *dp++ = '^';
+ *dp++ = *s + '@';
+ s++;
+ } else if (*s <= 0 || *s >= 127) {
+ *dp++ = '\\';
+ *dp++ = ((*s & 0300) >> 6) + '0';
+ *dp++ = ((*s & 0070) >> 3) + '0';
+ *dp++ = (*s & 0007) + '0';
+ s++;
+ } else
+ *dp++ = *s++;
+ break;
+#else
+ default:
+ *dp++ = *s++;
+ break;
+#endif
+ }
+ }
+
+ /*
+ * Now, if we stripped off some leading padding, add it at the end
+ * of the string as mandatory padding.
+ */
+ if (capstart)
+ {
+ *dp++ = '$';
+ *dp++ = '<';
+ for (s = capstart; ; s++)
+ if (isdigit(*s) || *s == '*' || *s == '.')
+ *dp++ = *s;
+ else
+ break;
+ *dp++ = '/';
+ *dp++ = '>';
+ }
+
+ *dp = '\0';
+ return(line);
+}
+
+/*
+ * 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)
+ */
+
+char *_nc_infotocap(
+/* convert a terminfo string to termcap format */
+register const char *cap GCC_UNUSED, /* relevant termcap capability index */
+register const char *str, /* string value of the capability */
+int const parametrized) /* do % translations if 1, pad translations if >=0 */
+{
+ int seenone = 0, seentwo = 0, saw_m = 0, saw_n = 0;
+ const char *padding;
+ const char *trimmed = 0;
+ char ch1 = 0, ch2 = 0;
+ char *bufptr = init_string();
+ char temp[256];
+
+ /* we may have to move some trailing mandatory padding up front */
+ padding = str + strlen(str) - 1;
+ if (*padding == '>' && *--padding == '/')
+ {
+ --padding;
+ while (isdigit(*padding) || *padding == '.' || *padding == '*')
+ padding--;
+ if (*padding == '<' && *--padding == '$')
+ trimmed = padding;
+ padding += 2;
+
+ while (isdigit(*padding) || *padding == '.' || *padding == '*')
+ bufptr = save_char(bufptr, *padding++);
+ }
+
+ for (; *str && str != trimmed; str++)
+ {
+ int c1, c2;
+ char *cp = 0;
+
+ if (str[0] == '\\' && (str[1] == '^' || str[1] == ','))
+ {
+ bufptr = save_char(bufptr, *++str);
+ }
+ else if (str[0] == '$' && str[1] == '<') /* discard padding */
+ {
+ str += 2;
+ while (isdigit(*str) || *str == '.' || *str == '*' || *str == '/' || *str == '>')
+ str++;
+ --str;
+ }
+ else if (*str != '%' || (parametrized < 1))
+ bufptr = save_char(bufptr, *str);
+ else if (sscanf(str, "%%?%%{%d}%%>%%t%%{%d}%%+%%;", &c1,&c2) == 2)
+ {
+ str = strchr(str, ';');
+ (void) sprintf(temp, "%%>%s%s", unctrl(c1), unctrl(c2));
+ bufptr = save_string(bufptr, temp);
+ }
+ else if (sscanf(str, "%%?%%{%d}%%>%%t%%'%c'%%+%%;", &c1,&ch2) == 2)
+ {
+ str = strchr(str, ';');
+ (void) sprintf(temp, "%%>%s%c", unctrl(c1), ch2);
+ bufptr = save_string(bufptr, temp);
+ }
+ else if (sscanf(str, "%%?%%'%c'%%>%%t%%{%d}%%+%%;", &ch1,&c2) == 2)
+ {
+ str = strchr(str, ';');
+ (void) sprintf(temp, "%%>%c%c", ch1, c2);
+ bufptr = save_string(bufptr, temp);
+ }
+ else if (sscanf(str, "%%?%%'%c'%%>%%t%%'%c'%%+%%;", &ch1, &ch2) == 2)
+ {
+ str = strchr(str, ';');
+ (void) sprintf(temp, "%%>%c%c", ch1, ch2);
+ bufptr = save_string(bufptr, temp);
+ }
+ else if (strncmp(str, "%{6}%*%+", 8) == 0)
+ {
+ str += 7;
+ (void) sprintf(temp, "%%B");
+ bufptr = save_string(bufptr, temp);
+ }
+ else if ((sscanf(str, "%%{%d}%%+%%c", &c1) == 1
+ || sscanf(str, "%%'%c'%%+%%c", &ch1) == 1)
+ && (cp = strchr(str, '+')))
+ {
+ str = cp + 2;
+ bufptr = save_char(bufptr, '%');
+ bufptr = save_char(bufptr, '+');
+
+ if (ch1)
+ c1 = ch1;
+ if (is7bits(c1) && isprint(c1))
+ bufptr = save_char(bufptr, (char)c1);
+ else
+ {
+ if (c1 == (c1 & 0x1f)) /* iscntrl() returns T on 255 */
+ (void) strcpy(temp, unctrl(c1));
+ else
+ (void) sprintf(temp, "\\%03o", c1);
+ bufptr = save_string(bufptr, temp);
+ }
+ }
+ else if (strncmp(str, "%{2}%*%-", 8) == 0)
+ {
+ str += 7;
+ (void) sprintf(temp, "%%D");
+ bufptr = save_string(bufptr, temp);
+ }
+ else if (strncmp(str, "%{96}%^", 7) == 0)
+ {
+ str += 6;
+ if (saw_m++ == 0)
+ {
+ (void) sprintf(temp, "%%n");
+ bufptr = save_string(bufptr, temp);
+ }
+ }
+ else if (strncmp(str, "%{127}%^", 8) == 0)
+ {
+ str += 7;
+ if (saw_n++ == 0)
+ {
+ (void) sprintf(temp, "%%m");
+ bufptr = save_string(bufptr, temp);
+ }
+ }
+ else
+ {
+ 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, '%');
+ while (isdigit(*str))
+ bufptr = save_char(bufptr, *str++);
+ if (*str == 'd')
+ str++;
+ else
+ _nc_warning("numeric prefix is missing trailing d in %s",
+ cap);
+ --str;
+ break;
+
+ case 'd':
+ bufptr = save_char(bufptr, '%');
+ bufptr = save_char(bufptr, 'd');
+ break;
+
+ case 'c':
+ bufptr = save_char(bufptr, '%');
+ bufptr = save_char(bufptr, '.');
+ break;
+
+ /*
+ * %s isn't in termcap, but it's convenient to pass it through
+ * so we can represent things like terminfo pfkey strings in
+ * termcap notation.
+ */
+ case 's':
+ bufptr = save_char(bufptr, '%');
+ bufptr = save_char(bufptr, 's');
+ break;
+
+ case 'p':
+ str++;
+ if (*str == '1')
+ seenone = 1;
+ else if (*str == '2')
+ {
+ if (!seenone && !seentwo)
+ {
+ bufptr = save_char(bufptr, '%');
+ bufptr = save_char(bufptr, 'r');
+ seentwo++;
+ }
+ }
+ else if (*str >= '3')
+ return(0);
+ break;
+
+ case 'i':
+ bufptr = save_char(bufptr, '%');
+ bufptr = save_char(bufptr, 'i');
+ break;
+
+ default:
+ return(0);
+
+ } /* endswitch (*str) */
+ } /* endelse (*str == '%') */
+
+ if (*str == '\0')
+ break;
+
+ } /* endwhile (*str) */
+
+ return(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 */
+
+/* captoinfo.c ends here */
+
diff --git a/contrib/ncurses/ncurses/tinfo/comp_error.c b/contrib/ncurses/ncurses/tinfo/comp_error.c
new file mode 100644
index 000000000000..2b2d503013c0
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/comp_error.c
@@ -0,0 +1,132 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * comp_error.c -- Error message routines
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+
+MODULE_ID("$Id: comp_error.c,v 1.16 1998/08/01 23:39:51 tom Exp $")
+
+bool _nc_suppress_warnings;
+int _nc_curr_line; /* current line # in input */
+int _nc_curr_col; /* current column # in input */
+
+static const char *sourcename;
+static char termtype[MAX_NAME_SIZE+1];
+
+void _nc_set_source(const char *const name)
+{
+ sourcename = name;
+}
+
+void _nc_set_type(const char *const name)
+{
+ if (name)
+ strncpy( termtype, name, MAX_NAME_SIZE );
+ else
+ termtype[0] = '\0';
+}
+
+void _nc_get_type(char *name)
+{
+ strcpy( name, termtype );
+}
+
+static inline void where_is_problem(void)
+{
+ fprintf (stderr, "\"%s\"", 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])
+ fprintf (stderr, ", terminal '%s'", termtype);
+ fputc(':', stderr);
+ fputc(' ', stderr);
+}
+
+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);
+}
+
+
+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);
+}
+
+
+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 we're debugging, try to show where the problem occurred - this
+ * will dump core.
+ */
+#if defined(TRACE) || !defined(NDEBUG)
+ abort();
+#else
+ /* Dumping core in production code is not a good idea.
+ */
+ exit(EXIT_FAILURE);
+#endif
+}
diff --git a/contrib/ncurses/ncurses/tinfo/comp_expand.c b/contrib/ncurses/ncurses/tinfo/comp_expand.c
new file mode 100644
index 000000000000..eb552fadabda
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/comp_expand.c
@@ -0,0 +1,189 @@
+/****************************************************************************
+ * Copyright (c) 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 *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <tic.h>
+
+MODULE_ID("$Id: comp_expand.c,v 1.11 1999/03/07 00:51:07 tom Exp $")
+
+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 CHAR_OF(s) (*(unsigned const char *)(s))
+#define REALCTL(s) (CHAR_OF(s) < 127 && iscntrl(CHAR_OF(s)))
+#define REALPRINT(s) (CHAR_OF(s) < 127 && isprint(CHAR_OF(s)))
+
+char *_nc_tic_expand(const char *srcp, bool tic_format, int numbers)
+{
+static char * buffer;
+static size_t length;
+
+int bufp;
+const char *ptr, *str = VALID_STRING(srcp) ? srcp : "";
+bool islong = (strlen(str) > 3);
+size_t need = (2 + strlen(str)) * 4;
+int ch;
+
+ if (buffer == 0 || need > length) {
+ if ((buffer = typeRealloc(char, length = need, buffer)) == 0)
+ return 0;
+ }
+
+ bufp = 0;
+ ptr = str;
+ while ((ch = (*str & 0xff)) != 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) {
+ sprintf(buffer+bufp, "{%d}", str[1]);
+ bufp += 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(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++] = ch;
+ buffer[bufp++] = S_QUOTE;
+ str = dst;
+ } else {
+ buffer[bufp++] = *str;
+ }
+ } else {
+ buffer[bufp++] = *str;
+ }
+ break;
+ default:
+ 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 == ':' || ch == '^') && tic_format) {
+ buffer[bufp++] = '\\';
+ buffer[bufp++] = ch;
+ }
+ else if (REALPRINT(str) && (ch != ',' && ch != ':' && !(ch == '!' && !tic_format) && ch != '^'))
+ buffer[bufp++] = ch;
+#if 0 /* FIXME: this would be more readable (in fact the whole 'islong' logic should be removed) */
+ else if (ch == '\b') {
+ buffer[bufp++] = '\\';
+ buffer[bufp++] = 'b';
+ }
+ else if (ch == '\f') {
+ buffer[bufp++] = '\\';
+ buffer[bufp++] = 'f';
+ }
+ else if (ch == '\t' && islong) {
+ buffer[bufp++] = '\\';
+ buffer[bufp++] = 't';
+ }
+#endif
+ else if (ch == '\r' && (islong || (strlen(srcp) > 2 && str[1] == '\0'))) {
+ buffer[bufp++] = '\\';
+ buffer[bufp++] = 'r';
+ }
+ else if (ch == '\n' && islong) {
+ buffer[bufp++] = '\\';
+ buffer[bufp++] = 'n';
+ }
+#define UnCtl(c) ((c) + '@')
+ else if (REALCTL(str) && ch != '\\' && (!islong || isdigit(str[1])))
+ {
+ (void) sprintf(&buffer[bufp], "^%c", UnCtl(ch));
+ bufp += 2;
+ }
+ else
+ {
+ (void) sprintf(&buffer[bufp], "\\%03o", ch);
+ bufp += 4;
+ }
+
+ str++;
+ }
+
+ buffer[bufp] = '\0';
+ return(buffer);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/comp_hash.c b/contrib/ncurses/ncurses/tinfo/comp_hash.c
new file mode 100644
index 000000000000..7e0bdd0524fe
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/comp_hash.c
@@ -0,0 +1,325 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * comp_hash.c --- Routines to deal with the hashtable of capability
+ * names.
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+#include <hashsize.h>
+
+#ifdef MAIN_PROGRAM
+#include <ctype.h>
+#undef DEBUG
+#define DEBUG(level, params) /*nothing*/
+#endif
+
+MODULE_ID("$Id: comp_hash.c,v 1.21 1999/06/26 21:25:11 tom Exp $")
+
+static int hash_function(const char *);
+
+/*
+ * _nc_make_hash_table()
+ *
+ * Takes the entries in table[] and hashes them into hash_table[]
+ * by name. There are CAPTABSIZE entries in table[] and HASHTABSIZE
+ * slots in hash_table[].
+ *
+ */
+
+#ifdef MAIN_PROGRAM
+
+#undef MODULE_ID
+#define MODULE_ID(id) /*nothing*/
+#include <tinfo/doalloc.c>
+
+static void _nc_make_hash_table(struct name_table_entry *table,
+ struct name_table_entry **hash_table)
+{
+int i;
+int hashvalue;
+int collisions = 0;
+
+ for (i = 0; i < CAPTABSIZE; i++) {
+ hashvalue = hash_function(table[i].nte_name);
+
+ if (hash_table[hashvalue] != (struct name_table_entry *) 0)
+ collisions++;
+
+ if (hash_table[hashvalue] != 0)
+ table[i].nte_link = (short)(hash_table[hashvalue] - table);
+ hash_table[hashvalue] = &table[i];
+ }
+
+ DEBUG(4, ("Hash table complete: %d collisions out of %d entries", collisions, CAPTABSIZE));
+}
+#endif
+
+
+/*
+ * int hash_function(string)
+ *
+ * Computes the hashing function on the given string.
+ *
+ * The current hash function is the sum of each consectutive pair
+ * of characters, taken as two-byte integers, mod Hashtabsize.
+ *
+ */
+
+static
+int
+hash_function(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 (int)(sum % HASHTABSIZE);
+}
+
+
+/*
+ * struct name_table_entry *
+ * find_entry(string)
+ *
+ * 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.
+ *
+ */
+
+#ifndef MAIN_PROGRAM
+struct name_table_entry const *
+_nc_find_entry(const char *string, const struct name_table_entry *const *hash_table)
+{
+int hashvalue;
+struct name_table_entry const *ptr;
+
+ hashvalue = hash_function(string);
+
+ if ((ptr = hash_table[hashvalue]) != 0) {
+ while (strcmp(ptr->nte_name, string) != 0) {
+ if (ptr->nte_link < 0)
+ return 0;
+ ptr = ptr->nte_link + hash_table[HASHTABSIZE];
+ }
+ }
+
+ return (ptr);
+}
+
+/*
+ * struct name_table_entry *
+ * find_type_entry(string, type, table)
+ *
+ * Finds the first entry for the given name with the given type in the
+ * given table if present (as distinct from find_entry, which finds the
+ * the last entry regardless of type). You can use this if you detect
+ * a name clash. It's slower, though. Returns a pointer to the entry
+ * in the table or 0 if not found.
+ */
+
+struct name_table_entry const *
+_nc_find_type_entry(const char *string,
+ int type,
+ const struct name_table_entry *table)
+{
+struct name_table_entry const *ptr;
+
+ for (ptr = table; ptr < table + CAPTABSIZE; ptr++) {
+ if (ptr->nte_type == type && strcmp(string, ptr->nte_name) == 0)
+ return(ptr);
+ }
+
+ return ((struct name_table_entry *)NULL);
+}
+#endif
+
+#ifdef MAIN_PROGRAM
+/*
+ * 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 char **parse_columns(char *buffer)
+{
+ static char **list;
+
+ int col = 0;
+
+ if (list == 0 && (list = typeCalloc(char *, MAX_COLUMNS)) == 0)
+ return(0);
+
+ if (*buffer != '#') {
+ while (*buffer != '\0') {
+ char *s;
+ for (s = buffer; (*s != '\0') && !isspace(*s); s++)
+ /*EMPTY*/;
+ if (s != buffer) {
+ char mark = *s;
+ *s = '\0';
+ if ((s - buffer) > 1
+ && (*buffer == '"')
+ && (s[-1] == '"')) { /* strip the quotes */
+ buffer++;
+ s[-1] = '\0';
+ }
+ list[col] = buffer;
+ col++;
+ if (mark == '\0')
+ break;
+ while (*++s && isspace(*s))
+ /*EMPTY*/;
+ buffer = s;
+ } else
+ break;
+ }
+ }
+ return col ? list : 0;
+}
+
+int main(int argc, char **argv)
+{
+ struct name_table_entry *name_table = typeCalloc(struct name_table_entry, CAPTABSIZE);
+ struct name_table_entry **hash_table = typeCalloc(struct name_table_entry *, HASHTABSIZE);
+ const char *root_name = "";
+ int column = 0;
+ int n;
+ char buffer[BUFSIZ];
+
+ static const char * typenames[] = { "BOOLEAN", "NUMBER", "STRING" };
+
+ 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 <= 2
+ || (column = atoi(argv[1])) <= 0
+ || (column >= MAX_COLUMNS)
+ || *(root_name = argv[2]) == 0) {
+ fprintf(stderr, "usage: make_hash column root_name\n");
+ exit(EXIT_FAILURE);
+ }
+
+ /*
+ * Read the table into our arrays.
+ */
+ for (n = 0; (n < CAPTABSIZE) && fgets(buffer, BUFSIZ, stdin); ) {
+ char **list, *nlp = strchr(buffer, '\n');
+ if (nlp)
+ *nlp = '\0';
+ list = parse_columns(buffer);
+ if (list == 0) /* blank or comment */
+ continue;
+ name_table[n].nte_link = -1; /* end-of-hash */
+ name_table[n].nte_name = strdup(list[column]);
+ if (!strcmp(list[2], "bool")) {
+ name_table[n].nte_type = BOOLEAN;
+ name_table[n].nte_index = BoolCount++;
+ } else if (!strcmp(list[2], "num")) {
+ name_table[n].nte_type = NUMBER;
+ name_table[n].nte_index = NumCount++;
+ } else if (!strcmp(list[2], "str")) {
+ name_table[n].nte_type = STRING;
+ name_table[n].nte_index = StrCount++;
+ } else {
+ fprintf(stderr, "Unknown type: %s\n", list[2]);
+ exit(EXIT_FAILURE);
+ }
+ n++;
+ }
+ _nc_make_hash_table(name_table, hash_table);
+
+ /*
+ * Write the compiled tables to standard output
+ */
+ printf("static struct name_table_entry const _nc_%s_table[] =\n",
+ root_name);
+ printf("{\n");
+ for (n = 0; n < CAPTABSIZE; n++) {
+ sprintf(buffer, "\"%s\"",
+ name_table[n].nte_name);
+ printf("\t{ %15s,\t%10s,\t%3d, %3d }%c\n",
+ buffer,
+ typenames[name_table[n].nte_type],
+ name_table[n].nte_index,
+ name_table[n].nte_link,
+ n < CAPTABSIZE - 1 ? ',' : ' ');
+ }
+ printf("};\n\n");
+
+ printf("const struct name_table_entry * const _nc_%s_hash_table[%d] =\n",
+ root_name,
+ HASHTABSIZE+1);
+ printf("{\n");
+ for (n = 0; n < HASHTABSIZE; n++) {
+ if (hash_table[n] != 0) {
+ sprintf(buffer, "_nc_%s_table + %3ld",
+ root_name,
+ (long) (hash_table[n] - name_table));
+ } else {
+ strcpy(buffer, "0");
+ }
+ printf("\t%s,\n", buffer);
+ }
+ printf("\t_nc_%s_table\t/* base-of-table */\n", root_name);
+ printf("};\n\n");
+
+ 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");
+
+ return EXIT_SUCCESS;
+}
+#endif
diff --git a/contrib/ncurses/ncurses/tinfo/comp_parse.c b/contrib/ncurses/ncurses/tinfo/comp_parse.c
new file mode 100644
index 000000000000..be419ca3e790
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/comp_parse.c
@@ -0,0 +1,490 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+ * comp_parse.c -- parser driver loop and use handling.
+ *
+ * _nc_read_entry_source(FILE *, literal, bool, bool (*hook)())
+ * _nc_resolve_uses(void)
+ * _nc_free_entries(void)
+ *
+ * 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_uses(). To free the list
+ * storage, do _nc_free_entries().
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+#include <tic.h>
+#include <term_entry.h>
+
+MODULE_ID("$Id: comp_parse.c,v 1.34 1999/02/27 22:13:02 tom Exp $")
+
+static void sanity_check(TERMTYPE *);
+void (*_nc_check_termtype)(TERMTYPE *) = sanity_check;
+
+/****************************************************************************
+ *
+ * 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
+ */
+
+ENTRY *_nc_head, *_nc_tail;
+
+static void enqueue(ENTRY *ep)
+/* add an entry to the in-core list */
+{
+ ENTRY *newp = _nc_copy_entry(ep);
+
+ if (newp == NULL)
+ _nc_err_abort("Out of memory");
+
+ newp->last = _nc_tail;
+ _nc_tail = newp;
+
+ newp->next = (ENTRY *)NULL;
+ if (newp->last)
+ newp->last->next = newp;
+}
+
+void _nc_free_entries(ENTRY *head)
+/* free the allocated storage consumed by list entries */
+{
+ ENTRY *ep, *next;
+
+ for (ep = head; ep; ep = next)
+ {
+ /*
+ * This conditional lets us disconnect storage from the list.
+ * To do this, copy an entry out of the list, then null out
+ * the string-table member in the original and any use entries
+ * it references.
+ */
+ FreeIfNeeded(ep->tterm.str_table);
+
+ next = ep->next;
+
+ free(ep);
+ if (ep == _nc_head) _nc_head = 0;
+ if (ep == _nc_tail) _nc_tail = 0;
+ }
+}
+
+bool _nc_entry_match(char *n1, char *n2)
+/* do any of the aliases in a pair of terminal names match? */
+{
+ char *pstart, *qstart, *pend, *qend;
+ char nc1[MAX_NAME_SIZE+1], nc2[MAX_NAME_SIZE+1];
+
+ if (strchr(n1, '|') == NULL)
+ {
+ (void) strncpy(nc1, n1, sizeof(nc1) - 2);
+ nc1[sizeof(nc1) - 2] = '\0';
+ (void) strcat(nc1, "|");
+ n1 = nc1;
+ }
+
+ if (strchr(n2, '|') == NULL)
+ {
+ (void) strncpy(nc2, n2, sizeof(nc2) - 2);
+ nc2[sizeof(nc2) - 2] = '\0';
+ (void) strcat(nc2, "|");
+ n2 = nc2;
+ }
+
+ 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)
+ return(TRUE);
+
+ return(FALSE);
+}
+
+/****************************************************************************
+ *
+ * Entry compiler and resolution logic
+ *
+ ****************************************************************************/
+
+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;
+
+ if (silent)
+ _nc_suppress_warnings = TRUE; /* shut the lexer up, too */
+
+ memset(&thisentry, 0, sizeof(thisentry));
+ for (_nc_reset_input(fp, buf); _nc_parse_entry(&thisentry, literal, silent) != ERR; )
+ {
+ if (!isalnum(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, so as to avoid chewing up a lot of
+ * core when the resolution code could fetch entries off disk.
+ */
+ if (hook != NULLHOOK && (*hook)(&thisentry))
+ immediate++;
+ else
+ enqueue(&thisentry);
+ }
+
+ if (_nc_tail)
+ {
+ /* set up the head pointer */
+ for (_nc_head = _nc_tail; _nc_head->last; _nc_head = _nc_head->last)
+ continue;
+
+ DEBUG(1, ("head = %s", _nc_head->tterm.term_names));
+ DEBUG(1, ("tail = %s", _nc_tail->tterm.term_names));
+ }
+#ifdef TRACE
+ else if (!immediate)
+ DEBUG(1, ("no entries parsed"));
+#endif
+
+ _nc_suppress_warnings = oldsuppress;
+}
+
+int _nc_resolve_uses(void)
+/* try to resolve all use capabilities */
+{
+ ENTRY *qp, *rp, *lastread = NULL;
+ bool keepgoing;
+ int i, j, unresolved, total_unresolved, multiples;
+
+ DEBUG(2, ("RESOLUTION BEGINNING"));
+
+ /*
+ * Check for multiple occurrences of the same name.
+ */
+ multiples = 0;
+ for_entry_list(qp)
+ {
+ int matchcount = 0;
+
+ for_entry_list(rp)
+ if (qp > rp
+ && _nc_entry_match(qp->tterm.term_names, rp->tterm.term_names))
+ {
+ matchcount++;
+ if (matchcount == 1)
+ {
+ (void) fprintf(stderr, "Name collision between %s",
+ _nc_first_name(qp->tterm.term_names));
+ multiples++;
+ }
+ if (matchcount >= 1)
+ (void) fprintf(stderr, " %s", _nc_first_name(rp->tterm.term_names));
+ }
+ if (matchcount >= 1)
+ (void) putc('\n', stderr);
+ }
+ if (multiples > 0)
+ return(FALSE);
+
+ DEBUG(2, ("NO MULTIPLE NAME OCCURRENCES"));
+
+ /*
+ * First resolution stage: replace names in use arrays with entry
+ * pointers. By doing this, we avoid having to do the same name
+ * match once for each time a use entry is itself unresolved.
+ */
+ 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 = (char *)(qp->uses[i].parent);
+ long lookline = qp->uses[i].line;
+
+ 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 (in core)",
+ child, lookfor));
+
+ qp->uses[i].parent = rp;
+ foundit = TRUE;
+ }
+
+ /* if that didn't work, try to merge in a compiled entry */
+ if (!foundit)
+ {
+ TERMTYPE thisterm;
+ char filename[PATH_MAX];
+
+ memset(&thisterm, 0, sizeof(thisterm));
+ if (_nc_read_entry(lookfor, filename, &thisterm) == 1)
+ {
+ DEBUG(2, ("%s: resolving use=%s (compiled)",
+ child, lookfor));
+
+ rp = typeMalloc(ENTRY,1);
+ if (rp == NULL)
+ _nc_err_abort("Out of memory");
+ rp->tterm = thisterm;
+ rp->nuses = 0;
+ rp->next = lastread;
+ lastread = rp;
+
+ qp->uses[i].parent = rp;
+ foundit = TRUE;
+ }
+ }
+
+ /* no good, mark this one unresolvable and complain */
+ if (!foundit)
+ {
+ unresolved++;
+ total_unresolved++;
+
+ _nc_curr_line = lookline;
+ _nc_warning("resolution of use=%s failed", lookfor);
+ qp->uses[i].parent = (ENTRY *)NULL;
+ }
+ }
+ }
+ if (total_unresolved)
+ {
+ /* free entries read in off disk */
+ _nc_free_entries(lastread);
+ return(FALSE);
+ }
+
+ DEBUG(2, ("NAME RESOLUTION COMPLETED OK"));
+
+ /*
+ * OK, at this point all (char *) references have been successfully
+ * replaced by (ENTRY *) pointers. Time to do the actual merges.
+ */
+ do {
+ TERMTYPE merged;
+
+ keepgoing = FALSE;
+
+ for_entry_list(qp)
+ {
+ if (qp->nuses > 0)
+ {
+ DEBUG(2, ("%s: attempting merge", _nc_first_name(qp->tterm.term_names)));
+ /*
+ * 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 (((ENTRY *)qp->uses[i].parent)->nuses)
+ {
+ DEBUG(2, ("%s: use entry %d unresolved",
+ _nc_first_name(qp->tterm.term_names), i));
+ goto incomplete;
+ }
+
+ /*
+ * First, make sure there's no garbage in the merge block.
+ * as a side effect, copy into the merged entry the name
+ * field and string table pointer.
+ */
+ _nc_copy_termtype(&merged, &(qp->tterm));
+
+ /*
+ * Now merge in each use entry in the proper
+ * (reverse) order.
+ */
+ for (; qp->nuses; qp->nuses--)
+ _nc_merge_entry(&merged,
+ &((ENTRY *)qp->uses[qp->nuses-1].parent)->tterm);
+
+ /*
+ * Now merge in the original entry.
+ */
+ _nc_merge_entry(&merged, &qp->tterm);
+
+ /*
+ * Replace the original entry with the merged one.
+ */
+ FreeIfNeeded(qp->tterm.Booleans);
+ FreeIfNeeded(qp->tterm.Numbers);
+ FreeIfNeeded(qp->tterm.Strings);
+ qp->tterm = merged;
+
+ /*
+ * 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"));
+
+ /*
+ * The exit condition of the loop above is such that all entries
+ * must now be resolved. Now handle cancellations. In a resolved
+ * entry there should be no cancellation markers.
+ */
+ for_entry_list(qp)
+ {
+ for_each_boolean(j, &(qp->tterm))
+ if (qp->tterm.Booleans[j] == CANCELLED_BOOLEAN)
+ qp->tterm.Booleans[j] = FALSE;
+ for_each_number(j, &(qp->tterm))
+ if (qp->tterm.Numbers[j] == CANCELLED_NUMERIC)
+ qp->tterm.Numbers[j] = ABSENT_NUMERIC;
+ for_each_string(j, &(qp->tterm))
+ if (qp->tterm.Strings[j] == CANCELLED_STRING)
+ qp->tterm.Strings[j] = ABSENT_STRING;
+ }
+
+ /*
+ * We'd like to free entries read in off disk at this point, but can't.
+ * The merge_entry() code doesn't copy the strings in the use entries,
+ * it just aliases them. If this ever changes, do a
+ * free_entries(lastread) here.
+ */
+
+ DEBUG(2, ("RESOLUTION FINISHED"));
+
+ if (_nc_check_termtype != 0)
+ {
+ _nc_curr_col = -1;
+ for_entry_list(qp)
+ {
+ _nc_curr_line = qp->startline;
+ _nc_set_type(_nc_first_name(qp->tterm.term_names));
+ _nc_check_termtype(&qp->tterm);
+ }
+ DEBUG(2, ("SANITY CHECK FINISHED"));
+ }
+
+ 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 sanity_check(TERMTYPE *tp)
+{
+ 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)
+ }
+
+ /* listed in structure-member order of first argument */
+ PAIRED(enter_alt_charset_mode, exit_alt_charset_mode)
+ ANDMISSING(enter_alt_charset_mode, acs_chars)
+ ANDMISSING(exit_alt_charset_mode, acs_chars)
+ 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)
+ PAIRED(display_clock, remove_clock)
+ ANDMISSING(set_color_pair, initialize_pair)
+}
diff --git a/contrib/ncurses/ncurses/tinfo/comp_scan.c b/contrib/ncurses/ncurses/tinfo/comp_scan.c
new file mode 100644
index 000000000000..152930885ab7
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/comp_scan.c
@@ -0,0 +1,756 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * 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.34 1998/11/01 00:56:39 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')
+
+int _nc_syntax; /* termcap or terminfo? */
+long _nc_curr_file_pos; /* file offset of current line */
+long _nc_comment_start; /* start of comment range before name */
+long _nc_comment_end; /* end of comment range before name */
+long _nc_start_line; /* start line of current entry */
+
+/*****************************************************************************
+ *
+ * Token-grabbing machinery
+ *
+ *****************************************************************************/
+
+static bool first_column; /* See 'next_char()' below */
+static char separator; /* capability separator */
+static int pushtype; /* type of pushback token */
+static char pushname[MAX_NAME_SIZE+1];
+
+static int last_char(void);
+static int next_char(void);
+static long stream_pos(void);
+static bool end_of_stream(void);
+static void push_back(char c);
+
+/* Assume we may be looking at a termcap-style continuation */
+static inline int eat_escaped_newline(int ch)
+{
+ if (ch == '\\')
+ while ((ch = next_char()) == '\n' || iswhite(ch))
+ continue;
+ return ch;
+}
+
+/*
+ * 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.
+ *
+ */
+
+int _nc_get_token(void)
+{
+static const char terminfo_punct[] = "@%&*!#";
+long number;
+int type;
+int ch;
+char * numchk;
+char numbuf[80];
+unsigned found;
+static char buffer[MAX_ENTRY_SIZE];
+char *ptr;
+int dot_flag = FALSE;
+long token_start;
+
+ if (pushtype != NO_PUSHBACK)
+ {
+ int retval = pushtype;
+
+ _nc_set_type(pushname);
+ DEBUG(3, ("pushed-back token: `%s', class %d",
+ _nc_curr_token.tk_name, pushtype));
+
+ pushtype = NO_PUSHBACK;
+ pushname[0] = '\0';
+
+ /* currtok wasn't altered by _nc_push_token() */
+ return(retval);
+ }
+
+ if (end_of_stream())
+ return(EOF);
+
+start_token:
+ token_start = stream_pos();
+ while ((ch = next_char()) == '\n' || iswhite(ch))
+ continue;
+
+ ch = eat_escaped_newline(ch);
+
+ if (ch == EOF)
+ type = EOF;
+ else {
+ /* if this is a termcap entry, skip a leading separator */
+ if (separator == ':' && ch == ':')
+ ch = next_char();
+
+ if (ch == '.') {
+ 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(ch) && !strchr(terminfo_punct, (char)ch)) {
+ _nc_warning("Illegal character (expected alphanumeric or %s) - %s",
+ terminfo_punct, _tracechar((chtype)ch));
+ _nc_panic_mode(separator);
+ goto start_token;
+ }
+
+ ptr = buffer;
+ *(ptr++) = ch;
+
+ if (first_column) {
+ char *desc;
+
+ _nc_comment_start = token_start;
+ _nc_comment_end = _nc_curr_file_pos;
+ _nc_start_line = _nc_curr_line;
+
+ _nc_syntax = ERR;
+ while ((ch = next_char()) != '\n')
+ {
+ if (ch == EOF)
+ _nc_err_abort("premature EOF");
+ else if (ch == ':' && last_char() != ',')
+ {
+ _nc_syntax = SYN_TERMCAP;
+ separator = ':';
+ break;
+ }
+ else if (ch == ',')
+ {
+ _nc_syntax = SYN_TERMINFO;
+ separator = ',';
+ /*
+ * Fall-through here is not an accident.
+ * The idea is that if we see a comma, we
+ * figure this is terminfo unless we
+ * subsequently run into a colon -- but
+ * we don't stop looking for that colon until
+ * hitting a newline. This allows commas to
+ * be embedded in description fields of
+ * either syntax.
+ */
+ /* FALLTHRU */
+ }
+ else
+ ch = eat_escaped_newline(ch);
+
+ *ptr++ = ch;
+ }
+ ptr[0] = '\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's termcap syntax.
+ */
+ _nc_syntax = SYN_TERMCAP;
+ separator = ':';
+ }
+ else if (_nc_syntax == SYN_TERMINFO)
+ {
+ /* throw away trailing /, *$/ */
+ for (--ptr; iswhite(*ptr) || *ptr == ','; ptr--)
+ continue;
+ ptr[1] = '\0';
+ }
+
+ /*
+ * This is the soonest we have the terminal name
+ * fetched. Set up for following warning messages.
+ */
+ ptr = strchr(buffer, '|');
+ if (ptr == (char *)NULL)
+ ptr = buffer + strlen(buffer);
+ ch = *ptr;
+ *ptr = '\0';
+ _nc_set_type(buffer);
+ *ptr = ch;
+
+ /*
+ * Compute the boundary between the aliases and the
+ * description field for syntax-checking purposes.
+ */
+ desc = strrchr(buffer, '|');
+ if (desc) {
+ if (*desc == '\0')
+ _nc_warning("empty longname field");
+ else if (strchr(desc, ' ') == (char *)NULL)
+ _nc_warning("older tic versions may treat the description field as an alias");
+ }
+ if (!desc)
+ desc = buffer + strlen(buffer);
+
+ /*
+ * 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 (ptr = buffer; ptr < desc; ptr++)
+ {
+ if (isspace(*ptr))
+ {
+ _nc_warning("whitespace in name or alias field");
+ break;
+ }
+ else if (*ptr == '/')
+ {
+ _nc_warning("slashes aren't allowed in names or aliases");
+ break;
+ }
+ else if (strchr("$[]!*?", *ptr))
+ {
+ _nc_warning("dubious character `%c' in name or alias field", *ptr);
+ break;
+ }
+ }
+
+ ptr = buffer;
+
+ _nc_curr_token.tk_name = buffer;
+ type = NAMES;
+ } else {
+ while ((ch = next_char()) != EOF) {
+ if (!isalnum(ch)) {
+ if (_nc_syntax == SYN_TERMINFO) {
+ if (ch != '_')
+ break;
+ } else { /* allow ';' for "k;" */
+ if (ch != ';')
+ break;
+ }
+ }
+ *(ptr++) = ch;
+ }
+
+ *ptr++ = '\0';
+ switch (ch) {
+ case ',':
+ case ':':
+ if (ch != separator)
+ _nc_err_abort("Separator inconsistent with syntax");
+ _nc_curr_token.tk_name = buffer;
+ type = BOOLEAN;
+ break;
+ case '@':
+ if ((ch = next_char()) != separator)
+ _nc_warning("Missing separator after `%s', have %s",
+ buffer, _tracechar((chtype)ch));
+ _nc_curr_token.tk_name = buffer;
+ type = CANCEL;
+ break;
+
+ case '#':
+ found = 0;
+ while (isalnum(ch = next_char())) {
+ numbuf[found++] = ch;
+ if (found >= sizeof(numbuf)-1)
+ break;
+ }
+ numbuf[found] = '\0';
+ number = strtol(numbuf, &numchk, 0);
+ if (numchk == numbuf)
+ _nc_warning("no value given for `%s'", buffer);
+ if ((*numchk != '\0') || (ch != separator))
+ _nc_warning("Missing separator");
+ _nc_curr_token.tk_name = buffer;
+ _nc_curr_token.tk_valnumber = number;
+ type = NUMBER;
+ break;
+
+ case '=':
+ ch = _nc_trans_string(ptr);
+ if (ch != separator)
+ _nc_warning("Missing separator");
+ _nc_curr_token.tk_name = buffer;
+ _nc_curr_token.tk_valstring = ptr;
+ type = STRING;
+ break;
+
+ case EOF:
+ type = EOF;
+ break;
+ default:
+ /* just to get rid of the compiler warning */
+ type = UNDEF;
+ _nc_warning("Illegal character - %s",
+ _tracechar((chtype)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 & TRACE_IEVENT)
+ {
+ fprintf(stderr, "Token: ");
+ switch (type)
+ {
+ case BOOLEAN:
+ fprintf(stderr, "Boolean; name='%s'\n",
+ _nc_curr_token.tk_name);
+ break;
+
+ case NUMBER:
+ fprintf(stderr, "Number; name='%s', value=%d\n",
+ _nc_curr_token.tk_name,
+ _nc_curr_token.tk_valnumber);
+ break;
+
+ case STRING:
+ fprintf(stderr, "String; name='%s', value=%s\n",
+ _nc_curr_token.tk_name,
+ _nc_visbuf(_nc_curr_token.tk_valstring));
+ break;
+
+ case CANCEL:
+ fprintf(stderr, "Cancel; name='%s'\n",
+ _nc_curr_token.tk_name);
+ break;
+
+ case NAMES:
+
+ fprintf(stderr, "Names; value='%s'\n",
+ _nc_curr_token.tk_name);
+ break;
+
+ case EOF:
+ fprintf(stderr, "End of file\n");
+ break;
+
+ default:
+ _nc_warning("Bad token type");
+ }
+ }
+#endif
+
+ if (dot_flag == TRUE) /* if commented out, use the next one */
+ type = _nc_get_token();
+
+ DEBUG(3, ("token: `%s', class %d", _nc_curr_token.tk_name, 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
+ *
+ */
+
+char
+_nc_trans_string(char *ptr)
+{
+int count = 0;
+int number;
+int i, c;
+chtype ch, last_ch = '\0';
+bool ignored = FALSE;
+
+ while ((ch = c = next_char()) != (chtype)separator && c != EOF) {
+ if ((_nc_syntax == SYN_TERMCAP) && c == '\n')
+ break;
+ if (ch == '^' && last_ch != '%') {
+ ch = c = next_char();
+ if (c == EOF)
+ _nc_err_abort("Premature EOF");
+
+ if (! (is7bits(ch) && isprint(ch))) {
+ _nc_warning("Illegal ^ character - %s",
+ _tracechar((unsigned char)ch));
+ }
+ if (ch == '?') {
+ *(ptr++) = '\177';
+ } else {
+ if ((ch &= 037) == 0)
+ ch = 128;
+ *(ptr++) = (char)(ch);
+ }
+ }
+ else if (ch == '\\') {
+ ch = c = next_char();
+ if (c == EOF)
+ _nc_err_abort("Premature EOF");
+
+ if (ch >= '0' && ch <= '7') {
+ number = ch - '0';
+ for (i=0; i < 2; i++) {
+ ch = c = next_char();
+ if (c == EOF)
+ _nc_err_abort("Premature EOF");
+
+ if (c < '0' || c > '7') {
+ if (isdigit(c)) {
+ _nc_warning("Non-octal digit `%c' in \\ sequence", c);
+ /* allow the digit; it'll do less harm */
+ } else {
+ push_back((char)c);
+ break;
+ }
+ }
+
+ number = number * 8 + c - '0';
+ }
+
+ if (number == 0)
+ number = 0200;
+ *(ptr++) = (char) number;
+ } else {
+ switch (c) {
+ case 'E':
+ case 'e': *(ptr++) = '\033'; break;
+
+ case 'a': *(ptr++) = '\007'; break;
+
+ case 'l':
+ case 'n': *(ptr++) = '\n'; break;
+
+ case 'r': *(ptr++) = '\r'; break;
+
+ case 'b': *(ptr++) = '\010'; break;
+
+ case 's': *(ptr++) = ' '; break;
+
+ case 'f': *(ptr++) = '\014'; break;
+
+ case 't': *(ptr++) = '\t'; break;
+
+ case '\\': *(ptr++) = '\\'; break;
+
+ case '^': *(ptr++) = '^'; break;
+
+ case ',': *(ptr++) = ','; break;
+
+ case ':': *(ptr++) = ':'; break;
+
+ case '\n':
+ continue;
+
+ default:
+ _nc_warning("Illegal character %s in \\ sequence",
+ _tracechar((unsigned char)ch));
+ *(ptr++) = (char)ch;
+ } /* endswitch (ch) */
+ } /* endelse (ch < '0' || ch > '7') */
+ } /* end else if (ch == '\\') */
+ else if (ch == '\n' && (_nc_syntax == SYN_TERMINFO)) {
+ /* newlines embedded in a terminfo string are ignored */
+ ignored = TRUE;
+ } else {
+ *(ptr++) = (char)ch;
+ }
+
+ if (!ignored) {
+ last_ch = ch;
+ count ++;
+ }
+ ignored = FALSE;
+
+ if (count > MAXCAPLEN)
+ _nc_warning("Very long string found. Missing separator?");
+ } /* end while */
+
+ *ptr = '\0';
+
+ return(ch);
+}
+
+/*
+ * _nc_push_token()
+ *
+ * Push a token of given type so that it will be reread by the next
+ * get_token() call.
+ */
+
+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 curr_tok is static storage that nothing
+ * but get_token() touches.
+ */
+ pushtype = tokclass;
+ _nc_get_type(pushname);
+
+ DEBUG(3, ("pushing token: `%s', class %d",
+ _nc_curr_token.tk_name, pushtype));
+}
+
+/*
+ * Panic mode error recovery - skip everything until a "ch" is found.
+ */
+void _nc_panic_mode(char ch)
+{
+ int c;
+
+ for (;;) {
+ c = next_char();
+ if (c == ch)
+ return;
+ if (c == EOF)
+ return;
+ }
+}
+
+/*****************************************************************************
+ *
+ * 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.
+ */
+
+void _nc_reset_input(FILE *fp, char *buf)
+{
+ pushtype = NO_PUSHBACK;
+ pushname[0] = '\0';
+ yyin = fp;
+ bufstart = bufptr = buf;
+ _nc_curr_file_pos = 0L;
+ if (fp != 0)
+ _nc_curr_line = 0;
+ _nc_curr_col = 0;
+}
+
+/*
+ * int last_char()
+ *
+ * Returns the final nonblank character on the current input buffer
+ */
+static int
+last_char(void)
+{
+ size_t len = strlen(bufptr);
+ while (len--) {
+ if (!isspace(bufptr[len]))
+ return bufptr[len];
+ }
+ return 0;
+}
+
+/*
+ * 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)
+{
+ if (!yyin)
+ {
+ if (*bufptr == '\0')
+ return(EOF);
+ if (*bufptr == '\n') {
+ _nc_curr_line++;
+ _nc_curr_col = 0;
+ }
+ }
+ 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.
+ */
+ static char line[LEXBUFSIZ];
+ size_t len;
+
+ do {
+ _nc_curr_file_pos = ftell(yyin);
+
+ if ((bufstart = fgets(line, LEXBUFSIZ, yyin)) != NULL) {
+ _nc_curr_line++;
+ _nc_curr_col = 0;
+ }
+ bufptr = bufstart;
+ } while
+ (bufstart != NULL && line[0] == '#');
+
+ if (bufstart == NULL)
+ return (EOF);
+
+ while (iswhite(*bufptr))
+ 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') {
+ bufptr[len-2] = '\n';
+ bufptr[len-1] = '\0';
+ }
+ }
+ }
+
+ first_column = (bufptr == bufstart);
+
+ _nc_curr_col++;
+ return(*bufptr++);
+}
+
+static void push_back(char c)
+/* push a character back onto the input stream */
+{
+ if (bufptr == bufstart)
+ _nc_syserr_abort("Can't backspace off beginning of line");
+ *--bufptr = c;
+}
+
+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 && *bufptr == '\0'))
+ ? TRUE : FALSE);
+}
+
+/* comp_scan.c ends here */
diff --git a/contrib/ncurses/ncurses/tinfo/doalloc.c b/contrib/ncurses/ncurses/tinfo/doalloc.c
new file mode 100644
index 000000000000..84471fb6b20c
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/doalloc.c
@@ -0,0 +1,74 @@
+/****************************************************************************
+ * Copyright (c) 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 *
+ ****************************************************************************/
+
+
+/*
+ * 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.5 1999/03/14 12:25:27 tom Exp $")
+
+void *_nc_doalloc(void *oldp, size_t amount)
+{
+ void *newp;
+
+ if (oldp != 0) {
+ if ((newp = realloc(oldp, amount)) == 0) {
+ free(oldp);
+ errno = ENOMEM; /* just in case 'free' reset */
+ }
+ } else {
+ newp = typeMalloc(char, amount);
+ }
+ return newp;
+}
+
+#if !HAVE_STRDUP
+char *_nc_strdup(const char *src)
+{
+ char *dst;
+ if (src != 0) {
+ dst = typeMalloc(char, strlen(src) + 1);
+ if (dst != 0) {
+ (void)strcpy(dst, src);
+ }
+ } else {
+ dst = 0;
+ }
+ return dst;
+}
+#endif
diff --git a/contrib/ncurses/ncurses/tinfo/free_ttype.c b/contrib/ncurses/ncurses/tinfo/free_ttype.c
new file mode 100644
index 000000000000..203ec89ed359
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/free_ttype.c
@@ -0,0 +1,72 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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 *
+ ****************************************************************************/
+
+
+/*
+ * free_ttype.c -- allocation functions for TERMTYPE
+ *
+ * _nc_free_termtype()
+ * use_extended_names()
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <tic.h>
+#include <term_entry.h>
+
+MODULE_ID("$Id: free_ttype.c,v 1.2 1999/03/01 00:30:35 tom Exp $")
+
+void _nc_free_termtype(TERMTYPE *ptr)
+{
+ FreeIfNeeded(ptr->str_table);
+ FreeIfNeeded(ptr->term_names);
+#if NCURSES_XNAMES
+ FreeIfNeeded(ptr->ext_str_table);
+ FreeIfNeeded(ptr->Booleans);
+ FreeIfNeeded(ptr->Numbers);
+ FreeIfNeeded(ptr->Strings);
+ FreeIfNeeded(ptr->ext_Names);
+#endif
+ memset(ptr, 0, sizeof(TERMTYPE));
+}
+
+#if NCURSES_XNAMES
+bool _nc_user_definable = TRUE;
+
+int use_extended_names(bool flag)
+{
+ int oldflag = _nc_user_definable;
+ _nc_user_definable = flag;
+ return oldflag;
+}
+#endif
diff --git a/contrib/ncurses/ncurses/tinfo/getenv_num.c b/contrib/ncurses/ncurses/tinfo/getenv_num.c
new file mode 100644
index 000000000000..62944048175a
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/getenv_num.c
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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 *
+ ****************************************************************************/
+
+/*
+ * getenv_num.c -- obtain a number from the environment
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: getenv_num.c,v 1.1 1998/09/19 21:30:23 tom Exp $")
+
+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;
+}
diff --git a/contrib/ncurses/ncurses/tinfo/home_terminfo.c b/contrib/ncurses/ncurses/tinfo/home_terminfo.c
new file mode 100644
index 000000000000..7aa4ca112e5a
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/home_terminfo.c
@@ -0,0 +1,62 @@
+/****************************************************************************
+ * Copyright (c) 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 *
+ ****************************************************************************/
+
+/*
+ * home_terminfo.c -- return the $HOME/.terminfo string, expanded
+ */
+
+#include <curses.priv.h>
+#include <tic.h>
+
+MODULE_ID("$Id: home_terminfo.c,v 1.2 1999/02/27 19:58:46 tom Exp $")
+
+#define my_length (strlen(home) + sizeof(PRIVATE_INFO))
+
+/* ncurses extension...fall back on user's private directory */
+
+char *
+_nc_home_terminfo(void)
+{
+ char *home;
+ static char *temp = 0;
+
+ if (temp == 0) {
+ if ((home = getenv("HOME")) != 0
+ && my_length <= PATH_MAX) {
+ temp = typeMalloc(char, my_length);
+ if (temp == 0)
+ _nc_err_abort("Out of memory");
+ (void) sprintf(temp, PRIVATE_INFO, home);
+ }
+ }
+ return temp;
+}
diff --git a/contrib/ncurses/ncurses/tinfo/init_keytry.c b/contrib/ncurses/ncurses/tinfo/init_keytry.c
new file mode 100644
index 000000000000..77102e5dd197
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/init_keytry.c
@@ -0,0 +1,67 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * 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 <term.h> /* keypad_xmit, keypad_local, meta_on, meta_off */
+ /* cursor_visible,cursor_normal,cursor_invisible */
+#include <tic.h> /* struct tinfo_fkeys */
+
+MODULE_ID("$Id: init_keytry.c,v 1.1 1999/02/18 22:39:11 tom Exp $")
+
+/*
+** _nc_init_keytry()
+**
+** Construct the try for the current terminal's keypad keys.
+**
+*/
+
+/* LINT_PREPRO
+#if 0*/
+#include <init_keytry.h>
+/* LINT_PREPRO
+#endif*/
+
+void _nc_init_keytry(void)
+{
+ size_t n;
+
+ /* 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.
+ */
+
+ for (n = 0; _nc_tinfo_fkeys[n].code; n++)
+ if (_nc_tinfo_fkeys[n].offset < STRCOUNT)
+ _nc_add_to_try(&(SP->_keytry),
+ CUR Strings[_nc_tinfo_fkeys[n].offset],
+ _nc_tinfo_fkeys[n].code);
+#ifdef TRACE
+ _nc_trace_tries(SP->_keytry);
+#endif
+}
diff --git a/contrib/ncurses/ncurses/tinfo/keys.list b/contrib/ncurses/ncurses/tinfo/keys.list
new file mode 100644
index 000000000000..c11300bdcddf
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/keys.list
@@ -0,0 +1,158 @@
+# $Id: keys.list,v 1.5 1997/10/25 21:05:24 tom Exp $
+# The first column is the #define symbol that is in curses.h
+# The second column is the term.h symbol, for terminfo
+# Not all keycodes have corresponding terminfo capabilities.
+KEY_A1 key_a1
+KEY_A3 key_a3
+KEY_B2 key_b2
+KEY_BACKSPACE key_backspace
+KEY_BEG key_beg
+KEY_BREAK
+KEY_BTAB key_btab
+KEY_C1 key_c1
+KEY_C3 key_c3
+KEY_CANCEL key_cancel
+KEY_CATAB key_catab
+KEY_CLEAR key_clear
+KEY_CLOSE key_close
+KEY_COMMAND key_command
+KEY_COPY key_copy
+KEY_CREATE key_create
+KEY_CTAB key_ctab
+KEY_DC key_dc
+KEY_DL key_dl
+KEY_DOWN key_down
+KEY_EIC key_eic
+KEY_END key_end
+KEY_ENTER key_enter
+KEY_EOL key_eol
+KEY_EOS key_eos
+KEY_EXIT key_exit
+KEY_F(0) key_f0
+KEY_F(1) key_f1
+KEY_F(10) key_f10
+KEY_F(11) key_f11
+KEY_F(12) key_f12
+KEY_F(13) key_f13
+KEY_F(14) key_f14
+KEY_F(15) key_f15
+KEY_F(16) key_f16
+KEY_F(17) key_f17
+KEY_F(18) key_f18
+KEY_F(19) key_f19
+KEY_F(2) key_f2
+KEY_F(20) key_f20
+KEY_F(21) key_f21
+KEY_F(22) key_f22
+KEY_F(23) key_f23
+KEY_F(24) key_f24
+KEY_F(25) key_f25
+KEY_F(26) key_f26
+KEY_F(27) key_f27
+KEY_F(28) key_f28
+KEY_F(29) key_f29
+KEY_F(3) key_f3
+KEY_F(30) key_f30
+KEY_F(31) key_f31
+KEY_F(32) key_f32
+KEY_F(33) key_f33
+KEY_F(34) key_f34
+KEY_F(35) key_f35
+KEY_F(36) key_f36
+KEY_F(37) key_f37
+KEY_F(38) key_f38
+KEY_F(39) key_f39
+KEY_F(4) key_f4
+KEY_F(40) key_f40
+KEY_F(41) key_f41
+KEY_F(42) key_f42
+KEY_F(43) key_f43
+KEY_F(44) key_f44
+KEY_F(45) key_f45
+KEY_F(46) key_f46
+KEY_F(47) key_f47
+KEY_F(48) key_f48
+KEY_F(49) key_f49
+KEY_F(5) key_f5
+KEY_F(50) key_f50
+KEY_F(51) key_f51
+KEY_F(52) key_f52
+KEY_F(53) key_f53
+KEY_F(54) key_f54
+KEY_F(55) key_f55
+KEY_F(56) key_f56
+KEY_F(57) key_f57
+KEY_F(58) key_f58
+KEY_F(59) key_f59
+KEY_F(6) key_f6
+KEY_F(60) key_f60
+KEY_F(61) key_f61
+KEY_F(62) key_f62
+KEY_F(63) key_f63
+KEY_F(7) key_f7
+KEY_F(8) key_f8
+KEY_F(9) key_f9
+KEY_FIND key_find
+KEY_HELP key_help
+KEY_HOME key_home
+KEY_IC key_ic
+KEY_IL key_il
+KEY_LEFT key_left
+KEY_LL key_ll
+KEY_MARK key_mark
+KEY_MESSAGE key_message
+KEY_MOUSE key_mouse
+KEY_MOVE key_move
+KEY_NEXT key_next
+KEY_NPAGE key_npage
+KEY_OPEN key_open
+KEY_OPTIONS key_options
+KEY_PPAGE key_ppage
+KEY_PREVIOUS key_previous
+KEY_PRINT key_print
+KEY_REDO key_redo
+KEY_REFERENCE key_reference
+KEY_REFRESH key_refresh
+KEY_REPLACE key_replace
+KEY_RESET
+KEY_RESIZE
+KEY_RESTART key_restart
+KEY_RESUME key_resume
+KEY_RIGHT key_right
+KEY_SAVE key_save
+KEY_SBEG key_sbeg
+KEY_SCANCEL key_scancel
+KEY_SCOMMAND key_scommand
+KEY_SCOPY key_scopy
+KEY_SCREATE key_screate
+KEY_SDC key_sdc
+KEY_SDL key_sdl
+KEY_SELECT key_select
+KEY_SEND key_send
+KEY_SEOL key_seol
+KEY_SEXIT key_sexit
+KEY_SF key_sf
+KEY_SFIND key_sfind
+KEY_SHELP key_shelp
+KEY_SHOME key_shome
+KEY_SIC key_sic
+KEY_SLEFT key_sleft
+KEY_SMESSAGE key_smessage
+KEY_SMOVE key_smove
+KEY_SNEXT key_snext
+KEY_SOPTIONS key_soptions
+KEY_SPREVIOUS key_sprevious
+KEY_SPRINT key_sprint
+KEY_SR key_sr
+KEY_SREDO key_sredo
+KEY_SREPLACE key_sreplace
+KEY_SRESET
+KEY_SRIGHT key_sright
+KEY_SRSUME key_srsume
+KEY_SSAVE key_ssave
+KEY_SSUSPEND key_ssuspend
+KEY_STAB key_stab
+KEY_SUNDO key_sundo
+KEY_SUSPEND key_suspend
+KEY_UNDO key_undo
+KEY_UP key_up
diff --git a/contrib/ncurses/ncurses/tinfo/lib_acs.c b/contrib/ncurses/ncurses/tinfo/lib_acs.c
new file mode 100644
index 000000000000..d3c782e8e664
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_acs.c
@@ -0,0 +1,139 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+#include <curses.priv.h>
+#include <term.h> /* ena_acs, acs_chars */
+
+MODULE_ID("$Id: lib_acs.c,v 1.15 1999/02/18 11:31:43 tom Exp $")
+
+chtype acs_map[ACS_LEN];
+
+void _nc_init_acs(void)
+{
+ T(("initializing ACS map"));
+
+ /*
+ * Initializations for a UNIX-like multi-terminal environment. Use
+ * ASCII chars and count on the terminfo description to do better.
+ */
+ ACS_ULCORNER = '+'; /* should be upper left corner */
+ ACS_LLCORNER = '+'; /* should be lower left corner */
+ ACS_URCORNER = '+'; /* should be upper right corner */
+ ACS_LRCORNER = '+'; /* should be lower right corner */
+ ACS_RTEE = '+'; /* should be tee pointing left */
+ ACS_LTEE = '+'; /* should be tee pointing right */
+ ACS_BTEE = '+'; /* should be tee pointing up */
+ ACS_TTEE = '+'; /* should be tee pointing down */
+ ACS_HLINE = '-'; /* should be horizontal line */
+ ACS_VLINE = '|'; /* should be vertical line */
+ ACS_PLUS = '+'; /* should be large plus or crossover */
+ ACS_S1 = '~'; /* should be scan line 1 */
+ ACS_S9 = '_'; /* should be scan line 9 */
+ ACS_DIAMOND = '+'; /* should be diamond */
+ ACS_CKBOARD = ':'; /* should be checker board (stipple) */
+ ACS_DEGREE = '\''; /* should be degree symbol */
+ ACS_PLMINUS = '#'; /* should be plus/minus */
+ ACS_BULLET = 'o'; /* should be bullet */
+ ACS_LARROW = '<'; /* should be arrow pointing left */
+ ACS_RARROW = '>'; /* should be arrow pointing right */
+ ACS_DARROW = 'v'; /* should be arrow pointing down */
+ ACS_UARROW = '^'; /* should be arrow pointing up */
+ ACS_BOARD = '#'; /* should be board of squares */
+ ACS_LANTERN = '#'; /* should be lantern symbol */
+ ACS_BLOCK = '#'; /* should be solid square block */
+ /* these defaults were invented for ncurses */
+ ACS_S3 = '-'; /* should be scan line 3 */
+ ACS_S7 = '-'; /* should be scan line 7 */
+ ACS_LEQUAL = '<'; /* should be less-than-or-equal-to */
+ ACS_GEQUAL = '>'; /* should be greater-than-or-equal-to */
+ ACS_PI = '*'; /* should be greek pi */
+ ACS_NEQUAL = '!'; /* should be not-equal */
+ ACS_STERLING = 'f'; /* should be pound-sterling symbol */
+
+ if (ena_acs != NULL)
+ {
+ TPUTS_TRACE("ena_acs");
+ putp(ena_acs);
+ }
+
+#define ALTCHAR(c) ((chtype)(((unsigned char)(c)) | A_ALTCHARSET))
+
+ if (acs_chars != NULL) {
+ size_t i = 0;
+ size_t length = strlen(acs_chars);
+
+ while (i < length)
+ switch (acs_chars[i]) {
+ case 'l':case 'm':case 'k':case 'j':
+ case 'u':case 't':case 'v':case 'w':
+ case 'q':case 'x':case 'n':case 'o':
+ case 's':case '`':case 'a':case 'f':
+ case 'g':case '~':case ',':case '+':
+ case '.':case '-':case 'h':case 'i':
+ case '0':case 'p':case 'r':case 'y':
+ case 'z':case '{':case '|':case '}':
+ acs_map[(unsigned int)acs_chars[i]] =
+ ALTCHAR(acs_chars[i+1]);
+ i++;
+ /* FALLTHRU */
+ default:
+ i++;
+ break;
+ }
+ }
+#ifdef TRACE
+ /* Show the equivalent mapping, noting if it does not match the
+ * given attribute, whether by re-ordering or duplication.
+ */
+ if (_nc_tracing & TRACE_CALLS) {
+ size_t n, m;
+ char show[SIZEOF(acs_map) + 1];
+ for (n = 1, m = 0; n < SIZEOF(acs_map); n++) {
+ if (acs_map[n] != 0) {
+ show[m++] = (char)n;
+ show[m++] = TextOf(acs_map[n]);
+ }
+ }
+ show[m] = 0;
+ _tracef("%s acs_chars %s",
+ (acs_chars == NULL)
+ ? "NULL"
+ : (strcmp(acs_chars, show)
+ ? "DIFF"
+ : "SAME"),
+ _nc_visbuf(show));
+ }
+#endif /* TRACE */
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_baudrate.c b/contrib/ncurses/ncurses/tinfo/lib_baudrate.c
new file mode 100644
index 000000000000..4077ba384076
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_baudrate.c
@@ -0,0 +1,178 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * lib_baudrate.c
+ *
+ */
+
+#include <curses.priv.h>
+#include <term.h> /* cur_term, pad_char */
+#include <termcap.h> /* ospeed */
+
+MODULE_ID("$Id: lib_baudrate.c,v 1.15 1999/01/31 03:05:25 tom Exp $")
+
+/*
+ * int
+ * baudrate()
+ *
+ * Returns the current terminal's baud rate.
+ *
+ */
+
+struct speed {
+ speed_t s;
+ int sp;
+};
+
+static struct speed const speeds[] = {
+ {B0, 0},
+ {B50, 50},
+ {B75, 75},
+ {B110, 110},
+ {B134, 134},
+ {B150, 150},
+ {B200, 200},
+ {B300, 300},
+ {B600, 600},
+ {B1200, 1200},
+ {B1800, 1800},
+ {B2400, 2400},
+ {B4800, 4800},
+ {B9600, 9600},
+#ifdef B19200
+ {B19200, 19200},
+#else
+#ifdef EXTA
+ {EXTA, 19200},
+#endif
+#endif
+#ifdef B38400
+ {B38400, 38400},
+#else
+#ifdef EXTB
+ {EXTB, 38400},
+#endif
+#endif
+#ifdef B57600
+ {B57600, 57600},
+#endif
+#ifdef B115200
+ {B115200, 115200},
+#endif
+#ifdef B230400
+ {B230400, 230400},
+#endif
+#ifdef B460800
+ {B460800, 460800},
+#endif
+};
+
+int _nc_baudrate(int OSpeed)
+{
+ static int last_OSpeed;
+ static int last_baudrate;
+
+ int result;
+ unsigned i;
+
+ if (OSpeed == last_OSpeed) {
+ result = last_baudrate;
+ } else {
+ result = ERR;
+ if (OSpeed >= 0) {
+ for (i = 0; i < SIZEOF(speeds); i++) {
+ if (speeds[i].s == (speed_t)OSpeed) {
+ result = speeds[i].sp;
+ break;
+ }
+ }
+ }
+ last_baudrate = result;
+ }
+ return (result);
+}
+
+
+int _nc_ospeed(int BaudRate)
+{
+ speed_t result = 1;
+ unsigned i;
+
+ if (BaudRate >= 0) {
+ for (i = 0; i < SIZEOF(speeds); i++) {
+ if (speeds[i].sp == BaudRate) {
+ result = speeds[i].s;
+ break;
+ }
+ }
+ }
+ return (result);
+}
+
+int
+baudrate(void)
+{
+int result;
+
+ T((T_CALLED("baudrate()")));
+
+ /*
+ * 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 (SP && !isatty(fileno(SP->_ofp))
+ && getenv("BAUDRATE") != 0) {
+ int ret;
+ if ((ret = _nc_getenv_num("BAUDRATE")) <= 0)
+ ret = 9600;
+ ospeed = _nc_ospeed(ret);
+ returnCode(ret);
+ }
+ else
+#endif
+
+#ifdef TERMIOS
+ ospeed = cfgetospeed(&cur_term->Nttyb);
+#else
+ ospeed = cur_term->Nttyb.sg_ospeed;
+#endif
+ result = _nc_baudrate(ospeed);
+ if (cur_term != 0)
+ cur_term->_baudrate = result;
+
+ returnCode(result);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_cur_term.c b/contrib/ncurses/ncurses/tinfo/lib_cur_term.c
new file mode 100644
index 000000000000..3250147c8066
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_cur_term.c
@@ -0,0 +1,70 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+/*
+ * Module that "owns" the 'cur_term' variable:
+ *
+ * TERMINAL *set_curterm(TERMINAL *)
+ * int del_curterm(TERMINAL *)
+ */
+
+#include <curses.priv.h>
+#include <term_entry.h> /* TTY, cur_term */
+#include <termcap.h> /* ospeed */
+
+MODULE_ID("$Id: lib_cur_term.c,v 1.8 1999/07/24 20:08:19 tom Exp $")
+
+TERMINAL *cur_term;
+
+TERMINAL *set_curterm(TERMINAL *termp)
+{
+ TERMINAL *oldterm = cur_term;
+
+ if ((cur_term = termp) != 0) {
+ ospeed = _nc_ospeed(cur_term->_baudrate);
+ PC = (pad_char != NULL) ? pad_char[0] : 0;
+ }
+ return oldterm;
+}
+
+int del_curterm(TERMINAL *termp)
+{
+ T((T_CALLED("del_curterm(%p)"), termp));
+
+ if (termp != 0) {
+ _nc_free_termtype(&(termp->type));
+ free(termp);
+ if (termp == cur_term)
+ cur_term = 0;
+ returnCode(OK);
+ }
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_data.c b/contrib/ncurses/ncurses/tinfo/lib_data.c
new file mode 100644
index 000000000000..d2d0d3ff6d8e
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_data.c
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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_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.14 1999/01/31 01:34:33 Ilya.Zakharevich Exp $")
+
+/*
+ * OS/2's native linker complains if we don't initialize public data when
+ * constructing a dll (reported by J.J.G.Ripoll).
+ */
+WINDOW *stdscr = 0;
+WINDOW *curscr = 0;
+WINDOW *newscr = 0;
+
+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;
+
+SCREEN *_nc_screen(void)
+{
+ return my_screen;
+}
+
+int _nc_alloc_screen(void)
+{
+ return ((my_screen = typeCalloc(SCREEN, 1)) != 0);
+}
+
+void _nc_set_screen(SCREEN *sp)
+{
+ my_screen = sp;
+}
+#else
+SCREEN *SP = NULL; /* Some linkers require initialized data... */
+#endif
diff --git a/contrib/ncurses/ncurses/tinfo/lib_has_cap.c b/contrib/ncurses/ncurses/tinfo/lib_has_cap.c
new file mode 100644
index 000000000000..7121fc758f4f
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_has_cap.c
@@ -0,0 +1,63 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_has_cap.c
+**
+** The routines to query terminal capabilities
+**
+*/
+
+#include <curses.priv.h>
+
+#include <term.h>
+
+MODULE_ID("$Id: lib_has_cap.c,v 1.1 1998/10/23 15:32:21 tom Exp $")
+
+bool has_ic(void)
+{
+ T((T_CALLED("has_ic()")));
+ returnCode(cur_term &&
+ (insert_character || parm_ich
+ || (enter_insert_mode && exit_insert_mode))
+ && (delete_character || parm_dch));
+}
+
+bool has_il(void)
+{
+ T((T_CALLED("has_il()")));
+ returnCode(cur_term
+ && (insert_line || parm_insert_line)
+ && (delete_line || parm_delete_line));
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_kernel.c b/contrib/ncurses/ncurses/tinfo/lib_kernel.c
new file mode 100644
index 000000000000..3c8c88ee2aab
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_kernel.c
@@ -0,0 +1,130 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * 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>
+#include <term.h> /* cur_term */
+
+MODULE_ID("$Id: lib_kernel.c,v 1.19 1998/12/20 00:18:45 tom Exp $")
+
+/*
+ * erasechar()
+ *
+ * Return erase character as given in cur_term->Ottyb.
+ *
+ */
+
+char
+erasechar(void)
+{
+ T((T_CALLED("erasechar()")));
+
+ if (cur_term != 0) {
+#ifdef TERMIOS
+ returnCode(cur_term->Ottyb.c_cc[VERASE]);
+#else
+ returnCode(cur_term->Ottyb.sg_erase);
+#endif
+ }
+ returnCode(ERR);
+}
+
+
+
+/*
+ * killchar()
+ *
+ * Return kill character as given in cur_term->Ottyb.
+ *
+ */
+
+char
+killchar(void)
+{
+ T((T_CALLED("killchar()")));
+
+ if (cur_term != 0) {
+#ifdef TERMIOS
+ returnCode(cur_term->Ottyb.c_cc[VKILL]);
+#else
+ returnCode(cur_term->Ottyb.sg_kill);
+#endif
+ }
+ returnCode(ERR);
+}
+
+
+
+/*
+ * flushinp()
+ *
+ * Flush any input on cur_term->Filedes
+ *
+ */
+
+int flushinp(void)
+{
+ T((T_CALLED("flushinp()")));
+
+ if (cur_term != 0) {
+#ifdef TERMIOS
+ tcflush(cur_term->Filedes, TCIFLUSH);
+#else
+ errno = 0;
+ do {
+ ioctl(cur_term->Filedes, TIOCFLUSH, 0);
+ } while
+ (errno == EINTR);
+#endif
+ if (SP) {
+ SP->_fifohead = -1;
+ SP->_fifotail = 0;
+ SP->_fifopeek = 0;
+ }
+ returnCode(OK);
+ }
+ returnCode(ERR);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_longname.c b/contrib/ncurses/ncurses/tinfo/lib_longname.c
new file mode 100644
index 000000000000..766e56c091e6
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_longname.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_longname.c
+**
+** The routine longname().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_longname.c,v 1.7 1999/01/03 01:47:45 tom Exp $")
+
+char *
+longname(void)
+{
+char *ptr;
+
+ T((T_CALLED("longname()")));
+
+ for (ptr = ttytype + strlen(ttytype); ptr > ttytype; ptr--)
+ if (*ptr == '|')
+ returnPtr(ptr + 1);
+
+ returnPtr(ttytype);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_napms.c b/contrib/ncurses/ncurses/tinfo/lib_napms.c
new file mode 100644
index 000000000000..6f786c2f092a
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_napms.c
@@ -0,0 +1,90 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * lib_napms.c
+ *
+ * The routine napms.
+ *
+ */
+
+#include <curses.priv.h>
+
+#if HAVE_NANOSLEEP
+#include <time.h>
+#elif USE_FUNC_POLL
+#include <stropts.h>
+#include <poll.h>
+#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
+
+MODULE_ID("$Id: lib_napms.c,v 1.5 1999/06/06 00:42:47 R.Lindsay.Todd Exp $")
+
+int napms(int ms)
+{
+ T((T_CALLED("napms(%d)"), ms));
+
+#if HAVE_NANOSLEEP
+ {
+ struct timespec ts;
+ ts.tv_sec = ms / 1000;
+ ts.tv_nsec = (ms % 1000) * 1000000;
+ nanosleep(&ts, NULL);
+ }
+#elif HAVE_USLEEP
+ usleep(1000*(unsigned)ms);
+#elif USE_FUNC_POLL
+ {
+ struct pollfd fds[1];
+ poll(fds, 0, ms);
+ }
+#elif HAVE_SELECT
+ {
+ struct timeval tval;
+ tval.tv_sec = ms / 1000;
+ tval.tv_usec = (ms % 1000) * 1000;
+ select(0, NULL, NULL, NULL, &tval);
+ }
+#endif
+ returnCode(OK);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_options.c b/contrib/ncurses/ncurses/tinfo/lib_options.c
new file mode 100644
index 000000000000..654e0edaa7aa
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_options.c
@@ -0,0 +1,261 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** lib_options.c
+**
+** The routines to handle option setting.
+**
+*/
+
+#include <curses.priv.h>
+
+#include <term.h> /* keypad_xmit, keypad_local, meta_on, meta_off */
+ /* cursor_visible,cursor_normal,cursor_invisible */
+
+MODULE_ID("$Id: lib_options.c,v 1.35 1999/07/04 00:18:28 tom Exp $")
+
+int idlok(WINDOW *win, bool flag)
+{
+ T((T_CALLED("idlok(%p,%d)"), win, flag));
+
+ if (win) {
+ _nc_idlok = win->_idlok = flag && (has_il() || change_scroll_region);
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
+
+
+void idcok(WINDOW *win, bool flag)
+{
+ T((T_CALLED("idcok(%p,%d)"), win, flag));
+
+ if (win)
+ _nc_idcok = win->_idcok = flag && has_ic();
+
+ returnVoid;
+}
+
+int halfdelay(int t)
+{
+ T((T_CALLED("halfdelay(%d)"), t));
+
+ if (t < 1 || t > 255)
+ returnCode(ERR);
+
+ cbreak();
+ SP->_cbreak = t+1;
+ returnCode(OK);
+}
+
+int nodelay(WINDOW *win, bool flag)
+{
+ T((T_CALLED("nodelay(%p,%d)"), win, flag));
+
+ if (win) {
+ if (flag == TRUE)
+ win->_delay = 0;
+ else win->_delay = -1;
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
+
+int notimeout(WINDOW *win, bool f)
+{
+ T((T_CALLED("notimout(%p,%d)"), win, f));
+
+ if (win) {
+ win->_notimeout = f;
+ returnCode(OK);
+ }
+ else
+ returnCode(ERR);
+}
+
+void wtimeout(WINDOW *win, int delay)
+{
+ T((T_CALLED("wtimeout(%p,%d)"), win, delay));
+
+ if (win) {
+ win->_delay = delay;
+ }
+}
+
+int keypad(WINDOW *win, bool flag)
+{
+ T((T_CALLED("keypad(%p,%d)"), win, flag));
+
+ if (win) {
+ win->_use_keypad = flag;
+ returnCode(_nc_keypad(flag));
+ }
+ else
+ returnCode(ERR);
+}
+
+
+int meta(WINDOW *win GCC_UNUSED, bool flag)
+{
+ /* Ok, we stay relaxed and don't signal an error if win is NULL */
+ T((T_CALLED("meta(%p,%d)"), win, flag));
+
+ SP->_use_meta = flag;
+
+ if (flag && meta_on)
+ {
+ TPUTS_TRACE("meta_on");
+ putp(meta_on);
+ }
+ else if (! flag && meta_off)
+ {
+ TPUTS_TRACE("meta_off");
+ putp(meta_off);
+ }
+ returnCode(OK);
+}
+
+/* curs_set() moved here to narrow the kernel interface */
+
+int curs_set(int vis)
+{
+int cursor = SP->_cursor;
+
+ T((T_CALLED("curs_set(%d)"), vis));
+
+ if (vis < 0 || vis > 2)
+ returnCode(ERR);
+
+ if (vis == cursor)
+ returnCode(cursor);
+
+ switch(vis) {
+ case 2:
+ if (cursor_visible)
+ {
+ TPUTS_TRACE("cursor_visible");
+ putp(cursor_visible);
+ }
+ else
+ returnCode(ERR);
+ break;
+ case 1:
+ if (cursor_normal)
+ {
+ TPUTS_TRACE("cursor_normal");
+ putp(cursor_normal);
+ }
+ else
+ returnCode(ERR);
+ break;
+ case 0:
+ if (cursor_invisible)
+ {
+ TPUTS_TRACE("cursor_invisible");
+ putp(cursor_invisible);
+ }
+ else
+ returnCode(ERR);
+ break;
+ }
+ SP->_cursor = vis;
+ (void) fflush(SP->_ofp);
+
+ returnCode(cursor==-1 ? 1 : cursor);
+}
+
+int typeahead(int fd)
+{
+ T((T_CALLED("typeahead(%d)"), fd));
+ SP->_checkfd = fd;
+ returnCode(OK);
+}
+
+/*
+** has_key()
+**
+** Return TRUE if the current terminal has the given key
+**
+*/
+
+#ifdef NCURSES_EXT_FUNCS
+static int has_key_internal(int keycode, struct 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));
+}
+
+int has_key(int keycode)
+{
+ T((T_CALLED("has_key(%d)"), keycode));
+ returnCode(has_key_internal(keycode, SP->_keytry));
+}
+#endif /* NCURSES_EXT_FUNCS */
+
+/* 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.
+ */
+int _nc_keypad(bool flag)
+{
+ if (flag && keypad_xmit)
+ {
+ TPUTS_TRACE("keypad_xmit");
+ putp(keypad_xmit);
+ (void) fflush(SP->_ofp);
+ }
+ else if (! flag && keypad_local)
+ {
+ TPUTS_TRACE("keypad_local");
+ putp(keypad_local);
+ (void) fflush(SP->_ofp);
+ }
+
+ if (flag && !SP->_tried) {
+ _nc_init_keytry();
+ SP->_tried = TRUE;
+ }
+ return(OK);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_print.c b/contrib/ncurses/ncurses/tinfo/lib_print.c
new file mode 100644
index 000000000000..63ac648b5439
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_print.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+#include <curses.priv.h>
+
+#include <term.h>
+
+MODULE_ID("$Id: lib_print.c,v 1.11 1999/02/27 19:59:05 tom Exp $")
+
+int mcprint(char *data, int len)
+/* ship binary character data to the printer via mc4/mc5/mc5p */
+{
+ char *mybuf, *switchon;
+ size_t onsize, offsize, res;
+
+ errno = 0;
+ if (!cur_term || (!prtr_non && (!prtr_on || !prtr_off)))
+ {
+ errno = ENODEV;
+ return(ERR);
+ }
+
+ if (prtr_non)
+ {
+ switchon = tparm(prtr_non, len);
+ onsize = strlen(switchon);
+ offsize = 0;
+ }
+ else
+ {
+ switchon = prtr_on;
+ onsize = strlen(prtr_on);
+ offsize = strlen(prtr_off);
+ }
+
+ if ((mybuf = typeMalloc(char, onsize + len + offsize + 1)) == (char *)0)
+ {
+ errno = ENOMEM;
+ return(ERR);
+ }
+
+ (void) strcpy(mybuf, switchon);
+ memcpy(mybuf + onsize, data, len);
+ if (offsize)
+ (void) strcpy(mybuf + onsize + len, prtr_off);
+
+ /*
+ * 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.
+ */
+ res = write(cur_term->Filedes, mybuf, onsize + len + offsize);
+
+ /*
+ * 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.
+ */
+ (void) sleep(0);
+
+ free(mybuf);
+ return(res);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_raw.c b/contrib/ncurses/ncurses/tinfo/lib_raw.c
new file mode 100644
index 000000000000..61b422c1fb88
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_raw.c
@@ -0,0 +1,233 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * raw.c
+ *
+ * Routines:
+ * raw()
+ * cbreak()
+ * noraw()
+ * nocbreak()
+ * qiflush()
+ * noqiflush()
+ * intrflush()
+ *
+ */
+
+#include <curses.priv.h>
+#include <term.h> /* cur_term */
+
+MODULE_ID("$Id: lib_raw.c,v 1.3 1999/03/06 22:28:24 tom Exp $")
+
+#if defined(SVR4_TERMIO) && !defined(_POSIX_SOURCE)
+#define _POSIX_SOURCE
+#endif
+
+#if HAVE_SYS_TERMIO_H
+#include <sys/termio.h> /* needed for ISC */
+#endif
+
+#ifdef __EMX__
+#include <io.h>
+#include <fcntl.h>
+#endif
+
+#define COOKED_INPUT (IXON|BRKINT|PARMRK)
+
+#ifdef TRACE
+#define BEFORE(N) if (_nc_tracing&TRACE_BITS) _tracef("%s before bits: %s", N, _nc_tracebits())
+#define AFTER(N) if (_nc_tracing&TRACE_BITS) _tracef("%s after bits: %s", N, _nc_tracebits())
+#else
+#define BEFORE(s)
+#define AFTER(s)
+#endif /* TRACE */
+
+int raw(void)
+{
+ T((T_CALLED("raw()")));
+ if (SP != 0 && cur_term != 0) {
+
+ SP->_raw = TRUE;
+ SP->_cbreak = 1;
+
+#ifdef __EMX__
+ setmode(SP->_ifd, O_BINARY);
+#endif
+
+#ifdef TERMIOS
+ BEFORE("raw");
+ cur_term->Nttyb.c_lflag &= ~(ICANON|ISIG);
+ cur_term->Nttyb.c_iflag &= ~(COOKED_INPUT);
+ cur_term->Nttyb.c_cc[VMIN] = 1;
+ cur_term->Nttyb.c_cc[VTIME] = 0;
+ AFTER("raw");
+#else
+ cur_term->Nttyb.sg_flags |= RAW;
+#endif
+ returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
+ }
+ returnCode(ERR);
+}
+
+int cbreak(void)
+{
+ T((T_CALLED("cbreak()")));
+
+ SP->_cbreak = 1;
+
+#ifdef __EMX__
+ setmode(SP->_ifd, O_BINARY);
+#endif
+
+#ifdef TERMIOS
+ BEFORE("cbreak");
+ cur_term->Nttyb.c_lflag &= ~ICANON;
+ cur_term->Nttyb.c_iflag &= ~ICRNL;
+ cur_term->Nttyb.c_lflag |= ISIG;
+ cur_term->Nttyb.c_cc[VMIN] = 1;
+ cur_term->Nttyb.c_cc[VTIME] = 0;
+ AFTER("cbreak");
+#else
+ cur_term->Nttyb.sg_flags |= CBREAK;
+#endif
+ returnCode(_nc_set_tty_mode( &cur_term->Nttyb));
+}
+
+void qiflush(void)
+{
+ T((T_CALLED("qiflush()")));
+
+ /*
+ * Note: this implementation may be wrong. See the comment under
+ * intrflush().
+ */
+
+#ifdef TERMIOS
+ BEFORE("qiflush");
+ cur_term->Nttyb.c_lflag &= ~(NOFLSH);
+ AFTER("qiflush");
+ (void)_nc_set_tty_mode( &cur_term->Nttyb);
+ returnVoid;
+#endif
+}
+
+
+int noraw(void)
+{
+ T((T_CALLED("noraw()")));
+
+ SP->_raw = FALSE;
+ SP->_cbreak = 0;
+
+#ifdef __EMX__
+ setmode(SP->_ifd, O_TEXT);
+#endif
+
+#ifdef TERMIOS
+ BEFORE("noraw");
+ cur_term->Nttyb.c_lflag |= ISIG|ICANON;
+ cur_term->Nttyb.c_iflag |= COOKED_INPUT;
+ AFTER("noraw");
+#else
+ cur_term->Nttyb.sg_flags &= ~(RAW|CBREAK);
+#endif
+ returnCode(_nc_set_tty_mode( &cur_term->Nttyb));
+}
+
+
+int nocbreak(void)
+{
+ T((T_CALLED("nocbreak()")));
+
+ SP->_cbreak = 0;
+
+#ifdef __EMX__
+ setmode(SP->_ifd, O_TEXT);
+#endif
+
+#ifdef TERMIOS
+ BEFORE("nocbreak");
+ cur_term->Nttyb.c_lflag |= ICANON;
+ cur_term->Nttyb.c_iflag |= ICRNL;
+ AFTER("nocbreak");
+#else
+ cur_term->Nttyb.sg_flags &= ~CBREAK;
+#endif
+ returnCode(_nc_set_tty_mode( &cur_term->Nttyb));
+}
+
+void noqiflush(void)
+{
+ T((T_CALLED("noqiflush()")));
+
+ /*
+ * Note: this implementation may be wrong. See the comment under
+ * intrflush().
+ */
+
+#ifdef TERMIOS
+ BEFORE("noqiflush");
+ cur_term->Nttyb.c_lflag |= NOFLSH;
+ AFTER("noqiflush");
+ (void)_nc_set_tty_mode( &cur_term->Nttyb);
+ returnVoid;
+#endif
+}
+
+int intrflush(WINDOW *win GCC_UNUSED, bool flag)
+{
+ T((T_CALLED("intrflush(%d)"), flag));
+
+ /*
+ * 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.
+ */
+
+#ifdef TERMIOS
+ BEFORE("intrflush");
+ if (flag)
+ cur_term->Nttyb.c_lflag &= ~(NOFLSH);
+ else
+ cur_term->Nttyb.c_lflag |= (NOFLSH);
+ AFTER("intrflush");
+ returnCode(_nc_set_tty_mode( &cur_term->Nttyb));
+#else
+ returnCode(ERR);
+#endif
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_setup.c b/contrib/ncurses/ncurses/tinfo/lib_setup.c
new file mode 100644
index 000000000000..64aa73fa8cf3
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_setup.c
@@ -0,0 +1,422 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * Terminal setup routines common to termcap and terminfo:
+ *
+ * use_env(bool)
+ * setupterm(char *, int, int *)
+ */
+
+#include <curses.priv.h>
+#include <tic.h> /* for MAX_NAME_SIZE */
+#include <term_entry.h>
+
+#if defined(SVR4_TERMIO) && !defined(_POSIX_SOURCE)
+#define _POSIX_SOURCE
+#endif
+
+#include <term.h> /* lines, columns, cur_term */
+
+MODULE_ID("$Id: lib_setup.c,v 1.55 1999/08/21 23:06:08 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's only
+ * in termio.h and ptem.h (the former conflicts with other definitions).
+ */
+# include <sys/stream.h>
+# include <sys/ptem.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
+
+static int _use_env = TRUE;
+
+static void do_prototype(void);
+
+void use_env(bool f)
+{
+ _use_env = f;
+}
+
+int LINES, COLS, TABSIZE;
+
+static void _nc_get_screensize(int *linep, int *colp)
+/* Obtain lines/columns values from the environment and/or terminfo entry */
+{
+ /* figure out the size of the screen */
+ T(("screen size: terminfo lines = %d columns = %d", lines, columns));
+
+ if (!_use_env)
+ {
+ *linep = (int)lines;
+ *colp = (int)columns;
+ }
+ else /* usually want to query LINES and COLUMNS from environment */
+ {
+ int value;
+
+ *linep = *colp = 0;
+
+ /* first, look for environment variables */
+ if ((value = _nc_getenv_num("LINES")) > 0) {
+ *linep = value;
+ }
+ if ((value = _nc_getenv_num("COLUMNS")) > 0) {
+ *colp = value;
+ }
+ T(("screen size: environment LINES = %d COLUMNS = %d",*linep,*colp));
+
+#ifdef __EMX__
+ if (*linep <= 0 || *colp <= 0)
+ {
+ int screendata[2];
+ _scrsize(screendata);
+ *colp = screendata[0];
+ *linep = screendata[1];
+ T(("EMX screen size: environment LINES = %d COLUMNS = %d",*linep,*colp));
+ }
+#endif
+#if HAVE_SIZECHANGE
+ /* if that didn't work, maybe we can try asking the OS */
+ if (*linep <= 0 || *colp <= 0)
+ {
+ if (isatty(cur_term->Filedes))
+ {
+ STRUCT_WINSIZE size;
+
+ errno = 0;
+ do {
+ if (ioctl(cur_term->Filedes, IOCTL_WINSIZE, &size) < 0
+ && errno != EINTR)
+ goto failure;
+ } while
+ (errno == EINTR);
+
+ /*
+ * Solaris lets users override either dimension with an
+ * environment variable.
+ */
+ if (*linep <= 0)
+ *linep = WINSIZE_ROWS(size);
+ if (*colp <= 0)
+ *colp = WINSIZE_COLS(size);
+ }
+ /* FALLTHRU */
+ failure:;
+ }
+#endif /* HAVE_SIZECHANGE */
+
+ /* if we can't get dynamic info about the size, use static */
+ if (*linep <= 0 || *colp <= 0)
+ if (lines > 0 && columns > 0)
+ {
+ *linep = (int)lines;
+ *colp = (int)columns;
+ }
+
+ /* the ultimate fallback, assume fixed 24x80 size */
+ if (*linep <= 0 || *colp <= 0)
+ {
+ *linep = 24;
+ *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));
+
+ if (init_tabs != -1)
+ TABSIZE = (int)init_tabs;
+ else
+ TABSIZE = 8;
+ T(("TABSIZE = %d", TABSIZE));
+
+}
+
+#if USE_SIZECHANGE
+void _nc_update_screensize(void)
+{
+ int my_lines, my_cols;
+
+ _nc_get_screensize(&my_lines, &my_cols);
+ if (SP != 0 && SP->_resize != 0)
+ SP->_resize(my_lines, my_cols);
+}
+#endif
+
+/****************************************************************************
+ *
+ * Terminal setup
+ *
+ ****************************************************************************/
+
+#define ret_error(code, fmt, arg) if (errret) {\
+ *errret = code;\
+ returnCode(ERR);\
+ } else {\
+ fprintf(stderr, fmt, arg);\
+ exit(EXIT_FAILURE);\
+ }
+
+#define ret_error0(code, msg) if (errret) {\
+ *errret = code;\
+ returnCode(ERR);\
+ } else {\
+ fprintf(stderr, msg);\
+ exit(EXIT_FAILURE);\
+ }
+
+#if USE_DATABASE
+static int grab_entry(const char *const tn, TERMTYPE *const tp)
+/* return 1 if entry found, 0 if not found, -1 if database not accessible */
+{
+ char filename[PATH_MAX];
+ int status;
+
+ /*
+ * $TERM shouldn't contain pathname delimiters.
+ */
+ if (strchr(tn, '/'))
+ return 0;
+
+ if ((status = _nc_read_entry(tn, filename, tp)) != 1) {
+
+#ifndef PURE_TERMINFO
+ /*
+ * Try falling back on the termcap file.
+ * Note: allowing this call links the entire terminfo/termcap
+ * compiler into the startup code. It's preferable to build a
+ * real terminfo database and use that.
+ */
+ status = _nc_read_termcap_entry(tn, tp);
+#endif /* PURE_TERMINFO */
+
+ }
+
+ /*
+ * 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 == 1) {
+ int 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
+
+char ttytype[NAMESIZE];
+
+/*
+ * setupterm(termname, Filedes, errret)
+ *
+ * Find and read the appropriate object file for the terminal
+ * Make cur_term point to the structure.
+ *
+ */
+
+int setupterm(NCURSES_CONST char *tname, int Filedes, int *errret)
+{
+struct term *term_ptr;
+int status;
+
+ T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, errret));
+
+ if (tname == 0) {
+ tname = getenv("TERM");
+ if (tname == 0 || *tname == '\0') {
+ ret_error0(-1, "TERM environment variable not set.\n");
+ }
+ }
+ if (strlen(tname) > MAX_NAME_SIZE) {
+ ret_error(-1, "TERM environment must be <= %d characters.\n",
+ MAX_NAME_SIZE);
+ }
+
+ T(("your terminal name is %s", tname));
+
+ term_ptr = typeCalloc(TERMINAL, 1);
+
+ if (term_ptr == 0) {
+ ret_error0(-1, "Not enough memory to create terminal structure.\n") ;
+ }
+#if USE_DATABASE
+ status = grab_entry(tname, &term_ptr->type);
+#else
+ status = 0;
+#endif
+
+ /* try fallback list if entry on disk */
+ if (status != 1)
+ {
+ const TERMTYPE *fallback = _nc_fallback(tname);
+
+ if (fallback)
+ {
+ term_ptr->type = *fallback;
+ status = 1;
+ }
+ }
+
+ if (status == -1)
+ {
+ ret_error0(-1, "terminals database is inaccessible\n");
+ }
+ else if (status == 0)
+ {
+ ret_error(0, "'%s': unknown terminal type.\n", tname);
+ }
+
+ /*
+ * Improve 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 (cur_term != 0) {
+ if (cur_term->Filedes == Filedes)
+ term_ptr->Ottyb = cur_term->Ottyb;
+ }
+
+ set_curterm(term_ptr);
+
+ if (command_character && getenv("CC"))
+ do_prototype();
+
+ strncpy(ttytype, cur_term->type.term_names, NAMESIZE - 1);
+ ttytype[NAMESIZE - 1] = '\0';
+
+ /*
+ * 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 && !isatty(Filedes))
+ Filedes = STDERR_FILENO;
+ cur_term->Filedes = Filedes;
+
+ _nc_get_screensize(&LINES, &COLS);
+
+ if (errret)
+ *errret = 1;
+
+ T((T_CREATE("screen %s %dx%d"), tname, LINES, COLS));
+
+ if (generic_type) {
+ ret_error(0, "'%s': I need something more specific.\n", tname);
+ }
+ if (hard_copy) {
+ ret_error(1, "'%s': I can't handle hardcopy terminals.\n", tname);
+ }
+ returnCode(OK);
+}
+
+/*
+** do_prototype()
+**
+** Take the real command character out of the CC environment variable
+** and substitute it in for the prototype given in 'command_character'.
+**
+*/
+
+static void
+do_prototype(void)
+{
+int i;
+char CC;
+char proto;
+char *tmp;
+
+ tmp = getenv("CC");
+ CC = *tmp;
+ proto = *command_character;
+
+ for_each_string(i, &(cur_term->type)) {
+ for (tmp = cur_term->type.Strings[i]; *tmp; tmp++) {
+ if (*tmp == proto)
+ *tmp = CC;
+ }
+ }
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_termcap.c b/contrib/ncurses/ncurses/tinfo/lib_termcap.c
new file mode 100644
index 000000000000..488b3c9a2c29
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_termcap.c
@@ -0,0 +1,198 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+
+#include <termcap.h>
+#include <tic.h>
+
+#define __INTERNAL_CAPS_VISIBLE
+#include <term_entry.h>
+
+MODULE_ID("$Id: lib_termcap.c,v 1.28 1999/02/27 22:12:58 tom Exp $")
+
+/*
+ some of the code in here was contributed by:
+ Magnus Bengtsson, d6mbeng@dtek.chalmers.se
+*/
+
+char *UP;
+char *BC;
+
+/***************************************************************************
+ *
+ * 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.
+ *
+ ***************************************************************************/
+
+int tgetent(char *bufp GCC_UNUSED, const char *name)
+{
+int errcode;
+
+ T((T_CALLED("tgetent()")));
+
+ setupterm((NCURSES_CONST char *)name, STDOUT_FILENO, &errcode);
+
+ if (errcode == 1) {
+
+ if (cursor_left)
+ if ((backspaces_with_bs = !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;
+
+ (void) baudrate(); /* sets ospeed as a side-effect */
+
+/* LINT_PREPRO
+#if 0*/
+#include <capdefaults.c>
+/* LINT_PREPRO
+#endif*/
+
+ }
+ returnCode(errcode);
+}
+
+/***************************************************************************
+ *
+ * tgetflag(str)
+ *
+ * Look up boolean termcap capability str and return its value (TRUE=1 if
+ * present, FALSE=0 if not).
+ *
+ ***************************************************************************/
+
+int tgetflag(NCURSES_CONST char *id)
+{
+int i;
+
+ T((T_CALLED("tgetflag(%s)"), id));
+ if (cur_term != 0) {
+ TERMTYPE *tp = &(cur_term->type);
+ for_each_boolean(i, tp) {
+ const char *capname = ExtBoolname(tp, i, boolcodes);
+ if (!strncmp(id, capname, 2)) {
+ /* setupterm forces invalid booleans to false */
+ returnCode(tp->Booleans[i]);
+ }
+ }
+ }
+ returnCode(0); /* Solaris does this */
+}
+
+/***************************************************************************
+ *
+ * tgetnum(str)
+ *
+ * Look up numeric termcap capability str and return its value, or -1 if
+ * not given.
+ *
+ ***************************************************************************/
+
+int tgetnum(NCURSES_CONST char *id)
+{
+int i;
+
+ T((T_CALLED("tgetnum(%s)"), id));
+ if (cur_term != 0) {
+ TERMTYPE *tp = &(cur_term->type);
+ for_each_number(i, tp) {
+ const char *capname = ExtNumname(tp, i, numcodes);
+ if (!strncmp(id, capname, 2)) {
+ if (!VALID_NUMERIC(tp->Numbers[i]))
+ return -1;
+ returnCode(tp->Numbers[i]);
+ }
+ }
+ }
+ returnCode(ERR);
+}
+
+/***************************************************************************
+ *
+ * tgetstr(str, area)
+ *
+ * Look up string termcap capability str and return a pointer to its value,
+ * or NULL if not given.
+ *
+ ***************************************************************************/
+
+char *tgetstr(NCURSES_CONST char *id, char **area GCC_UNUSED)
+{
+int i;
+
+ T((T_CALLED("tgetstr(%s,%p)"), id, area));
+ if (cur_term != 0) {
+ TERMTYPE *tp = &(cur_term->type);
+ for_each_string(i, tp) {
+ const char *capname = ExtStrname(tp, i, strcodes);
+ T(("trying %s", capname));
+ if (!strncmp(id, capname, 2)) {
+ T(("found match : %s", _nc_visbuf(tp->Strings[i])));
+ /* setupterm forces cancelled strings to null */
+ returnPtr(tp->Strings[i]);
+ }
+ }
+ }
+ returnPtr(NULL);
+}
+
+/*
+ * char *
+ * tgoto(string, x, y)
+ *
+ * Retained solely for upward compatibility. Note the intentional
+ * reversing of the last two arguments.
+ *
+ */
+
+char *tgoto(const char *string, int x, int y)
+{
+ T((T_CALLED("tgoto(%s,%d,%d)"), string, x, y));
+ returnPtr(tparm((NCURSES_CONST char *)string, y, x));
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_termname.c b/contrib/ncurses/ncurses/tinfo/lib_termname.c
new file mode 100644
index 000000000000..e7057383c565
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_termname.c
@@ -0,0 +1,46 @@
+/****************************************************************************
+ * Copyright (c) 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. *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <tic.h> /* for MAX_ALIAS */
+
+MODULE_ID("$Id: lib_termname.c,v 1.2 1999/07/24 21:02:40 tom Exp $")
+
+char *termname(void)
+{
+char *name = getenv("TERM");
+static char ret[MAX_ALIAS+1];
+
+ T(("termname() called"));
+
+ if (name != 0) {
+ (void) strncpy(ret, name, sizeof(ret) - 1);
+ name = ret;
+ }
+ return name;
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_ti.c b/contrib/ncurses/ncurses/tinfo/lib_ti.c
new file mode 100644
index 000000000000..7b2b2f910f2d
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_ti.c
@@ -0,0 +1,101 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+#include <curses.priv.h>
+
+#include <term_entry.h>
+#include <tic.h>
+
+MODULE_ID("$Id: lib_ti.c,v 1.16 1999/02/28 23:11:28 tom Exp $")
+
+int tigetflag(NCURSES_CONST char *str)
+{
+int i;
+
+ T((T_CALLED("tigetflag(%s)"), str));
+
+ if (cur_term != 0) {
+ TERMTYPE *tp = &(cur_term->type);
+ for_each_boolean(i,tp) {
+ const char *capname = ExtBoolname(tp, i, boolnames);
+ if (!strcmp(str, capname)) {
+ /* setupterm forces invalid booleans to false */
+ returnCode(tp->Booleans[i]);
+ }
+ }
+ }
+
+ returnCode(ABSENT_BOOLEAN);
+}
+
+int tigetnum(NCURSES_CONST char *str)
+{
+int i;
+
+ T((T_CALLED("tigetnum(%s)"), str));
+
+ if (cur_term != 0) {
+ TERMTYPE *tp = &(cur_term->type);
+ for_each_number(i, tp) {
+ const char *capname = ExtNumname(tp, i, numnames);
+ if (!strcmp(str, capname)) {
+ if (!VALID_NUMERIC(tp->Numbers[i]))
+ return -1;
+ returnCode(tp->Numbers[i]);
+ }
+ }
+ }
+
+ returnCode(CANCELLED_NUMERIC); /* Solaris returns a -1 instead */
+}
+
+char *tigetstr(NCURSES_CONST char *str)
+{
+int i;
+
+ T((T_CALLED("tigetstr(%s)"), str));
+
+ if (cur_term != 0) {
+ TERMTYPE *tp = &(cur_term->type);
+ for_each_string(i, tp) {
+ const char *capname = ExtStrname(tp, i, strnames);
+ if (!strcmp(str, capname)) {
+ /* setupterm forces cancelled strings to null */
+ returnPtr(tp->Strings[i]);
+ }
+ }
+ }
+
+ returnPtr(CANCELLED_STRING);
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_tparm.c b/contrib/ncurses/ncurses/tinfo/lib_tparm.c
new file mode 100644
index 000000000000..71b82916a356
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_tparm.c
@@ -0,0 +1,585 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * tparm.c
+ *
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <term.h>
+#include <tic.h>
+
+MODULE_ID("$Id: lib_tparm.c,v 1.39 1999/06/06 00:04:55 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 like escapes %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
+ *
+ * %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.
+ */
+
+#define STACKSIZE 20
+
+typedef union {
+ unsigned int num;
+ char *str;
+} stack_frame;
+
+static stack_frame stack[STACKSIZE];
+static int stack_ptr;
+#ifdef TRACE
+static const char *tname;
+#endif /* TRACE */
+
+static char *out_buff;
+static size_t out_size;
+static size_t out_used;
+
+#if NO_LEAKS
+void _nc_free_tparm(void)
+{
+ if (out_buff != 0) {
+ FreeAndNull(out_buff);
+ out_size = 0;
+ out_used = 0;
+ }
+}
+#endif
+
+static void really_get_space(size_t need)
+{
+ out_size = need * 2;
+ out_buff = typeRealloc(char, out_size, out_buff);
+ if (out_buff == 0)
+ _nc_err_abort("Out of memory");
+}
+
+static inline void get_space(size_t need)
+{
+ need += out_used;
+ if (need > out_size)
+ really_get_space(need);
+}
+
+static inline void save_text(const char *fmt, char *s, int len)
+{
+ size_t s_len = strlen(s);
+ if (len > (int)s_len)
+ s_len = len;
+
+ get_space(s_len + 1);
+
+ (void)sprintf(out_buff+out_used, fmt, s);
+ out_used += strlen(out_buff+out_used);
+}
+
+static inline void save_number(const char *fmt, int number, int len)
+{
+ if (len < 30)
+ len = 30; /* actually log10(MAX_INT)+1 */
+
+ get_space(len + 1);
+
+ (void)sprintf(out_buff+out_used, fmt, number);
+ out_used += strlen(out_buff+out_used);
+}
+
+static inline void save_char(int c)
+{
+ if (c == 0)
+ c = 0200;
+ get_space(1);
+ out_buff[out_used++] = c;
+}
+
+static inline void npush(int x)
+{
+ if (stack_ptr < STACKSIZE) {
+ stack[stack_ptr].num = x;
+ stack_ptr++;
+ }
+}
+
+static inline int npop(void)
+{
+ return (stack_ptr > 0 ? stack[--stack_ptr].num : 0);
+}
+
+static inline char *spop(void)
+{
+ static char dummy[] = ""; /* avoid const-cast */
+ return (stack_ptr > 0 ? stack[--stack_ptr].str : dummy);
+}
+
+static inline const char *parse_format(const char *s, char *format, int *len)
+{
+ bool done = FALSE;
+ bool allowminus = FALSE;
+ bool dot = FALSE;
+ int prec = 0;
+ int width = 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':
+ *format++ = *s;
+ done = TRUE;
+ break;
+ case '.':
+ *format++ = *s++;
+ dot = TRUE;
+ 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(*s)) {
+ if (dot)
+ prec = (prec * 10) + (*s - '0');
+ else
+ width = (width * 10) + (*s - '0');
+ *format++ = *s++;
+ } else {
+ done = TRUE;
+ }
+ }
+ }
+ *format = '\0';
+ /* return maximum string length in print */
+ *len = (prec > width) ? prec : width;
+ return s;
+}
+
+#define isUPPER(c) ((c) >= 'A' && (c) <= 'Z')
+#define isLOWER(c) ((c) >= 'a' && (c) <= 'z')
+
+static inline char *tparam_internal(const char *string, va_list ap)
+{
+#define NUM_VARS 26
+int param[9];
+int popcount;
+int number;
+int len;
+int level;
+int x, y;
+int i;
+register const char *cp;
+static size_t len_fmt;
+static char *format;
+static int dynamic_var[NUM_VARS];
+static int static_vars[NUM_VARS];
+
+ out_used = 0;
+ if (string == NULL)
+ return NULL;
+
+ /*
+ * 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.
+ */
+ for (cp = string, popcount = number = 0; *cp != '\0'; cp++) {
+ if (cp[0] == '%' && cp[1] != '\0') {
+ switch (cp[1]) {
+ case '%':
+ cp++;
+ break;
+ case 'i':
+ if (popcount < 2)
+ popcount = 2;
+ break;
+ case 'p':
+ cp++;
+ if (cp[1] >= '1' && cp[1] <= '9') {
+ int c = cp[1] - '0';
+ if (c > popcount)
+ popcount = c;
+ }
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case 'd': case 'c': case 's':
+ ++number;
+ break;
+ }
+ }
+ }
+ if ((size_t)(cp - string) > len_fmt) {
+ len_fmt = (cp - string) + len_fmt + 2;
+ if ((format = typeRealloc(char, len_fmt, format)) == 0)
+ return 0;
+ }
+
+ if (number > 9) number = 9;
+ for (i = 0; i < max(popcount, number); i++) {
+ /*
+ * FIXME: potential loss here if sizeof(int) != sizeof(char *).
+ * A few caps (such as plab_norm) have string-valued parms.
+ */
+ param[i] = 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.
+ */
+ stack_ptr = 0;
+ if (popcount == 0) {
+ popcount = number;
+ for (i = number - 1; i >= 0; i--)
+ npush(param[i]);
+ }
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_CALLS) {
+ for (i = 0; i < popcount; i++)
+ save_number(", %d", param[i], 0);
+ _tracef(T_CALLED("%s(%s%s)"), tname, _nc_visbuf(string), out_buff);
+ out_used = 0;
+ }
+#endif /* TRACE */
+
+ while (*string) {
+ if (*string != '%') {
+ save_char(*string);
+ } else {
+ string++;
+ string = parse_format(string, format, &len);
+ switch (*string) {
+ default:
+ break;
+ case '%':
+ save_char('%');
+ break;
+
+ case 'd': /* FALLTHRU */
+ case 'o': /* FALLTHRU */
+ case 'x': /* FALLTHRU */
+ case 'X': /* FALLTHRU */
+ case 'c':
+ save_number(format, npop(), len);
+ break;
+
+ case 'l':
+ save_number("%d", strlen(spop()), 0);
+ break;
+
+ case 's':
+ save_text(format, spop(), len);
+ break;
+
+ case 'p':
+ string++;
+ if (*string >= '1' && *string <= '9')
+ npush(param[*string - '1']);
+ break;
+
+ case 'P':
+ string++;
+ if (isUPPER(*string)) {
+ i = (*string - 'A');
+ static_vars[i] = npop();
+ } else if (isLOWER(*string)) {
+ i = (*string - 'a');
+ dynamic_var[i] = npop();
+ }
+ break;
+
+ case 'g':
+ string++;
+ if (isUPPER(*string)) {
+ i = (*string - 'A');
+ npush(static_vars[i]);
+ } else if (isLOWER(*string)) {
+ i = (*string - 'a');
+ npush(dynamic_var[i]);
+ }
+ break;
+
+ case S_QUOTE:
+ string++;
+ npush(*string);
+ string++;
+ break;
+
+ case L_BRACE:
+ number = 0;
+ string++;
+ while (*string >= '0' && *string <= '9') {
+ number = number * 10 + *string - '0';
+ string++;
+ }
+ npush(number);
+ break;
+
+ case '+':
+ npush(npop() + npop());
+ break;
+
+ case '-':
+ y = npop();
+ x = npop();
+ npush(x - y);
+ break;
+
+ case '*':
+ npush(npop() * npop());
+ break;
+
+ case '/':
+ y = npop();
+ x = npop();
+ npush(y ? (x / y) : 0);
+ break;
+
+ case 'm':
+ y = npop();
+ x = npop();
+ npush(y ? (x % y) : 0);
+ break;
+
+ case 'A':
+ npush(npop() && npop());
+ break;
+
+ case 'O':
+ npush(npop() || npop());
+ break;
+
+ case '&':
+ npush(npop() & npop());
+ break;
+
+ case '|':
+ npush(npop() | npop());
+ break;
+
+ case '^':
+ npush(npop() ^ npop());
+ break;
+
+ case '=':
+ y = npop();
+ x = npop();
+ npush(x == y);
+ break;
+
+ case '<':
+ y = npop();
+ x = npop();
+ npush(x < y);
+ break;
+
+ case '>':
+ y = npop();
+ x = npop();
+ npush(x > y);
+ break;
+
+ case '!':
+ npush(! npop());
+ break;
+
+ case '~':
+ npush(~ npop());
+ break;
+
+ case 'i':
+ param[0]++;
+ param[1]++;
+ break;
+
+ case '?':
+ break;
+
+ case 't':
+ x = npop();
+ if (!x) {
+ /* scan forward for %e or %; at level zero */
+ string++;
+ level = 0;
+ while (*string) {
+ if (*string == '%') {
+ string++;
+ if (*string == '?')
+ level++;
+ else if (*string == ';') {
+ if (level > 0)
+ level--;
+ else
+ break;
+ }
+ else if (*string == 'e' && level == 0)
+ break;
+ }
+
+ if (*string)
+ string++;
+ }
+ }
+ break;
+
+ case 'e':
+ /* scan forward for a %; at level zero */
+ string++;
+ level = 0;
+ while (*string) {
+ if (*string == '%') {
+ string++;
+ if (*string == '?')
+ level++;
+ else if (*string == ';') {
+ if (level > 0)
+ level--;
+ else
+ break;
+ }
+ }
+
+ if (*string)
+ string++;
+ }
+ break;
+
+ case ';':
+ break;
+
+ } /* endswitch (*string) */
+ } /* endelse (*string == '%') */
+
+ if (*string == '\0')
+ break;
+
+ string++;
+ } /* endwhile (*string) */
+
+ if (out_buff == 0 && (out_buff = typeCalloc(char,1)) == NULL)
+ return(NULL);
+ out_buff[out_used] = '\0';
+
+ T((T_RETURN("%s"), _nc_visbuf(out_buff)));
+ return(out_buff);
+}
+
+char *tparm(NCURSES_CONST char *string, ...)
+{
+va_list ap;
+char *result;
+
+ va_start(ap, string);
+#ifdef TRACE
+ tname = "tparm";
+#endif /* TRACE */
+ result = tparam_internal(string, ap);
+ va_end(ap);
+ return result;
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_tputs.c b/contrib/ncurses/ncurses/tinfo/lib_tputs.c
new file mode 100644
index 000000000000..4ce176b77a44
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_tputs.c
@@ -0,0 +1,243 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * tputs.c
+ * delay_output()
+ * _nc_outch()
+ * tputs()
+ *
+ */
+
+#include <curses.priv.h>
+#include <ctype.h>
+#include <term.h> /* padding_baud_rate, xon_xoff */
+#include <termcap.h> /* ospeed */
+#include <tic.h>
+
+MODULE_ID("$Id: lib_tputs.c,v 1.39 1999/02/25 10:44:29 tom Exp $")
+
+#define OUTPUT ((SP != 0) ? SP->_ofp : stdout)
+
+char PC; /* used by termcap library */
+speed_t ospeed; /* used by termcap library */
+
+int _nc_nulls_sent; /* used by 'tack' program */
+
+static int (*my_outch)(int c) = _nc_outch;
+
+int delay_output(int ms)
+{
+ T((T_CALLED("delay_output(%d)"), ms));
+
+ if (no_pad_char)
+ napms(ms);
+ else {
+ register int nullcount;
+
+ nullcount = (ms * _nc_baudrate(ospeed)) / 10000;
+ for (_nc_nulls_sent += nullcount; nullcount > 0; nullcount--)
+ my_outch(PC);
+ if (my_outch == _nc_outch)
+ (void) fflush(OUTPUT);
+ }
+
+ returnCode(OK);
+}
+
+int _nc_outch(int ch)
+{
+#ifdef TRACE
+ _nc_outchars++;
+#endif /* TRACE */
+
+ putc(ch, OUTPUT);
+ return OK;
+}
+
+int putp(const char *string)
+{
+ return tputs(string, 1, _nc_outch);
+}
+
+int tputs(const char *string, int affcnt, int (*outc)(int))
+{
+bool always_delay;
+bool normal_delay;
+int number;
+#ifdef BSD_TPUTS
+int trailpad;
+#endif /* BSD_TPUTS */
+
+#ifdef TRACE
+char addrbuf[32];
+
+ if (_nc_tracing & TRACE_TPUTS)
+ {
+ if (outc == _nc_outch)
+ (void) strcpy(addrbuf, "_nc_outch");
+ else
+ (void) sprintf(addrbuf, "%p", outc);
+ if (_nc_tputs_trace) {
+ TR(TRACE_MAXIMUM, ("tputs(%s = %s, %d, %s) called", _nc_tputs_trace, _nc_visbuf(string), affcnt, addrbuf));
+ }
+ else {
+ TR(TRACE_MAXIMUM, ("tputs(%s, %d, %s) called", _nc_visbuf(string), affcnt, addrbuf));
+ }
+ _nc_tputs_trace = (char *)NULL;
+ }
+#endif /* TRACE */
+
+ if (!VALID_STRING(string))
+ return ERR;
+
+ if (cur_term == 0) {
+ always_delay = FALSE;
+ normal_delay = TRUE;
+ } else {
+ always_delay = (string == bell) || (string == flash_screen);
+ normal_delay =
+ !xon_xoff
+ && padding_baud_rate
+#ifdef NCURSES_NO_PADDING
+ && (SP == 0 || !(SP->_no_padding))
+#endif
+ && (_nc_baudrate(ospeed) >= padding_baud_rate);
+ }
+
+#ifdef 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(*string)) {
+ while (isdigit(*string)) {
+ trailpad = trailpad * 10 + (*string - '0');
+ string++;
+ }
+ trailpad *= 10;
+ if (*string == '.') {
+ string++;
+ if (isdigit(*string)) {
+ trailpad += (*string - '0');
+ string++;
+ }
+ while (isdigit(*string))
+ string++;
+ }
+
+ if (*string == '*') {
+ trailpad *= affcnt;
+ string++;
+ }
+ }
+#endif /* BSD_TPUTS */
+
+ my_outch = outc; /* redirect delay_output() */
+ while (*string) {
+ if (*string != '$')
+ (*outc)(*string);
+ else {
+ string++;
+ if (*string != '<') {
+ (*outc)('$');
+ if (*string)
+ (*outc)(*string);
+ } else {
+ bool mandatory;
+
+ string++;
+ if ((!isdigit(*string) && *string != '.') || !strchr(string, '>')) {
+ (*outc)('$');
+ (*outc)('<');
+ continue;
+ }
+
+ number = 0;
+ while (isdigit(*string)) {
+ number = number * 10 + (*string - '0');
+ string++;
+ }
+ number *= 10;
+ if (*string == '.') {
+ string++;
+ if (isdigit(*string)) {
+ number += (*string - '0');
+ string++;
+ }
+ while (isdigit(*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))
+ delay_output(number/10);
+
+ } /* endelse (*string == '<') */
+ } /* endelse (*string == '$') */
+
+ if (*string == '\0')
+ break;
+
+ string++;
+ }
+
+#ifdef BSD_TPUTS
+ /*
+ * Emit any BSD-style prefix padding that we've accumulated now.
+ */
+ if (trailpad > 0
+ && (always_delay || normal_delay))
+ delay_output(trailpad/10);
+#endif /* BSD_TPUTS */
+
+ my_outch = _nc_outch;
+ return OK;
+}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_ttyflags.c b/contrib/ncurses/ncurses/tinfo/lib_ttyflags.c
new file mode 100644
index 000000000000..79397f466c5e
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/lib_ttyflags.c
@@ -0,0 +1,163 @@
+/****************************************************************************
+ * Copyright (c) 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. *
+ ****************************************************************************/
+
+/*
+ * def_prog_mode()
+ * def_shell_mode()
+ * reset_prog_mode()
+ * reset_shell_mode()
+ * savetty()
+ * resetty()
+ */
+
+#include <curses.priv.h>
+#include <term.h> /* cur_term */
+
+MODULE_ID("$Id: lib_ttyflags.c,v 1.2 1999/07/24 22:36:12 tom Exp $")
+
+#undef tabs
+
+#ifdef TAB3
+# define tabs TAB3
+#else
+# ifdef XTABS
+# define tabs XTABS
+# else
+# ifdef OXTABS
+# define tabs OXTABS
+# else
+# define tabs 0
+# endif
+# endif
+#endif
+
+int _nc_get_tty_mode(TTY *buf)
+{
+ if (cur_term == 0
+ || GET_TTY(cur_term->Filedes, buf) != 0)
+ return(ERR);
+ TR(TRACE_BITS,("_nc_get_tty_mode: %s", _nc_tracebits()));
+ return (OK);
+}
+
+int _nc_set_tty_mode(TTY *buf)
+{
+ if (cur_term == 0
+ || SET_TTY(cur_term->Filedes, buf) != 0)
+ return(ERR);
+ TR(TRACE_BITS,("_nc_set_tty_mode: %s", _nc_tracebits()));
+ return (OK);
+}
+
+int def_shell_mode(void)
+{
+ T((T_CALLED("def_shell_mode()")));
+
+ /*
+ * Turn off the XTABS bit in the tty structure if it was on. If XTABS
+ * was on, remove the tab and backtab capabilities.
+ */
+
+ if (_nc_get_tty_mode(&cur_term->Ottyb) != OK)
+ returnCode(ERR);
+#ifdef TERMIOS
+ if (cur_term->Ottyb.c_oflag & tabs)
+ tab = back_tab = NULL;
+#else
+ if (cur_term->Ottyb.sg_flags & XTABS)
+ tab = back_tab = NULL;
+#endif
+ returnCode(OK);
+}
+
+int def_prog_mode(void)
+{
+ T((T_CALLED("def_prog_mode()")));
+
+ if (_nc_get_tty_mode(&cur_term->Nttyb) != OK)
+ returnCode(ERR);
+#ifdef TERMIOS
+ cur_term->Nttyb.c_oflag &= ~tabs;
+#else
+ cur_term->Nttyb.sg_flags &= ~XTABS;
+#endif
+ returnCode(OK);
+}
+
+int reset_prog_mode(void)
+{
+ T((T_CALLED("reset_prog_mode()")));
+
+ if (cur_term != 0) {
+ _nc_set_tty_mode(&cur_term->Nttyb);
+ if (SP) {
+ if (stdscr && stdscr->_use_keypad)
+ _nc_keypad(TRUE);
+ NC_BUFFERED(TRUE);
+ }
+ returnCode(OK);
+ }
+ returnCode(ERR);
+}
+
+int reset_shell_mode(void)
+{
+ T((T_CALLED("reset_shell_mode()")));
+
+ if (cur_term != 0) {
+ if (SP)
+ {
+ _nc_keypad(FALSE);
+ fflush(SP->_ofp);
+ NC_BUFFERED(FALSE);
+ }
+ returnCode(_nc_set_tty_mode(&cur_term->Ottyb));
+ }
+ returnCode(ERR);
+}
+
+/*
+** savetty() and resetty()
+**
+*/
+
+static TTY buf;
+
+int savetty(void)
+{
+ T((T_CALLED("savetty()")));
+
+ returnCode(_nc_get_tty_mode(&buf));
+}
+
+int resetty(void)
+{
+ T((T_CALLED("resetty()")));
+
+ returnCode(_nc_set_tty_mode(&buf));
+}
diff --git a/contrib/ncurses/ncurses/tinfo/make_keys.c b/contrib/ncurses/ncurses/tinfo/make_keys.c
new file mode 100644
index 000000000000..e62738503dcf
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/make_keys.c
@@ -0,0 +1,131 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+
+/*
+ * 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.
+ */
+#include <curses.priv.h>
+
+MODULE_ID("$Id: make_keys.c,v 1.6 1999/02/22 16:55:20 tom Exp $")
+
+#include <names.c>
+
+#define UNKNOWN (SIZEOF(strnames) + SIZEOF(strfnames))
+
+static size_t lookup(const char *name)
+{
+ size_t 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[BUFSIZ];
+ char to[BUFSIZ];
+ int maxlen = 16;
+
+ while (fgets(buffer, sizeof(buffer), ifp) != 0) {
+ if (*buffer == '#')
+ continue;
+ if (sscanf(buffer, "%s %s", to, from) == 2) {
+ int code = lookup(from);
+ if (code == UNKNOWN)
+ continue;
+ if ((int)strlen(from) > maxlen)
+ maxlen = strlen(from);
+ fprintf(ofp, "\t{ %4d, %-*.*s },\t/* %s */\n",
+ code,
+ maxlen, 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 NCU_KEYS_H",
+ "#define NCU_KEYS_H 1",
+ "",
+ "/* This file was generated by MAKE_KEYS */",
+ "",
+ "struct tinfo_fkeys _nc_tinfo_fkeys[] = {",
+ 0
+ };
+ static const char *suffix[] = {
+ "\t{ 0, 0} };",
+ "",
+ "#endif /* NCU_KEYS_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/contrib/ncurses/ncurses/tinfo/name_match.c b/contrib/ncurses/ncurses/tinfo/name_match.c
new file mode 100644
index 000000000000..a9e8396959d1
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/name_match.c
@@ -0,0 +1,96 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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>
+#include <term.h>
+#include <tic.h>
+
+MODULE_ID("$Id: name_match.c,v 1.8 1999/03/07 01:58:36 tom Exp $")
+
+/*
+ * _nc_first_name(char *names)
+ *
+ * Extract the primary name from a compiled entry.
+ */
+
+char *_nc_first_name(const char *const sp)
+/* get the first name from the given name list */
+{
+ static char buf[MAX_NAME_SIZE+1];
+ register unsigned n;
+
+ for (n = 0; n < sizeof(buf)-1; n++) {
+ if ((buf[n] = sp[n]) == '\0'
+ || (buf[n] == '|'))
+ break;
+ }
+ buf[n] = '\0';
+ return(buf);
+}
+
+/*
+ * int _nc_name_match(namelist, name, delim)
+ *
+ * Is the given name matched in namelist?
+ */
+
+int _nc_name_match(const char *const namelst, const char *const name, const char *const delim)
+{
+ const char *s, *d, *t;
+ int code, found;
+
+ if ((s = namelst) != 0) {
+ while (*s != '\0') {
+ 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/contrib/ncurses/ncurses/tinfo/parse_entry.c b/contrib/ncurses/ncurses/tinfo/parse_entry.c
new file mode 100644
index 000000000000..07f3868e0b44
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/parse_entry.c
@@ -0,0 +1,1047 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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> *
+ ****************************************************************************/
+
+
+/*
+ * 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.
+ */
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+#include <tic.h>
+#define __INTERNAL_CAPS_VISIBLE
+#include <term_entry.h>
+
+MODULE_ID("$Id: parse_entry.c,v 1.39 1999/03/01 02:28:51 tom Exp $")
+
+#ifdef LINT
+static short const parametrized[] = { 0 };
+#else
+#include <parametrized.h>
+#endif
+
+struct token _nc_curr_token;
+
+static void postprocess_termcap(TERMTYPE *, bool);
+static void postprocess_terminfo(TERMTYPE *);
+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, char *name, int token_type)
+{
+ static struct name_table_entry temp;
+ TERMTYPE *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 = tp->ext_Booleans + tp->ext_Numbers;
+ tindex = tp->num_Numbers;
+ break;
+ case STRING:
+ first = tp->ext_Booleans + tp->ext_Numbers;
+ last = tp->ext_Strings + first;
+ offset = 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;
+ }
+ }
+ if (!found) {
+ switch (token_type) {
+ case BOOLEAN:
+ tp->ext_Booleans += 1;
+ tp->num_Booleans += 1;
+ tp->Booleans = typeRealloc(char, tp->num_Booleans, tp->Booleans);
+ for (last = tp->num_Booleans-1; last > tindex; last--)
+ tp->Booleans[last] = tp->Booleans[last-1];
+ break;
+ case NUMBER:
+ tp->ext_Numbers += 1;
+ tp->num_Numbers += 1;
+ tp->Numbers = typeRealloc(short, tp->num_Numbers, tp->Numbers);
+ for (last = tp->num_Numbers-1; last > tindex; last--)
+ tp->Numbers[last] = tp->Numbers[last-1];
+ break;
+ case STRING:
+ tp->ext_Strings += 1;
+ tp->num_Strings += 1;
+ tp->Strings = typeRealloc(char *, tp->num_Strings, tp->Strings);
+ for (last = tp->num_Strings-1; last > tindex; last--)
+ tp->Strings[last] = tp->Strings[last-1];
+ break;
+ }
+ actual = NUM_EXT_NAMES(tp);
+ tp->ext_Names = typeRealloc(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 = tindex;
+ temp.nte_link = -1;
+
+ return &temp;
+}
+#endif /* NCURSES_XNAMES */
+
+/*
+ * 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 existance and type-correctness
+ * enter cap into structure
+ * if STRING
+ * save string in entry's string table
+ * push back token
+ */
+
+int _nc_parse_entry(struct entry *entryp, int literal, bool silent)
+{
+ int token_type;
+ struct name_table_entry const *entry_ptr;
+ char *ptr, namecpy[MAX_NAME_SIZE+1];
+
+ token_type = _nc_get_token();
+
+ if (token_type == EOF)
+ return(EOF);
+ if (token_type != NAMES)
+ _nc_err_abort("Entry does not start with terminal names in column one");
+
+ _nc_init_entry(&entryp->tterm);
+
+ 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));
+
+ /* junk the 2-character termcap name, if present */
+ ptr = _nc_curr_token.tk_name;
+ if (ptr[2] == '|')
+ {
+ ptr = _nc_curr_token.tk_name + 3;
+ _nc_curr_token.tk_name[2] = '\0';
+ }
+
+ entryp->tterm.str_table = entryp->tterm.term_names = _nc_save_str(ptr);
+
+ DEBUG(1, ("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.
+ */
+ _nc_set_type(_nc_first_name(entryp->tterm.term_names));
+
+ /* check for overly-long names and aliases */
+ (void) strncpy(namecpy, entryp->tterm.term_names, MAX_NAME_SIZE);
+ namecpy[MAX_NAME_SIZE] = '\0';
+ if ((ptr = strrchr(namecpy, '|')) != (char *)0)
+ *ptr = '\0';
+ ptr = strtok(namecpy, "|");
+ if (strlen(ptr) > MAX_ALIAS)
+ _nc_warning("primary name may be too long");
+ while ((ptr = strtok((char *)0, "|")) != (char *)0)
+ if (strlen(ptr) > MAX_ALIAS)
+ _nc_warning("alias `%s' may be too long", ptr);
+
+ entryp->nuses = 0;
+
+ for (token_type = _nc_get_token();
+ token_type != EOF && token_type != NAMES;
+ token_type = _nc_get_token())
+ {
+ if (strcmp(_nc_curr_token.tk_name, "use") == 0
+ || strcmp(_nc_curr_token.tk_name, "tc") == 0) {
+ entryp->uses[entryp->nuses].parent = (void *)_nc_save_str(_nc_curr_token.tk_valstring);
+ entryp->uses[entryp->nuses].line = _nc_curr_line;
+ entryp->nuses++;
+ } else {
+ /* normal token lookup */
+ entry_ptr = _nc_find_entry(_nc_curr_token.tk_name,
+ _nc_syntax ? _nc_cap_hash_table : _nc_info_hash_table);
+
+ /*
+ * Our kluge to handle aliasing. The reason it's 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)
+ {
+ for (ap = _nc_capalias_table; 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_cap_hash_table);
+ 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_infoalias_table; 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_info_hash_table);
+ 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
+ && (entry_ptr = _nc_extend_names(entryp, _nc_curr_token.tk_name, token_type)) != 0) {
+ _nc_warning("extended capability '%s'", _nc_curr_token.tk_name);
+ }
+#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 && 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.
+ */
+
+ /* tell max_attributes from arrow_key_map */
+ if (token_type == NUMBER && !strcmp("ma", _nc_curr_token.tk_name))
+ entry_ptr = _nc_find_type_entry("ma", NUMBER,
+ _nc_get_table(_nc_syntax != 0));
+
+ /* map terminfo's string MT to MT */
+ else if (token_type==STRING &&!strcmp("MT",_nc_curr_token.tk_name))
+ entry_ptr = _nc_find_type_entry("MT", STRING,
+ _nc_get_table(_nc_syntax != 0));
+
+ /* treat strings without following "=" as empty strings */
+ else if (token_type==BOOLEAN && entry_ptr->nte_type==STRING)
+ token_type = STRING;
+ /* we couldn't recover; skip this token */
+ else
+ {
+ 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:
+ entryp->tterm.Numbers[entry_ptr->nte_index] =
+ _nc_curr_token.tk_valnumber;
+ break;
+
+ case STRING:
+ ptr = _nc_curr_token.tk_valstring;
+ if (_nc_syntax==SYN_TERMCAP)
+ ptr = _nc_captoinfo(_nc_curr_token.tk_name,
+ ptr,
+ parametrized[entry_ptr->nte_index]);
+ entryp->tterm.Strings[entry_ptr->nte_index] = _nc_save_str(ptr);
+ break;
+
+ default:
+ if (!silent)
+ _nc_warning("unknown token type");
+ _nc_panic_mode((_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;
+ int i;
+
+ /*
+ * 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
+ /*
+ * Otherwise, look for a base entry that will already
+ * have picked up defaults via translation.
+ */
+ for (i = 0; i < entryp->nuses; i++)
+ if (!strchr((char *)entryp->uses[i].parent, '+'))
+ has_base_entry = TRUE;
+
+ postprocess_termcap(&entryp->tterm, has_base_entry);
+ }
+ else
+ postprocess_terminfo(&entryp->tterm);
+ }
+ _nc_wrap_entry(entryp);
+
+ return(OK);
+}
+
+int _nc_capcmp(const char *s, const char *t)
+/* compare two string capabilities, stripping out padding */
+{
+ if (!s && !t)
+ return(0);
+ else if (!s || !t)
+ return(1);
+
+ for (;;)
+ {
+ if (s[0] == '$' && s[1] == '<')
+ {
+ for (s += 2; ; s++)
+ if (!(isdigit(*s) || *s=='.' || *s=='*' || *s=='/' || *s=='>'))
+ break;
+ }
+
+ if (t[0] == '$' && t[1] == '<')
+ {
+ for (t += 2; ; t++)
+ if (!(isdigit(*t) || *t=='.' || *t=='*' || *t=='/' || *t=='>'))
+ break;
+ }
+
+ /* we've now pushed s and t past any padding they were pointing 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++;
+ }
+}
+
+/*
+ * 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.
+ */
+typedef struct {const char *from; const char *to;} assoc;
+static assoc const ko_xlate[] =
+{
+ {"al", "kil1"}, /* insert line key -> KEY_IL */
+ {"bt", "kcbt"}, /* back tab -> KEY_BTAB */
+ {"cd", "ked"}, /* clear-to-eos key -> KEY_EOL */
+ {"ce", "kel"}, /* clear-to-eol key -> KEY_EOS */
+ {"cl", "kclr"}, /* clear key -> KEY_CLEAR */
+ {"ct", "tbc"}, /* clear all tabs -> KEY_CATAB */
+ {"dc", "kdch1"}, /* delete char -> KEY_DC */
+ {"dl", "kdl1"}, /* delete line -> KEY_DL */
+ {"do", "kcud1"}, /* down key -> KEY_DOWN */
+ {"ei", "krmir"}, /* exit insert key -> KEY_EIC */
+ {"ho", "khome"}, /* home key -> KEY_HOME */
+ {"ic", "kich1"}, /* insert char key -> KEY_IC */
+ {"im", "kIC"}, /* insert-mode key -> KEY_SIC */
+ {"le", "kcub1"}, /* le key -> KEY_LEFT */
+ {"nd", "kcuf1"}, /* nd key -> KEY_RIGHT */
+ {"nl", "kent"}, /* new line key -> KEY_ENTER */
+ {"st", "khts"}, /* set-tab key -> KEY_STAB */
+ {"ta", CANCELLED_STRING},
+ {"up", "kcuu1"}, /* up-arrow key -> KEY_UP */
+ {(char *)0, (char *)0},
+};
+
+/*
+ * 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";
+
+/*
+ * Note that WANTED and PRESENT are not simple inverses! If a capability
+ * has been explicitly cancelled, it's not considered WANTED.
+ */
+#define WANTED(s) ((s) == ABSENT_STRING)
+#define PRESENT(s) (((s) != ABSENT_STRING) && ((s) != CANCELLED_STRING))
+
+/*
+ * 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(TERMTYPE *tp, bool has_base)
+{
+ char buf[MAX_LINE * 2 + 2];
+
+ /*
+ * 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) && termcap_init2)
+ init_3string = _nc_save_str(termcap_init2);
+
+ if (WANTED(reset_2string) && termcap_reset)
+ reset_2string = _nc_save_str(termcap_reset);
+
+ if (WANTED(carriage_return)) {
+ if (carriage_return_delay > 0) {
+ sprintf(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) {
+ sprintf(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 seems 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) {
+ sprintf(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) {
+ sprintf(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) {
+ sprintf(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)) {
+ strncpy(buf, carriage_return, MAX_LINE-2);
+ buf[MAX_LINE-1] = '\0';
+ strncat(buf, scroll_forward, MAX_LINE-strlen(buf)-1);
+ buf[MAX_LINE] = '\0';
+ newline = _nc_save_str(buf);
+ } else if (PRESENT(carriage_return) && PRESENT(cursor_down)) {
+ strncpy(buf, carriage_return, MAX_LINE-2);
+ buf[MAX_LINE-1] = '\0';
+ strncat(buf, cursor_down, MAX_LINE-strlen(buf)-1);
+ buf[MAX_LINE] = '\0';
+ 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) {
+ sprintf(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 (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 *dp, *cp = strtok(other_non_function_keys, ",");
+ struct name_table_entry const *from_ptr;
+ struct name_table_entry const *to_ptr;
+ assoc const *ap;
+ 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 && dp[1] == 'm';
+
+ /* look at each comma-separated capability in the ko string... */
+ do {
+ for (ap = ko_xlate; ap->from; ap++)
+ if (strcmp(ap->from, cp) == 0)
+ break;
+ if (!ap->to)
+ {
+ _nc_warning("unknown capability `%s' in ko string", cp);
+ continue;
+ }
+ else if (ap->to == CANCELLED_STRING) /* ignore it */
+ continue;
+
+ /* now we know we found a match in ko_table, so... */
+
+ from_ptr = _nc_find_entry(ap->from, _nc_cap_hash_table);
+ to_ptr = _nc_find_entry(ap->to, _nc_info_hash_table);
+
+ 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])
+ {
+ /* There's no point in warning about it if it's the same
+ * string; that's just an inefficiency.
+ */
+ if (strcmp(
+ tp->Strings[from_ptr->nte_index],
+ tp->Strings[to_ptr->nte_index]) != 0)
+ _nc_warning("%s (%s) already has an explicit value %s, ignoring ko",
+ ap->to, ap->from,
+ _nc_visbuf(tp->Strings[to_ptr->nte_index]) );
+ continue;
+ }
+
+ /*
+ * The magic moment -- copy the mapped key string over,
+ * stripping out padding.
+ */
+ dp = buf2;
+ for (cp = tp->Strings[from_ptr->nte_index]; *cp; cp++)
+ {
+ if (cp[0] == '$' && cp[1] == '<')
+ {
+ while (*cp && *cp != '>')
+ if (!*cp)
+ break;
+ else
+ ++cp;
+ }
+ else
+ *dp++ = *cp;
+ }
+ *dp++ = '\0';
+
+ tp->Strings[to_ptr->nte_index] = _nc_save_str(buf2);
+ } while
+ ((cp = strtok((char *)0, ",")) != 0);
+
+ /*
+ * 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) && key_sic)
+ {
+ key_ic = key_sic;
+ key_sic = ABSENT_STRING;
+ }
+ }
+
+ 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], *bp = buf2;
+
+ if (acs_chars)
+ {
+ (void)strcpy(bp, acs_chars);
+ bp += strlen(bp);
+ }
+
+ if (acs_ulcorner && acs_ulcorner[1] == '\0')
+ {
+ *bp++ = 'l';
+ *bp++ = *acs_ulcorner;
+ }
+ if (acs_llcorner && acs_llcorner[1] == '\0')
+ {
+ *bp++ = 'm';
+ *bp++ = *acs_llcorner;
+ }
+ if (acs_urcorner && acs_urcorner[1] == '\0')
+ {
+ *bp++ = 'k';
+ *bp++ = *acs_urcorner;
+ }
+ if (acs_lrcorner && acs_lrcorner[1] == '\0')
+ {
+ *bp++ = 'j';
+ *bp++ = *acs_lrcorner;
+ }
+ if (acs_ltee && acs_ltee[1] == '\0')
+ {
+ *bp++ = 't';
+ *bp++ = *acs_ltee;
+ }
+ if (acs_rtee && acs_rtee[1] == '\0')
+ {
+ *bp++ = 'u';
+ *bp++ = *acs_rtee;
+ }
+ if (acs_btee && acs_btee[1] == '\0')
+ {
+ *bp++ = 'v';
+ *bp++ = *acs_btee;
+ }
+ if (acs_ttee && acs_ttee[1] == '\0')
+ {
+ *bp++ = 'w';
+ *bp++ = *acs_ttee;
+ }
+ if (acs_hline && acs_hline[1] == '\0')
+ {
+ *bp++ = 'q';
+ *bp++ = *acs_hline;
+ }
+ if (acs_vline && acs_vline[1] == '\0')
+ {
+ *bp++ = 'x';
+ *bp++ = *acs_vline;
+ }
+ if (acs_plus)
+ {
+ *bp++ = 'n';
+ strcpy(bp, acs_plus);
+ bp = buf2 + strlen(buf2);
+ }
+
+ if (bp != buf2)
+ {
+ *bp++ = '\0';
+ acs_chars = _nc_save_str(buf2);
+ _nc_warning("acsc string synthesized from XENIX capabilities");
+ }
+ }
+ else if (acs_chars == 0
+ && enter_alt_charset_mode != 0
+ && exit_alt_charset_mode != 0)
+ {
+ acs_chars = _nc_save_str("``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~");
+ }
+}
+
+static
+void postprocess_terminfo(TERMTYPE *tp)
+{
+ /*
+ * TERMINFO-TO-TERMINFO MAPPINGS FOR SOURCE TRANSLATION
+ * ----------------------------------------------------------------------
+ */
+
+ /*
+ * Translate AIX forms characters.
+ */
+ if (PRESENT(box_chars_1))
+ {
+ char buf2[MAX_TERMCAP_LENGTH], *bp = buf2;
+
+ if (acs_chars)
+ {
+ (void)strcpy(bp, acs_chars);
+ bp += strlen(bp);
+ }
+
+ if (box_chars_1[0]) /* ACS_ULCORNER */
+ {
+ *bp++ = 'l';
+ *bp++ = box_chars_1[0];
+ }
+ if (box_chars_1[1]) /* ACS_HLINE */
+ {
+ *bp++ = 'q';
+ *bp++ = box_chars_1[1];
+ }
+ if (box_chars_1[2]) /* ACS_URCORNER */
+ {
+ *bp++ = 'k';
+ *bp++ = box_chars_1[2];
+ }
+ if (box_chars_1[3]) /* ACS_VLINE */
+ {
+ *bp++ = 'x';
+ *bp++ = box_chars_1[3];
+ }
+ if (box_chars_1[4]) /* ACS_LRCORNER */
+ {
+ *bp++ = 'j';
+ *bp++ = box_chars_1[4];
+ }
+ if (box_chars_1[5]) /* ACS_LLCORNER */
+ {
+ *bp++ = 'm';
+ *bp++ = box_chars_1[5];
+ }
+ if (box_chars_1[6]) /* ACS_TTEE */
+ {
+ *bp++ = 'w';
+ *bp++ = box_chars_1[6];
+ }
+ if (box_chars_1[7]) /* ACS_RTEE */
+ {
+ *bp++ = 'u';
+ *bp++ = box_chars_1[7];
+ }
+ if (box_chars_1[8]) /* ACS_BTEE */
+ {
+ *bp++ = 'v';
+ *bp++ = box_chars_1[8];
+ }
+ if (box_chars_1[9]) /* ACS_LTEE */
+ {
+ *bp++ = 't';
+ *bp++ = box_chars_1[9];
+ }
+ if (box_chars_1[10]) /* ACS_PLUS */
+ {
+ *bp++ = 'n';
+ *bp++ = box_chars_1[10];
+ }
+
+ if (bp != buf2)
+ {
+ *bp++ = '\0';
+ acs_chars = _nc_save_str(buf2);
+ _nc_warning("acsc string synthesized from AIX capabilities");
+ box_chars_1 = ABSENT_STRING;
+ }
+ }
+ /*
+ * ----------------------------------------------------------------------
+ */
+}
+
+/*
+ * 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/contrib/ncurses/ncurses/tinfo/read_entry.c b/contrib/ncurses/ncurses/tinfo/read_entry.c
new file mode 100644
index 000000000000..f60a4863bdf8
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/read_entry.c
@@ -0,0 +1,482 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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> *
+ ****************************************************************************/
+
+
+
+/*
+ * read_entry.c -- Routine for reading in a compiled terminfo file
+ *
+ */
+
+#include <curses.priv.h>
+
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <tic.h>
+#include <term_entry.h>
+
+MODULE_ID("$Id: read_entry.c,v 1.61 1999/07/24 20:07:20 tom Exp $")
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#if 0
+#define TRACE_IN(p) DEBUG(2, p)
+#else
+#define TRACE_IN(p) /*nothing*/
+#endif
+
+/*
+ * 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.
+ */
+
+#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))
+
+static bool have_tic_directory = FALSE;
+static bool keep_tic_directory = FALSE;
+
+/*
+ * Record the "official" location of the terminfo directory, according to
+ * the place where we're writing to, or the normal default, if not.
+ */
+const char *_nc_tic_dir(const char *path)
+{
+ static const char *result = TERMINFO;
+
+ if (!keep_tic_directory) {
+ if (path != 0) {
+ result = path;
+ have_tic_directory = TRUE;
+ } else if (!have_tic_directory) {
+ char *envp;
+ if ((envp = getenv("TERMINFO")) != 0)
+ return _nc_tic_dir(envp);
+ }
+ }
+ return result;
+}
+
+/*
+ * 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.
+ */
+void _nc_keep_tic_dir(const char *path)
+{
+ _nc_tic_dir(path);
+ keep_tic_directory = TRUE;
+}
+
+static void convert_shorts(char *buf, short *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] = LOW_MSB(buf + 2*i);
+ TRACE_IN(("get Numbers[%d]=%d", i, Numbers[i]));
+ }
+}
+
+static void convert_strings(char *buf, char **Strings, int count, int size, char *table)
+{
+ int i;
+ char *p;
+
+ 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 (LOW_MSB(buf + 2*i) > size) {
+ Strings[i] = ABSENT_STRING;
+ } else {
+ Strings[i] = (LOW_MSB(buf+2*i) + table);
+ TRACE_IN(("Strings[%d] = %s", i, _nc_visbuf(Strings[i])));
+ }
+
+ /* 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;
+ }
+ }
+}
+
+#define read_shorts(fd, buf, count) (read(fd, buf, (count)*2) == (count)*2)
+
+#define even_boundary(value) \
+ if ((value) % 2 != 0) read(fd, buf, 1)
+
+static int read_termtype(int fd, TERMTYPE *ptr)
+/* return 1 if read, 0 if not found or garbled */
+{
+ int name_size, bool_count, num_count, str_count, str_size;
+ int i;
+ char buf[MAX_ENTRY_SIZE];
+
+ TRACE_IN(("READ termtype header @%d", tell(fd)));
+
+ /* grab the header */
+ if (!read_shorts(fd, buf, 6)
+ || LOW_MSB(buf) != MAGIC) {
+ return(0);
+ }
+
+ _nc_free_termtype(ptr);
+ name_size = LOW_MSB(buf + 2);
+ bool_count = LOW_MSB(buf + 4);
+ num_count = LOW_MSB(buf + 6);
+ str_count = LOW_MSB(buf + 8);
+ str_size = LOW_MSB(buf + 10);
+
+ TRACE_IN(("header is %d/%d/%d/%d(%d)", name_size, bool_count, num_count, str_count, str_size));
+ if (name_size < 0
+ || bool_count < 0
+ || num_count < 0
+ || str_count < 0
+ || str_size < 0) {
+ return(0);
+ }
+
+ if (str_size) {
+ /* try to allocate space for the string table */
+ if (str_count*2 >= (int) sizeof(buf)
+ || (ptr->str_table = typeMalloc(char, (unsigned)str_size)) == 0) {
+ return(0);
+ }
+ } else {
+ str_count = 0;
+ }
+
+ /* grab the name (a null-terminate string) */
+ read(fd, buf, min(MAX_NAME_SIZE, (unsigned)name_size));
+ buf[MAX_NAME_SIZE] = '\0';
+ ptr->term_names = typeCalloc(char, strlen(buf) + 1);
+ if (ptr->term_names == NULL) {
+ return(0);
+ }
+ (void) strcpy(ptr->term_names, buf);
+ if (name_size > MAX_NAME_SIZE)
+ lseek(fd, (off_t) (name_size - MAX_NAME_SIZE), 1);
+
+ /* grab the booleans */
+ if ((ptr->Booleans = typeCalloc(char, max(BOOLCOUNT, bool_count))) == 0
+ || read(fd, ptr->Booleans, (unsigned)bool_count) < bool_count) {
+ return(0);
+ }
+
+ /*
+ * 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 */
+ if ((ptr->Numbers = typeCalloc(short, max(NUMCOUNT, num_count))) == 0
+ || !read_shorts(fd, buf, num_count)) {
+ return(0);
+ }
+ convert_shorts(buf, ptr->Numbers, num_count);
+
+ if ((ptr->Strings = typeCalloc(char *, max(STRCOUNT, str_count))) == 0)
+ return(0);
+
+ if (str_count)
+ {
+ /* grab the string offsets */
+ if (!read_shorts(fd, buf, str_count)) {
+ return(0);
+ }
+ /* finally, grab the string table itself */
+ if (read(fd, ptr->str_table, (unsigned)str_size) != str_size)
+ return(0);
+ convert_strings(buf, ptr->Strings, str_count, str_size, ptr->str_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);
+ TRACE_IN(("READ extended_header @%d", tell(fd)));
+ if (_nc_user_definable && read_shorts(fd, buf, 5)) {
+ int ext_bool_count = LOW_MSB(buf + 0);
+ int ext_num_count = LOW_MSB(buf + 2);
+ int ext_str_count = LOW_MSB(buf + 4);
+ int ext_str_size = LOW_MSB(buf + 6);
+ int ext_str_limit = LOW_MSB(buf + 8);
+ int need = (ext_bool_count + ext_num_count + ext_str_count);
+ int base = 0;
+
+ if (need >= (int) sizeof(buf)
+ || ext_str_size >= (int) sizeof(buf)
+ || ext_str_limit >= (int) sizeof(buf)
+ || ext_bool_count < 0
+ || ext_num_count < 0
+ || ext_str_count < 0
+ || ext_str_size < 0
+ || ext_str_limit < 0)
+ return(0);
+
+ ptr->num_Booleans = BOOLCOUNT + ext_bool_count;
+ ptr->num_Numbers = NUMCOUNT + ext_num_count;
+ ptr->num_Strings = STRCOUNT + ext_str_count;
+
+ ptr->Booleans = typeRealloc(char, ptr->num_Booleans,ptr->Booleans);
+ ptr->Numbers = typeRealloc(short, ptr->num_Numbers, ptr->Numbers);
+ ptr->Strings = typeRealloc(char*, ptr->num_Strings, ptr->Strings);
+
+ TRACE_IN(("extended header is %d/%d/%d(%d:%d)", ext_bool_count, ext_num_count, ext_str_count, ext_str_size, ext_str_limit));
+
+ TRACE_IN(("READ %d extended-booleans @%d", ext_bool_count, tell(fd)));
+ if ((ptr->ext_Booleans = ext_bool_count) != 0) {
+ if (read(fd, ptr->Booleans + BOOLCOUNT, (unsigned)ext_bool_count) != ext_bool_count)
+ return(0);
+ }
+ even_boundary(ext_bool_count);
+
+ TRACE_IN(("READ %d extended-numbers @%d", ext_num_count, tell(fd)));
+ if ((ptr->ext_Numbers = ext_num_count) != 0) {
+ if (!read_shorts(fd, buf, ext_num_count))
+ return(0);
+ TRACE_IN(("Before converting extended-numbers"));
+ convert_shorts(buf, ptr->Numbers + NUMCOUNT, ext_num_count);
+ }
+
+ TRACE_IN(("READ extended-offsets @%d", tell(fd)));
+ if ((ext_str_count || need)
+ && !read_shorts(fd, buf, ext_str_count+need))
+ return(0);
+
+ TRACE_IN(("READ %d bytes of extended-strings @%d", ext_str_limit, tell(fd)));
+ if (ext_str_limit) {
+ if ((ptr->ext_str_table = typeMalloc(char, ext_str_limit)) == 0)
+ return(0);
+ if (read(fd, ptr->ext_str_table, ext_str_limit) != ext_str_limit)
+ return(0);
+ TRACE_IN(("first extended-string is %s", _nc_visbuf(ptr->ext_str_table)));
+ }
+
+ if ((ptr->ext_Strings = ext_str_count) != 0) {
+ TRACE_IN(("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--) {
+ TRACE_IN(("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 += (strlen(ptr->Strings[i+STRCOUNT]) + 1);
+ TRACE_IN(("... to [%d] %s", i+STRCOUNT, _nc_visbuf(ptr->Strings[i+STRCOUNT])));
+ }
+ }
+
+ if (need) {
+ if ((ptr->ext_Names = typeCalloc(char *, need)) == 0)
+ return(0);
+ TRACE_IN(("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, need, ext_str_limit, ptr->ext_str_table + base);
+ }
+
+ T(("...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));
+
+ TRACE_IN(("extend: num_Booleans:%d", ptr->num_Booleans));
+ } else
+#endif /* NCURSES_XNAMES */
+ {
+ T(("...done reading terminfo bool %d num %d str %d",
+ bool_count,
+ num_count,
+ str_count));
+ TRACE_IN(("normal: num_Booleans:%d", ptr->num_Booleans));
+ }
+
+ 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;
+
+ return(1);
+}
+
+int _nc_read_file_entry(const char *const filename, TERMTYPE *ptr)
+/* return 1 if read, 0 if not found or garbled */
+{
+ int code, fd = -1;
+
+ if (_nc_access(filename, R_OK) < 0
+ || (fd = open(filename, O_RDONLY|O_BINARY)) < 0) {
+ T(("cannot open terminfo %s (errno=%d)", filename, errno));
+ return(0);
+ }
+
+ T(("read terminfo %s", filename));
+ if ((code = read_termtype(fd, ptr)) == 0)
+ _nc_free_termtype(ptr);
+ close(fd);
+
+ return (code);
+}
+
+/*
+ * Build a terminfo pathname and try to read the data. Returns 1 on success,
+ * 0 on failure.
+ */
+static int _nc_read_tic_entry(char *const filename,
+ const char *const dir, const char *ttn, TERMTYPE *const tp)
+{
+/* maximum safe length of terminfo root directory name */
+#define MAX_TPATH (PATH_MAX - MAX_ALIAS - 6)
+
+ if (strlen(dir) > MAX_TPATH)
+ return 0;
+ (void) sprintf(filename, "%s/%s", dir, ttn);
+ return _nc_read_file_entry(filename, tp);
+}
+
+/*
+ * Process the list of :-separated directories, looking for the terminal type.
+ * We don't use strtok because it does not show us empty tokens.
+ */
+static int _nc_read_terminfo_dirs(const char *dirs, char *const filename, const char *const ttn, TERMTYPE *const tp)
+{
+ char *list, *a;
+ const char *b;
+ int code = 0;
+
+ /* we'll modify the argument, so we must copy */
+ if ((b = a = list = strdup(dirs)) == NULL)
+ return(0);
+
+ for (;;) {
+ int c = *a;
+ if (c == 0 || c == ':') {
+ *a = 0;
+ if ((b + 1) >= a)
+ b = TERMINFO;
+ if (_nc_read_tic_entry(filename, b, ttn, tp) == 1) {
+ code = 1;
+ break;
+ }
+ b = a + 1;
+ if (c == 0)
+ break;
+ }
+ a++;
+ }
+
+ free(list);
+ return(code);
+}
+
+/*
+ * _nc_read_entry(char *tn, char *filename, TERMTYPE *tp)
+ *
+ * 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.
+ */
+
+int _nc_read_entry(const char *const tn, char *const filename, TERMTYPE *const tp)
+{
+char *envp;
+char ttn[MAX_ALIAS + 3];
+
+ /* truncate the terminal name to prevent dangerous buffer airline */
+ (void) sprintf(ttn, "%c/%.*s", *tn, MAX_ALIAS, tn);
+
+ /* This is System V behavior, in conjunction with our requirements for
+ * writing terminfo entries.
+ */
+ if (have_tic_directory
+ && _nc_read_tic_entry(filename, _nc_tic_dir(0), ttn, tp) == 1)
+ return 1;
+
+ if ((envp = getenv("TERMINFO")) != 0
+ && _nc_read_tic_entry(filename, _nc_tic_dir(envp), ttn, tp) == 1)
+ return 1;
+
+ if ((envp = _nc_home_terminfo()) != 0) {
+ if (_nc_read_tic_entry(filename, envp, ttn, tp) == 1) {
+ return(1);
+ }
+ }
+
+ /* this is an ncurses extension */
+ if ((envp = getenv("TERMINFO_DIRS")) != 0)
+ return _nc_read_terminfo_dirs(envp, filename, ttn, tp);
+
+ /* Try the system directory. Note that the TERMINFO_DIRS value, if
+ * defined by the configure script, begins with a ":", which will be
+ * interpreted as TERMINFO.
+ */
+#ifdef TERMINFO_DIRS
+ return _nc_read_terminfo_dirs(TERMINFO_DIRS, filename, ttn, tp);
+#else
+ return _nc_read_tic_entry(filename, TERMINFO, ttn, tp);
+#endif
+}
+
diff --git a/contrib/ncurses/ncurses/tinfo/read_termcap.c b/contrib/ncurses/ncurses/tinfo/read_termcap.c
new file mode 100644
index 000000000000..d60a92d63f0a
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/read_termcap.c
@@ -0,0 +1,1116 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * 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 <tic.h>
+#include <term_entry.h>
+
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+MODULE_ID("$Id: read_termcap.c,v 1.43 1999/04/10 20:52:52 tom Exp $")
+
+#ifndef PURE_TERMINFO
+
+#ifdef __EMX__
+#define is_pathname(s) ((((s) != 0) && ((s)[0] == '/')) \
+ || (((s)[0] != 0) && ((s)[1] == ':')))
+#else
+#define is_pathname(s) ((s) != 0 && (s)[0] == '/')
+#endif
+
+#define TC_SUCCESS 0
+#define TC_UNRESOLVED -1
+#define TC_NOT_FOUND -2
+#define TC_SYS_ERR -3
+#define TC_REF_LOOP -4
+
+#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 *, 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. 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[] = "@(#)getcap.c 8.3 (Berkeley) 3/25/94"; */
+
+#define BFRAG 1024
+#define BSIZE 1024
+#define ESC ('[' & 037) /* ASCII ESC */
+#define MAX_RECURSION 32 /* maximum getent recursion */
+#define SFRAG 100 /* cgetstr mallocs in SFRAG chunks */
+
+#define RECOK (char)0
+#define TCERR (char)1
+#define SHADOW (char)2
+
+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;
+ (void)strcpy(toprec, ent);
+ 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's 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_UNRESOLVED if we had too many recurrences to resolve
+ * 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
+ */
+static int
+_nc_cgetent(char **buf, int *oline, char **db_array, const char *name)
+{
+ unsigned int 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 int *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);
+ }
+ (void)strcpy(record, toprec);
+ 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 = 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++;
+ if (rp == record || *(rp-1) != '\\')
+ break;
+ }
+ *rp++ = c;
+
+ /*
+ * Enforce loop invariant: if no room
+ * left in record buffer, try to get
+ * some more.
+ */
+ if (rp >= r_end) {
+ unsigned int pos;
+ size_t newsize;
+
+ pos = rp - record;
+ newsize = 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)
+ 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 int ilen;
+ int diff, iret, tclen, oline;
+ char *icap, *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 = s - tcstart;
+ tcend = s;
+
+ iret = _nc_getent(&icap, &ilen, &oline, current, db_array, fd, tc, depth+1, 0);
+ newicap = icap; /* Put into a register. */
+ newilen = ilen;
+ if (iret != TC_SUCCESS) {
+ /* an error */
+ if (iret < TC_NOT_FOUND) {
+ if (myfd)
+ (void)close(fd);
+ free(record);
+ return (iret);
+ }
+ if (iret == TC_UNRESOLVED)
+ tc_not_resolved = TRUE;
+ /* couldn't resolve tc */
+ 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 -= 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 int pos, tcpos, tcposend;
+ size_t newsize;
+
+ pos = rp - record;
+ newsize = r_end - record + diff + BFRAG;
+ tcpos = tcstart - record;
+ tcposend = 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 = 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)
+
+static char *tbuf;
+
+/*
+ * 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(*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(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(*src))
+ src++;
+ continue;
+ }
+ if (--len == 0) {
+ dst = 0;
+ break;
+ }
+ *dst++ = 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;
+ char **fname;
+ char *home;
+ int i;
+ char pathbuf[PBUFSIZ]; /* holds raw path of filenames */
+ char *pathvec[PVECSIZ]; /* to point to names in pathbuf */
+ char **pvec; /* holds usable tail of path vector */
+ char *termpath;
+
+ fname = pathvec;
+ pvec = pathvec;
+ tbuf = bp;
+ p = pathbuf;
+ cp = getenv("TERMCAP");
+
+ /*
+ * 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.
+ */
+ if (!is_pathname(cp)) { /* no TERMCAP or it holds an entry */
+ if ((termpath = getenv("TERMPATH")) != 0) {
+ strncpy(pathbuf, termpath, PBUFSIZ - 1);
+ } else {
+ if ((home = getenv("HOME")) != 0 &&
+ strlen(home) < PBUFSIZ) { /* setup path */
+ p += strlen(home); /* path, looking in */
+ strcpy(pathbuf, home); /* $HOME first */
+ *p++ = '/';
+ } /* if no $HOME look in current directory */
+#define MY_PATH_DEF ".termcap /etc/termcap /usr/share/misc/termcap"
+ strncpy(p, MY_PATH_DEF, (size_t)(PBUFSIZ - (p - pathbuf) - 1));
+ }
+ }
+ else /* user-defined name in TERMCAP */
+ strncpy(pathbuf, cp, PBUFSIZ - 1); /* still can be tokenized */
+ pathbuf[PBUFSIZ - 1] = '\0';
+
+ *fname++ = pathbuf; /* tokenize path into vector of names */
+ while (*++p) {
+ if (*p == ' ' || *p == ':') {
+ *p = '\0';
+ while (*++p)
+ if (*p != ' ' && *p != ':')
+ break;
+ if (*p == '\0')
+ break;
+ *fname++ = p;
+ if (fname >= pathvec + PVECSIZ) {
+ fname--;
+ break;
+ }
+ }
+ }
+ *fname = 0; /* mark end of vector */
+ if (is_pathname(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)
+ */
+ 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, 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 ((the_source = strdup(pathvec[i])) != 0)
+ *sourcename = the_source;
+ }
+
+ 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)
+{
+ if (count < MAXPATHS
+ && _nc_access(path, R_OK) == 0)
+ termpaths[count++] = path;
+ termpaths[count] = 0;
+ return count;
+}
+#define ADD_TC(path, count) filecount = add_tc(termpaths, path, count)
+#endif /* !USE_GETCAP */
+
+int _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
+{
+ int found = FALSE;
+ ENTRY *ep;
+#if USE_GETCAP_CACHE
+ char cwd_buf[PATH_MAX];
+#endif
+#if USE_GETCAP
+ char tc[TBUFSIZ];
+ static char *source;
+ static int lineno;
+
+ /* we're using getcap(3) */
+ if (_nc_tgetent(tc, &source, &lineno, tn) < 0)
+ return (ERR);
+
+ _nc_curr_line = lineno;
+ _nc_set_source(source);
+ _nc_read_entry_source((FILE *)0, tc, FALSE, FALSE, NULLHOOK);
+#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;
+ bool use_buffer = FALSE;
+ char tc_buf[1024];
+ char pathbuf[PATH_MAX];
+
+ termpaths[filecount] = 0;
+ if ((tc = getenv("TERMCAP")) != 0)
+ {
+ if (is_pathname(tc)) /* interpret as a filename */
+ {
+ ADD_TC(tc, 0);
+ }
+ else if (_nc_name_match(tc, tn, "|:")) /* treat as a capability file */
+ {
+ use_buffer = TRUE;
+ (void) sprintf(tc_buf, "%.*s\n", (int)sizeof(tc_buf)-2, tc);
+ }
+ else if ((tc = getenv("TERMPATH")) != 0)
+ {
+ char *cp;
+
+ for (cp = tc; *cp; cp++)
+ {
+ if (*cp == ':')
+ *cp = '\0';
+ else if (cp == tc || cp[-1] == '\0')
+ {
+ ADD_TC(cp, filecount);
+ }
+ }
+ }
+ }
+ else /* normal case */
+ {
+ char envhome[PATH_MAX], *h;
+
+ filecount = 0;
+
+ /*
+ * Probably /etc/termcap is a symlink to /usr/share/misc/termcap.
+ * Avoid reading the same file twice.
+ */
+ if (_nc_access("/etc/termcap", F_OK) == 0)
+ ADD_TC("/etc/termcap", filecount);
+ else
+ ADD_TC("/usr/share/misc/termcap", filecount);
+
+#define PRIVATE_CAP "%s/.termcap"
+
+ if ((h = getenv("HOME")) != NULL
+ && (strlen(h) + sizeof(PRIVATE_CAP)) < PATH_MAX)
+ {
+ /* user's .termcap, if any, should override it */
+ (void) strcpy(envhome, h);
+ (void) sprintf(pathbuf, PRIVATE_CAP, envhome);
+ ADD_TC(pathbuf, filecount);
+ }
+ }
+
+ /* parse the sources */
+ if (use_buffer)
+ {
+ _nc_set_source("TERMCAP");
+
+ /*
+ * We don't suppress warning messages here. The presumption is
+ * that since it's just a single entry, they won't be a pain.
+ */
+ _nc_read_entry_source((FILE *)0, tc_buf, FALSE, FALSE, NULLHOOK);
+ } else {
+ int i;
+
+ for (i = 0; i < filecount; i++) {
+
+ T(("Looking for %s in %s", tn, termpaths[i]));
+ if ((fp = 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);
+ }
+ }
+ }
+#endif /* USE_GETCAP */
+
+ if (_nc_head == 0)
+ return(ERR);
+
+ /* resolve all use references */
+ _nc_resolve_uses();
+
+ /* 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. Free all entry storage except
+ * the string table for the loaded type (which
+ * we disconnected from the list by NULLing out
+ * ep->tterm.str_table above).
+ */
+ *tp = ep->tterm;
+ ep->tterm.str_table = (char *)0;
+
+ /*
+ * 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 = TRUE;
+ break;
+ }
+ }
+#if USE_GETCAP_CACHE
+ chdir(cwd_buf);
+ }
+#endif
+
+ _nc_free_entries(_nc_head);
+ return(found);
+}
+#else
+extern void _nc_read_termcap(void);
+ void _nc_read_termcap(void) { }
+#endif /* PURE_TERMINFO */
diff --git a/contrib/ncurses/ncurses/tinfo/setbuf.c b/contrib/ncurses/ncurses/tinfo/setbuf.c
new file mode 100644
index 000000000000..c0e735656907
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/setbuf.c
@@ -0,0 +1,144 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+** setbuf.c
+**
+** Support for set_term(), reset_shell_mode(), reset_prog_mode().
+**
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: setbuf.c,v 1.5 1999/02/27 20:00:15 tom Exp $")
+
+/*
+ * If the output file descriptor is connected to a tty (the typical case) it
+ * will probably be line-buffered. Keith Bostic pointed out that we don't want
+ * this; it hoses people running over networks by forcing out a bunch of small
+ * packets instead of one big one, so screen updates on ptys look jerky.
+ * Restore block buffering to prevent this minor lossage.
+ *
+ * The buffer size is a compromise. Ideally we'd like a buffer that can hold
+ * the maximum possible update size (the whole screen plus cup commands to
+ * change lines as it's painted). On a 66-line xterm this can become
+ * excessive. So we min it with the amount of data we think we can get through
+ * two Ethernet packets (maximum packet size - 100 for TCP/IP overhead).
+ *
+ * Why two ethernet packets? It used to be one, on the theory that said
+ * packets define the maximum size of atomic update. But that's less than the
+ * 2000 chars on a 25 x 80 screen, and we don't want local updates to flicker
+ * either. Two packet lengths will handle up to a 35 x 80 screen.
+ *
+ * The magic '6' is the estimated length of the end-of-line cup sequence to go
+ * to the next line. It's generous. We used to mess with the buffering in
+ * init_mvcur() after cost computation, but that lost the sequences emitted by
+ * init_acs() in setupscreen().
+ *
+ * "The setvbuf function may be used only after the stream pointed to by stream
+ * has been associated with an open file and before any other operation is
+ * performed on the stream." (ISO 7.9.5.6.)
+ *
+ * Grrrr...
+ *
+ * On a lighter note, many implementations do in fact allow an application to
+ * reset the buffering after it has been written to. We try to do this because
+ * otherwise we leave stdout in buffered mode after endwin() is called. (This
+ * also happens with SVr4 curses).
+ *
+ * There are pros/cons:
+ *
+ * con:
+ * There is no guarantee that we can reestablish buffering once we've
+ * dropped it.
+ *
+ * We _may_ lose data if the implementation does not coordinate this with
+ * fflush.
+ *
+ * pro:
+ * An implementation is more likely to refuse to change the buffering than
+ * to do it in one of the ways mentioned above.
+ *
+ * The alternative is to have the application try to change buffering
+ * itself, which is certainly no improvement.
+ *
+ * Just in case it does not work well on a particular system, the calls to
+ * change buffering are all via the macro NC_BUFFERED. Some implementations
+ * do indeed get confused by changing setbuf on/off, and will overrun the
+ * buffer. So we disable this by default (there may yet be a workaround).
+ */
+void _nc_set_buffer(FILE *ofp, bool buffered)
+{
+ /* optional optimization hack -- do before any output to ofp */
+#if HAVE_SETVBUF || HAVE_SETBUFFER
+ unsigned buf_len;
+ char *buf_ptr;
+
+ if (getenv("NCURSES_NO_SETBUF") != 0)
+ return;
+
+ fflush(ofp);
+ if ((SP->_buffered = buffered) != 0) {
+ buf_len = min(LINES * (COLS + 6), 2800);
+ if ((buf_ptr = SP->_setbuf) == 0) {
+ if ((buf_ptr = typeMalloc(char, buf_len)) == NULL)
+ return;
+ SP->_setbuf = buf_ptr;
+ /* Don't try to free this! */
+ }
+#if !USE_SETBUF_0
+ else return;
+#endif
+ } else {
+#if !USE_SETBUF_0
+ return;
+#else
+ buf_len = 0;
+ buf_ptr = 0;
+#endif
+ }
+
+#if HAVE_SETVBUF
+#ifdef SETVBUF_REVERSED /* pre-svr3? */
+ (void) setvbuf(ofp, buf_ptr, buf_len, buf_len ? _IOFBF : _IOLBF);
+#else
+ (void) setvbuf(ofp, buf_ptr, buf_len ? _IOFBF : _IOLBF, buf_len);
+#endif
+#elif HAVE_SETBUFFER
+ (void) setbuffer(ofp, buf_ptr, (int)buf_len);
+#endif
+
+#endif /* HAVE_SETVBUF || HAVE_SETBUFFER */
+}
diff --git a/contrib/ncurses/ncurses/tinfo/write_entry.c b/contrib/ncurses/ncurses/tinfo/write_entry.c
new file mode 100644
index 000000000000..4829fa936d01
--- /dev/null
+++ b/contrib/ncurses/ncurses/tinfo/write_entry.c
@@ -0,0 +1,557 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+ * write_entry.c -- write a terminfo structure onto the file system
+ */
+
+#include <curses.priv.h>
+
+#include <sys/stat.h>
+
+#include <tic.h>
+#include <term_entry.h>
+
+#ifndef S_ISDIR
+#define S_ISDIR(mode) ((mode & S_IFMT) == S_IFDIR)
+#endif
+
+#if 0
+#define TRACE_OUT(p) DEBUG(2, p)
+#else
+#define TRACE_OUT(p) /*nothing*/
+#endif
+
+MODULE_ID("$Id: write_entry.c,v 1.47 1999/07/10 20:29:22 tom Exp $")
+
+static int total_written;
+
+static int write_object(FILE *, TERMTYPE *);
+
+static void write_file(char *filename, TERMTYPE *tp)
+{
+ FILE *fp = (_nc_access(filename, W_OK) == 0) ? fopen(filename, "wb") : 0;
+ if (fp == 0) {
+ perror(filename);
+ _nc_syserr_abort("can't open %s/%s", _nc_tic_dir(0), filename);
+ }
+ DEBUG(1, ("Created %s", filename));
+
+ if (write_object(fp, tp) == ERR) {
+ _nc_syserr_abort("error writing %s/%s", _nc_tic_dir(0), filename);
+ }
+ fclose(fp);
+}
+
+/*
+ * make_directory(char *path)
+ *
+ * Make a directory if it doesn't exist.
+ */
+static int make_directory(const char *path)
+{
+int rc;
+struct stat statbuf;
+char fullpath[PATH_MAX];
+const char *destination = _nc_tic_dir(0);
+
+ if (path == destination || *path == '/') {
+ if (strlen(path) + 1 > sizeof(fullpath))
+ return(-1);
+ (void)strcpy(fullpath, path);
+ } else {
+ if (strlen(destination) + strlen(path) + 2 > sizeof(fullpath))
+ return(-1);
+ (void)sprintf(fullpath, "%s/%s", destination, path);
+ }
+
+ if ((rc = stat(path, &statbuf)) < 0) {
+ rc = mkdir(path, 0777);
+ } 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 */
+ }
+ }
+ return rc;
+}
+
+void _nc_set_writedir(char *dir)
+/* set the write directory for compiled entries */
+{
+ const char *destination;
+ char actual[PATH_MAX];
+
+ if (dir != 0)
+ (void) _nc_tic_dir(dir);
+ else if (getenv("TERMINFO") != NULL)
+ (void) _nc_tic_dir(getenv("TERMINFO"));
+
+ destination = _nc_tic_dir(0);
+ if (make_directory(destination) < 0)
+ {
+ char *home = _nc_home_terminfo();
+
+ if (home != 0) {
+ destination = home;
+ if (make_directory(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 (chdir(_nc_tic_dir(destination)) < 0
+ || getcwd(actual, sizeof(actual)) == 0)
+ _nc_err_abort("%s: not a directory", destination);
+ _nc_keep_tic_dir(strdup(actual));
+}
+
+/*
+ * check_writeable(char code)
+ *
+ * Miscellaneous initialisations
+ *
+ * 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_directory(), 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[2];
+char *s;
+
+ if (code == 0 || (s = strchr(dirnames, code)) == 0)
+ _nc_err_abort("Illegal terminfo subdirectory \"%c\"", code);
+
+ if (verified[s-dirnames])
+ return;
+
+ dir[0] = code;
+ dir[1] = '\0';
+ if (make_directory(dir) < 0) {
+ _nc_err_abort("%s/%s: permission denied", _nc_tic_dir(0), dir);
+ }
+
+ verified[s-dirnames] = TRUE;
+}
+
+/*
+ * _nc_write_entry()
+ *
+ * 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.
+ */
+
+void _nc_write_entry(TERMTYPE *const tp)
+{
+struct stat statbuf;
+char name_list[MAX_TERMINFO_LENGTH];
+char *first_name, *other_names;
+char *ptr;
+char filename[PATH_MAX];
+char linkname[PATH_MAX];
+#if USE_SYMLINKS
+char symlinkname[PATH_MAX];
+#endif /* USE_SYMLINKS */
+static int call_count;
+static time_t start_time; /* time at start of writes */
+
+ if (call_count++ == 0) {
+ start_time = 0;
+ }
+
+ (void) strcpy(name_list, tp->term_names);
+ DEBUG(7, ("Name list = '%s'", name_list));
+
+ first_name = name_list;
+
+ ptr = &name_list[strlen(name_list) - 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 (strlen(first_name) > sizeof(filename)-3)
+ _nc_warning("terminal name too long.");
+
+ sprintf(filename, "%c/%s", first_name[0], first_name);
+
+ /*
+ * 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)
+ {
+ _nc_warning("name multiply defined.");
+ }
+
+ check_writeable(first_name[0]);
+ write_file(filename, tp);
+
+ if (start_time == 0) {
+ if (stat(filename, &statbuf) < 0
+ || (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)-3) {
+ _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]);
+ sprintf(linkname, "%c/%s", ptr[0], 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
+ strcpy(symlinkname, "../");
+ strncat(symlinkname, filename, sizeof(symlinkname) - 4);
+ symlinkname[sizeof(symlinkname) - 1] = '\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)
+ write_file(linkname, tp);
+ else
+ _nc_syserr_abort("can't link %s to %s", filename, linkname);
+ }
+ else
+ {
+ DEBUG(1, ("Linked %s", linkname));
+ }
+ }
+#else /* just make copies */
+ write_file(linkname, tp);
+#endif /* HAVE_LINK */
+ }
+}
+
+#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] = LO(x), (p)[1] = HI(x)
+
+#define WRITE_STRING(str) (fwrite(str, sizeof(char), strlen(str) + 1, fp) == strlen(str) + 1)
+
+static int compute_offsets(char **Strings, int strmax, short *offsets)
+{
+ size_t nextfree = 0;
+ int 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] = nextfree;
+ nextfree += strlen(Strings[i]) + 1;
+ TRACE_OUT(("put Strings[%d]=%s(%d)", i, _nc_visbuf(Strings[i]), nextfree));
+ }
+ }
+ return nextfree;
+}
+
+static void convert_shorts(unsigned char *buf, short *Numbers, int count)
+{
+ int i;
+ for (i = 0; i < count; i++) {
+ if (Numbers[i] == -1) { /* HI/LO won't work */
+ buf[2*i] = buf[2*i + 1] = 0377;
+ } else if (Numbers[i] == -2) { /* 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[%d]=%d", i, Numbers[i]));
+ }
+ }
+}
+
+#define even_boundary(value) \
+ ((value) % 2 != 0 && fwrite(&zero, sizeof(char), 1, fp) != 1)
+
+static int write_object(FILE *fp, TERMTYPE *tp)
+{
+char *namelist;
+size_t namelen, boolmax, nummax, strmax;
+char zero = '\0';
+size_t i;
+short nextfree;
+short offsets[MAX_ENTRY_SIZE/2];
+unsigned char buf[MAX_ENTRY_SIZE];
+
+ namelist = tp->term_names;
+ namelen = strlen(namelist) + 1;
+
+ /*
+ * BOOLWRITE, etc., are less than BOOLCOUNT because we store some
+ * values internally.
+ */
+ boolmax = 0;
+ for (i = 0; i < BOOLWRITE; i++) {
+ if (tp->Booleans[i])
+ boolmax = i+1;
+ }
+
+ nummax = 0;
+ for (i = 0; i < NUMWRITE; i++) {
+ if (tp->Numbers[i] != ABSENT_NUMERIC)
+ nummax = i+1;
+ }
+
+ strmax = 0;
+ for (i = 0; i < STRWRITE; i++) {
+ if (tp->Strings[i] != ABSENT_STRING)
+ strmax = i+1;
+ }
+
+ nextfree = compute_offsets(tp->Strings, strmax, offsets);
+
+ /* fill in the header */
+ LITTLE_ENDIAN(buf, MAGIC);
+ 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 @%ld", namelist, ftell(fp)));
+ if (fwrite(buf, 12, 1, fp) != 1
+ || fwrite(namelist, sizeof(char), namelen, fp) != namelen
+ || fwrite(tp->Booleans, sizeof(char), boolmax, fp) != boolmax)
+ return(ERR);
+
+ if (even_boundary(namelen+boolmax))
+ return(ERR);
+
+ TRACE_OUT(("Numerics begin at %04lx", ftell(fp)));
+
+ /* the numerics */
+ convert_shorts(buf, tp->Numbers, nummax);
+ if (fwrite(buf, 2, nummax, fp) != nummax)
+ return(ERR);
+
+ TRACE_OUT(("String offsets begin at %04lx", ftell(fp)));
+
+ /* the string offsets */
+ convert_shorts(buf, offsets, strmax);
+ if (fwrite(buf, 2, strmax, fp) != strmax)
+ return(ERR);
+
+ TRACE_OUT(("String table begins at %04lx", ftell(fp)));
+
+ /* 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 (NUM_EXT_NAMES(tp)) {
+ unsigned extcnt = NUM_EXT_NAMES(tp);
+
+ if (even_boundary(nextfree))
+ return(ERR);
+
+ nextfree = compute_offsets(tp->Strings + STRCOUNT, tp->ext_Strings, offsets);
+ TRACE_OUT(("after extended string capabilities, nextfree=%d", nextfree));
+ nextfree += compute_offsets(tp->ext_Names, extcnt, offsets + tp->ext_Strings);
+ TRACE_OUT(("after extended capnames, nextfree=%d", nextfree));
+ strmax = tp->ext_Strings + extcnt;
+
+ /*
+ * 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, strmax);
+ LITTLE_ENDIAN(buf+8, nextfree);
+ TRACE_OUT(("WRITE extended-header @%ld", ftell(fp)));
+ if (fwrite(buf, 10, 1, fp) != 1)
+ return(ERR);
+
+ TRACE_OUT(("WRITE %d booleans @%ld", tp->ext_Booleans, ftell(fp)));
+ if (tp->ext_Booleans
+ && fwrite(tp->Booleans + BOOLCOUNT, sizeof(char), tp->ext_Booleans, fp) != tp->ext_Booleans)
+ return(ERR);
+
+ if (even_boundary(tp->ext_Booleans))
+ return(ERR);
+
+ TRACE_OUT(("WRITE %d numbers @%ld", tp->ext_Numbers, ftell(fp)));
+ if (tp->ext_Numbers) {
+ convert_shorts(buf, tp->Numbers + NUMCOUNT, tp->ext_Numbers);
+ if (fwrite(buf, 2, tp->ext_Numbers, fp) != 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 @%ld", ftell(fp)));
+ if (fwrite(buf, 2, strmax, fp) != 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", i, _nc_visbuf(tp->Strings[i+STRCOUNT])));
+ if (!WRITE_STRING(tp->Strings[i+STRCOUNT]))
+ return(ERR);
+ }
+ }
+
+ /*
+ * Write the extended names
+ */
+ for (i = 0; i < extcnt; i++) {
+ TRACE_OUT(("WRITE ext_Names[%d]=%s", i, tp->ext_Names[i]));
+ if (!WRITE_STRING(tp->ext_Names[i]))
+ return(ERR);
+ }
+
+ }
+#endif /* NCURSES_XNAMES */
+
+ total_written++;
+ return(OK);
+}
+
+/*
+ * Returns the total number of entries written by this process
+ */
+int _nc_tic_written(void)
+{
+ return total_written;
+}
diff --git a/contrib/ncurses/ncurses/trace/README b/contrib/ncurses/ncurses/trace/README
new file mode 100644
index 000000000000..a627a537a3d1
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/README
@@ -0,0 +1,5 @@
+-- $Id: README,v 1.1 1998/11/08 00:11:01 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/contrib/ncurses/ncurses/trace/lib_trace.c b/contrib/ncurses/ncurses/trace/lib_trace.c
new file mode 100644
index 000000000000..aa4b887111a7
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/lib_trace.c
@@ -0,0 +1,200 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * lib_trace.c - Tracing/Debugging routines
+ */
+
+#include <curses.priv.h>
+#include <tic.h>
+
+MODULE_ID("$Id: lib_trace.c,v 1.30 1998/10/03 23:41:42 tom Exp $")
+
+#include <ctype.h>
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+unsigned _nc_tracing = 0; /* always define this */
+
+#ifdef TRACE
+const char *_nc_tputs_trace = "";
+long _nc_outchars;
+
+static FILE * tracefp; /* default to writing to stderr */
+#endif
+
+void trace(const unsigned int tracelevel GCC_UNUSED)
+{
+#ifdef TRACE
+static bool been_here = FALSE;
+static char my_name[] = "trace";
+
+ _nc_tracing = tracelevel;
+ if (! been_here && tracelevel) {
+ been_here = TRUE;
+
+ if (_nc_access(my_name, W_OK) < 0
+ || (tracefp = fopen(my_name, "w")) == 0) {
+ perror("curses: Can't open 'trace' file: ");
+ exit(EXIT_FAILURE);
+ }
+ /* 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 HAVE_SETVBUF /* ANSI */
+ (void) setvbuf(tracefp, (char *)0, _IOLBF, 0);
+#elif HAVE_SETBUF /* POSIX */
+ (void) setbuffer(tracefp, (char *)0);
+#endif
+ _tracef("TRACING NCURSES version %s (%d)",
+ NCURSES_VERSION, NCURSES_VERSION_PATCH);
+ }
+#endif
+}
+
+const char *_nc_visbuf2(int bufnum, const char *buf)
+/* visibilize a given string */
+{
+char *vbuf;
+char *tp;
+int c;
+
+ if (buf == 0)
+ return("(null)");
+ if (buf == CANCELLED_STRING)
+ return("(cancelled)");
+
+ tp = vbuf = _nc_trace_buf(bufnum, (strlen(buf) * 4) + 5);
+ *tp++ = '"';
+ while ((c = *buf++) != '\0') {
+ if (c == '"') {
+ *tp++ = '\\'; *tp++ = '"';
+ } else if (is7bits(c) && (isgraph(c) || c == ' ')) {
+ *tp++ = 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 == '\033') {
+ *tp++ = '\\'; *tp++ = 'e';
+ } else if (is7bits(c) && iscntrl(c)) {
+ *tp++ = '\\'; *tp++ = '^'; *tp++ = '@' + c;
+ } else {
+ sprintf(tp, "\\%03o", c & 0xff);
+ tp += strlen(tp);
+ }
+ }
+ *tp++ = '"';
+ *tp++ = '\0';
+ return(vbuf);
+}
+
+const char *_nc_visbuf(const char *buf)
+{
+ return _nc_visbuf2(0, buf);
+}
+
+#ifdef TRACE
+void
+_tracef(const char *fmt, ...)
+{
+static const char Called[] = T_CALLED("");
+static const char Return[] = T_RETURN("");
+static int level;
+va_list ap;
+bool before = FALSE;
+bool after = FALSE;
+int doit = _nc_tracing;
+int save_err = errno;
+
+ if (strlen(fmt) >= sizeof(Called) - 1) {
+ if (!strncmp(fmt, Called, sizeof(Called)-1)) {
+ before = TRUE;
+ level++;
+ } else if (!strncmp(fmt, Return, sizeof(Return)-1)) {
+ after = TRUE;
+ }
+ if (before || after) {
+ if ((level <= 1)
+ || (doit & TRACE_ICALLS) != 0)
+ doit &= (TRACE_CALLS|TRACE_CCALLS);
+ else
+ doit = 0;
+ }
+ }
+
+ if (doit != 0) {
+ if (tracefp == 0)
+ tracefp = stderr;
+ if (before || after) {
+ int n;
+ for (n = 1; n < level; n++)
+ fputs("+ ", tracefp);
+ }
+ va_start(ap, fmt);
+ vfprintf(tracefp, fmt, ap);
+ fputc('\n', tracefp);
+ va_end(ap);
+ fflush(tracefp);
+ }
+
+ if (after && level)
+ level--;
+ errno = save_err;
+}
+
+/* Trace 'int' return-values */
+int _nc_retrace_int(int code)
+{
+ T((T_RETURN("%d"), code));
+ return code;
+}
+
+/* Trace 'char*' return-values */
+char * _nc_retrace_ptr(char * code)
+{
+ T((T_RETURN("%s"), _nc_visbuf(code)));
+ return code;
+}
+
+/* Trace 'WINDOW *' return-values */
+WINDOW *_nc_retrace_win(WINDOW *code)
+{
+ T((T_RETURN("%p"), code));
+ return code;
+}
+#endif /* TRACE */
diff --git a/contrib/ncurses/ncurses/trace/lib_traceatr.c b/contrib/ncurses/ncurses/trace/lib_traceatr.c
new file mode 100644
index 000000000000..d9e007517f76
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/lib_traceatr.c
@@ -0,0 +1,218 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+ * lib_traceatr.c - Tracing/Debugging routines (attributes)
+ */
+
+#include <curses.priv.h>
+#include <term.h> /* acs_chars */
+
+MODULE_ID("$Id: lib_traceatr.c,v 1.28 1998/03/21 18:39:36 tom Exp $")
+
+#define COLOR_OF(c) (c < 0 || c > 7 ? "default" : colors[c].name)
+
+#ifdef TRACE
+char *_traceattr2(int bufnum, attr_t newmode)
+{
+char *buf = _nc_trace_buf(bufnum, BUFSIZ);
+char *tmp = buf;
+static const struct {unsigned int val; const char *name;}
+names[] =
+ {
+ { A_STANDOUT, "A_STANDOUT" },
+ { A_UNDERLINE, "A_UNDERLINE" },
+ { A_REVERSE, "A_REVERSE" },
+ { A_BLINK, "A_BLINK" },
+ { A_DIM, "A_DIM" },
+ { A_BOLD, "A_BOLD" },
+ { A_ALTCHARSET, "A_ALTCHARSET" },
+ { A_INVIS, "A_INVIS" },
+ { A_PROTECT, "A_PROTECT" },
+ { A_CHARTEXT, "A_CHARTEXT" },
+ { A_NORMAL, "A_NORMAL" },
+ { A_COLOR, "A_COLOR" },
+ },
+colors[] =
+ {
+ { COLOR_BLACK, "COLOR_BLACK" },
+ { COLOR_RED, "COLOR_RED" },
+ { COLOR_GREEN, "COLOR_GREEN" },
+ { COLOR_YELLOW, "COLOR_YELLOW" },
+ { COLOR_BLUE, "COLOR_BLUE" },
+ { COLOR_MAGENTA, "COLOR_MAGENTA" },
+ { COLOR_CYAN, "COLOR_CYAN" },
+ { COLOR_WHITE, "COLOR_WHITE" },
+ };
+size_t n;
+unsigned save_nc_tracing = _nc_tracing;
+ _nc_tracing = 0;
+
+ strcpy(tmp++, "{");
+
+ for (n = 0; n < SIZEOF(names); n++) {
+ if ((newmode & names[n].val) != 0) {
+ if (buf[1] != '\0')
+ strcat(tmp, "|");
+ strcat(tmp, names[n].name);
+ tmp += strlen(tmp);
+
+ if (names[n].val == A_COLOR)
+ {
+ short pairnum = PAIR_NUMBER(newmode);
+ short fg, bg;
+
+ if (pair_content(pairnum, &fg, &bg) == OK)
+ (void) sprintf(tmp,
+ "{%d = {%s, %s}}",
+ pairnum,
+ COLOR_OF(fg),
+ COLOR_OF(bg)
+ );
+ else
+ (void) sprintf(tmp, "{%d}", pairnum);
+ }
+ }
+ }
+ if (AttrOf(newmode) == A_NORMAL) {
+ if (buf[1] != '\0')
+ strcat(tmp, "|");
+ strcat(tmp, "A_NORMAL");
+ }
+
+ _nc_tracing = save_nc_tracing;
+ return (strcat(buf,"}"));
+}
+
+char *_traceattr(attr_t newmode)
+{
+ return _traceattr2(0, newmode);
+}
+
+/* Trace 'int' return-values */
+attr_t _nc_retrace_attr_t(attr_t code)
+{
+ T((T_RETURN("%s"), _traceattr(code)));
+ return code;
+}
+
+char *_tracechtype2(int bufnum, chtype ch)
+{
+char *buf = _nc_trace_buf(bufnum, BUFSIZ);
+char *found = 0;
+
+ strcpy(buf, "{");
+ if (ch & A_ALTCHARSET)
+ {
+ char *cp;
+ static const struct {unsigned int val; const char *name;}
+ names[] =
+ {
+ {'l', "ACS_ULCORNER"}, /* upper left corner */
+ {'m', "ACS_LLCORNER"}, /* lower left corner */
+ {'k', "ACS_URCORNER"}, /* upper right corner */
+ {'j', "ACS_LRCORNER"}, /* lower right corner */
+ {'t', "ACS_LTEE"}, /* tee pointing right */
+ {'u', "ACS_RTEE"}, /* tee pointing left */
+ {'v', "ACS_BTEE"}, /* tee pointing up */
+ {'w', "ACS_TTEE"}, /* tee pointing down */
+ {'q', "ACS_HLINE"}, /* horizontal line */
+ {'x', "ACS_VLINE"}, /* vertical line */
+ {'n', "ACS_PLUS"}, /* large plus or crossover */
+ {'o', "ACS_S1"}, /* scan line 1 */
+ {'s', "ACS_S9"}, /* scan line 9 */
+ {'`', "ACS_DIAMOND"}, /* diamond */
+ {'a', "ACS_CKBOARD"}, /* checker board (stipple) */
+ {'f', "ACS_DEGREE"}, /* degree symbol */
+ {'g', "ACS_PLMINUS"}, /* plus/minus */
+ {'~', "ACS_BULLET"}, /* bullet */
+ {',', "ACS_LARROW"}, /* arrow pointing left */
+ {'+', "ACS_RARROW"}, /* arrow pointing right */
+ {'.', "ACS_DARROW"}, /* arrow pointing down */
+ {'-', "ACS_UARROW"}, /* arrow pointing up */
+ {'h', "ACS_BOARD"}, /* board of squares */
+ {'i', "ACS_LANTERN"}, /* lantern symbol */
+ {'0', "ACS_BLOCK"}, /* solid square block */
+ {'p', "ACS_S3"}, /* scan line 3 */
+ {'r', "ACS_S7"}, /* scan line 7 */
+ {'y', "ACS_LEQUAL"}, /* less/equal */
+ {'z', "ACS_GEQUAL"}, /* greater/equal */
+ {'{', "ACS_PI"}, /* Pi */
+ {'|', "ACS_NEQUAL"}, /* not equal */
+ {'}', "ACS_STERLING"}, /* UK pound sign */
+ {'\0',(char *)0}
+ },
+ *sp;
+
+ for (cp = acs_chars; cp[0] && cp[1]; cp += 2)
+ {
+ if (TextOf(cp[1]) == TextOf(ch))
+ {
+ found = cp;
+ /* don't exit from loop - there may be redefinitions */
+ }
+ }
+
+ if (found != 0)
+ {
+ ch = TextOf(*found);
+ for (sp = names; sp->val; sp++)
+ if (sp->val == ch)
+ {
+ (void) strcat(buf, sp->name);
+ ch &= ~A_ALTCHARSET;
+ break;
+ }
+ }
+ }
+
+ if (found == 0)
+ (void) strcat(buf, _tracechar(TextOf(ch)));
+
+ if (AttrOf(ch) != A_NORMAL)
+ (void) sprintf(buf + strlen(buf), " | %s", _traceattr2(bufnum+20,AttrOf(ch)));
+
+ strcat(buf, "}");
+ return(buf);
+}
+
+char *_tracechtype(chtype ch)
+{
+ return _tracechtype2(0, ch);
+}
+#else
+extern void _nc_lib_traceatr(void);
+ void _nc_lib_traceatr(void) { }
+#endif /* TRACE */
diff --git a/contrib/ncurses/ncurses/trace/lib_tracebits.c b/contrib/ncurses/ncurses/trace/lib_tracebits.c
new file mode 100644
index 000000000000..a92e00a8624e
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/lib_tracebits.c
@@ -0,0 +1,225 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+#include <curses.priv.h>
+#include <term.h> /* cur_term */
+
+MODULE_ID("$Id: lib_tracebits.c,v 1.3 1999/08/21 21:43:48 tom Exp $")
+
+#if defined(SVR4_TERMIO) && !defined(_POSIX_SOURCE)
+#define _POSIX_SOURCE
+#endif
+
+#if HAVE_SYS_TERMIO_H
+#include <sys/termio.h> /* needed for ISC */
+#endif
+
+#ifdef __EMX__
+#include <io.h>
+#include <fcntl.h>
+#endif
+
+/* may be undefined if we're using termio.h */
+#ifndef TOSTOP
+#define TOSTOP 0
+#endif
+#ifndef IEXTEN
+#define IEXTEN 0
+#endif
+
+#ifdef TRACE
+
+typedef struct {unsigned int val; const char *name;} BITNAMES;
+
+static void lookup_bits(char *buf, const BITNAMES *table, const char *label, unsigned int val)
+{
+ const BITNAMES *sp;
+
+ (void) strcat(buf, label);
+ (void) strcat(buf, ": {");
+ for (sp = table; sp->name; sp++)
+ if (sp->val != 0
+ && (val & sp->val) == sp->val)
+ {
+ (void) strcat(buf, sp->name);
+ (void) strcat(buf, ", ");
+ }
+ if (buf[strlen(buf) - 2] == ',')
+ buf[strlen(buf) - 2] = '\0';
+ (void) strcat(buf,"} ");
+}
+
+char *_nc_tracebits(void)
+/* describe the state of the terminal control bits exactly */
+{
+char *buf;
+static const BITNAMES
+
+#ifdef TERMIOS
+iflags[] =
+ {
+ {BRKINT, "BRKINT"},
+ {IGNBRK, "IGNBRK"},
+ {IGNPAR, "IGNPAR"},
+ {PARMRK, "PARMRK"},
+ {INPCK, "INPCK"},
+ {ISTRIP, "ISTRIP"},
+ {INLCR, "INLCR"},
+ {IGNCR, "IGNC"},
+ {ICRNL, "ICRNL"},
+ {IXON, "IXON"},
+ {IXOFF, "IXOFF"},
+ {0, NULL}
+#define ALLIN (BRKINT|IGNBRK|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF)
+ },
+oflags[] =
+ {
+ {OPOST, "OPOST"},
+ {0, NULL}
+#define ALLOUT (OPOST)
+ },
+cflags[] =
+ {
+ {CLOCAL, "CLOCAL"},
+ {CREAD, "CREAD"},
+ {CSTOPB, "CSTOPB"},
+#if !defined(CS5) || !defined(CS8)
+ {CSIZE, "CSIZE"},
+#endif
+ {HUPCL, "HUPCL"},
+ {PARENB, "PARENB"},
+ {PARODD|PARENB, "PARODD"}, /* concession to readability */
+ {0, NULL}
+#define ALLCTRL (CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD)
+ },
+lflags[] =
+ {
+ {ECHO, "ECHO"},
+ {ECHOE|ECHO, "ECHOE"}, /* concession to readability */
+ {ECHOK|ECHO, "ECHOK"}, /* concession to readability */
+ {ECHONL, "ECHONL"},
+ {ICANON, "ICANON"},
+ {ISIG, "ISIG"},
+ {NOFLSH, "NOFLSH"},
+ {TOSTOP, "TOSTOP"},
+ {IEXTEN, "IEXTEN"},
+ {0, NULL}
+#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 (cur_term->Nttyb.c_iflag & ALLIN)
+ lookup_bits(buf, iflags, "iflags", cur_term->Nttyb.c_iflag);
+
+ if (cur_term->Nttyb.c_oflag & ALLOUT)
+ lookup_bits(buf, oflags, "oflags", cur_term->Nttyb.c_oflag);
+
+ if (cur_term->Nttyb.c_cflag & ALLCTRL)
+ lookup_bits(buf, cflags, "cflags", cur_term->Nttyb.c_cflag);
+
+#if defined(CS5) && defined(CS8)
+ switch (cur_term->Nttyb.c_cflag & CSIZE) {
+#if defined(CS5) && (CS5 != 0)
+ case CS5: strcat(buf, "CS5 "); break;
+#endif
+#if defined(CS6) && (CS6 != 0)
+ case CS6: strcat(buf, "CS6 "); break;
+#endif
+#if defined(CS7) && (CS7 != 0)
+ case CS7: strcat(buf, "CS7 "); break;
+#endif
+#if defined(CS8) && (CS8 != 0)
+ case CS8: strcat(buf, "CS8 "); break;
+#endif
+ default: strcat(buf, "CSIZE? "); break;
+ }
+#endif
+
+ if (cur_term->Nttyb.c_lflag & ALLLOCAL)
+ lookup_bits(buf, lflags, "lflags", cur_term->Nttyb.c_lflag);
+
+#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
+
+cflags[] =
+ {
+ {CBREAK, "CBREAK"},
+ {CRMOD, "CRMOD"},
+ {ECHO, "ECHO"},
+ {EVENP, "EVENP"},
+ {LCASE, "LCASE"},
+ {LLITOUT, "LLITOUT"},
+ {ODDP, "ODDP"},
+ {RAW, "RAW"},
+ {TANDEM, "TANDEM"},
+ {XTABS, "XTABS"},
+ {0, NULL}
+#define ALLCTRL (CBREAK|CRMOD|ECHO|EVENP|LCASE|LLITOUT|ODDP|RAW|TANDEM|XTABS)
+ };
+
+ buf = _nc_trace_buf(0,
+ 8 + sizeof(cflags));
+
+ if (cur_term->Nttyb.sg_flags & ALLCTRL)
+ {
+ lookup_bits(buf, cflags, "cflags", cur_term->Nttyb.sg_flags);
+ }
+
+#endif
+ return(buf);
+}
+#else
+char *_nc_tracebits(void) { static char tmp[] = ""; return tmp; }
+#endif /* TRACE */
diff --git a/contrib/ncurses/ncurses/trace/lib_tracechr.c b/contrib/ncurses/ncurses/trace/lib_tracechr.c
new file mode 100644
index 000000000000..e97e67931464
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/lib_tracechr.c
@@ -0,0 +1,69 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+ * lib_tracechr.c - Tracing/Debugging routines
+ */
+
+#ifndef TRACE
+#define TRACE /* turn on internal defs for this module */
+#endif
+
+#include <curses.priv.h>
+
+#include <ctype.h>
+
+#ifdef TRACE
+char *_tracechar(const unsigned char ch)
+{
+ static char crep[20];
+ /*
+ * We can show the actual character if it's either an ordinary printable
+ * or one of the high-half characters.
+ */
+ if (isprint(ch) || (ch & 0x80))
+ {
+ crep[0] = '\'';
+ crep[1] = ch; /* necessary; printf tries too hard on metachars */
+ (void) sprintf(crep + 2, "' = 0x%02x", (unsigned)ch);
+ }
+ else
+ (void) sprintf(crep, "0x%02x", (unsigned)ch);
+ return(crep);
+}
+#else
+extern void _nc_lib_tracechr(void);
+ void _nc_lib_tracechr(void) { }
+#endif
diff --git a/contrib/ncurses/ncurses/trace/lib_tracedmp.c b/contrib/ncurses/ncurses/trace/lib_tracedmp.c
new file mode 100644
index 000000000000..a67a37ef7edd
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/lib_tracedmp.c
@@ -0,0 +1,128 @@
+/****************************************************************************
+ * Copyright (c) 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: 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>
+
+MODULE_ID("$Id: lib_tracedmp.c,v 1.13 1998/03/21 18:39:44 tom Exp $")
+
+#ifdef TRACE
+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 (win->_line[i].text[j] != ' ')
+ n = j;
+
+ if (n > width)
+ width = n;
+ }
+ if (width < win->_maxx)
+ ++width;
+
+ for (n = 0; n <= win->_maxy; n++)
+ {
+ char buf[BUFSIZ], *ep;
+ bool haveattrs, havecolors;
+
+ /* dump A_CHARTEXT part */
+ (void) sprintf(buf, "%s[%2d] %3d%3d ='",
+ name, n,
+ win->_line[n].firstchar,
+ win->_line[n].lastchar);
+ ep = buf + strlen(buf);
+ for (j = 0; j <= width; j++) {
+ ep[j] = TextOf(win->_line[n].text[j]);
+ if (ep[j] == 0)
+ ep[j] = '.';
+ }
+ ep[j] = '\'';
+ ep[j+1] = '\0';
+ _tracef("%s", buf);
+
+ /* dump A_COLOR part, will screw up if there are more than 96 */
+ havecolors = FALSE;
+ for (j = 0; j <= width; j++)
+ if (win->_line[n].text[j] & A_COLOR)
+ {
+ havecolors = TRUE;
+ break;
+ }
+ if (havecolors)
+ {
+ (void) sprintf(buf, "%*s[%2d]%*s='", (int)strlen(name), "colors", n, 8, " ");
+ ep = buf + strlen(buf);
+ for (j = 0; j <= width; j++)
+ ep[j] = ((win->_line[n].text[j] >> 8) & 0xff) + ' ';
+ ep[j] = '\'';
+ ep[j+1] = '\0';
+ _tracef("%s", buf);
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ const char *hex = " 123456789ABCDEF";
+ chtype mask = (0xf << ((i + 4) * 4));
+
+ haveattrs = FALSE;
+ for (j = 0; j <= width; j++)
+ if (win->_line[n].text[j] & mask)
+ {
+ haveattrs = TRUE;
+ break;
+ }
+ if (haveattrs)
+ {
+ (void) sprintf(buf, "%*s%d[%2d]%*s='", (int)strlen(name)-1, "attrs", i, n, 8, " ");
+ ep = buf + strlen(buf);
+ for (j = 0; j <= width; j++)
+ ep[j] = hex[(win->_line[n].text[j] & mask) >> ((i + 4) * 4)];
+ ep[j] = '\'';
+ ep[j+1] = '\0';
+ _tracef("%s", buf);
+ }
+ }
+ }
+}
+#else
+extern void _nc_lib_tracedmp(void);
+ void _nc_lib_tracedmp(void) { }
+#endif /* TRACE */
diff --git a/contrib/ncurses/ncurses/trace/lib_tracemse.c b/contrib/ncurses/ncurses/trace/lib_tracemse.c
new file mode 100644
index 000000000000..fbdd2c006de0
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/lib_tracemse.c
@@ -0,0 +1,95 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+
+/*
+ * lib_tracemse.c - Tracing/Debugging routines (mouse events)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: lib_tracemse.c,v 1.6 1998/11/16 14:28:17 Alexander.V.Lukyanov Exp $")
+
+#ifdef TRACE
+
+char *_tracemouse(MEVENT const *ep)
+{
+ static char buf[80];
+
+ (void) sprintf(buf, "id %2d at (%2d, %2d, %2d) state %4lx = {",
+ ep->id, ep->x, ep->y, ep->z, ep->bstate);
+
+#define SHOW(m, s) if ((ep->bstate & m)==m) {strcat(buf,s); strcat(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")
+ SHOW(BUTTON1_RESERVED_EVENT, "reserved-1")
+ 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")
+ SHOW(BUTTON2_RESERVED_EVENT, "reserved-2")
+ 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")
+ SHOW(BUTTON3_RESERVED_EVENT, "reserved-3")
+ 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")
+ SHOW(BUTTON4_RESERVED_EVENT, "reserved-4")
+ 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';
+ (void) strcat(buf, "}");
+ return(buf);
+}
+
+#else /* !TRACE */
+/* don't make empty module */
+void _nc_lib_tracemouse(void);
+void _nc_lib_tracemouse(void) {}
+#endif
diff --git a/contrib/ncurses/ncurses/trace/trace_buf.c b/contrib/ncurses/ncurses/trace/trace_buf.c
new file mode 100644
index 000000000000..48f93d43d1ef
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/trace_buf.c
@@ -0,0 +1,80 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+/*
+ * trace_buf.c - Tracing/Debugging buffers (attributes)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: trace_buf.c,v 1.7 1999/02/27 19:50:58 tom Exp $")
+
+typedef struct {
+ char *text;
+ size_t size;
+} LIST;
+
+char * _nc_trace_buf(int bufnum, size_t want)
+{
+ static LIST *list;
+ static size_t have;
+
+#if NO_LEAKS
+ if (bufnum < 0) {
+ if (have) {
+ while (have--) {
+ free(list[have].text);
+ }
+ free(list);
+ }
+ return 0;
+ }
+#endif
+
+ if ((size_t)(bufnum+1) > have) {
+ size_t need = (bufnum + 1) * 2;
+ if ((list = typeRealloc(LIST, need, list)) == 0)
+ return(0);
+ while (need > have)
+ list[have++].text = 0;
+ }
+
+ if (list[bufnum].text == 0
+ || want > list[bufnum].size)
+ {
+ if ((list[bufnum].text = typeRealloc(char, want, list[bufnum].text)) != 0)
+ list[bufnum].size = want;
+ }
+
+ if (list[bufnum].text != 0)
+ *(list[bufnum].text) = '\0';
+ return list[bufnum].text;
+}
diff --git a/contrib/ncurses/ncurses/trace/trace_tries.c b/contrib/ncurses/ncurses/trace/trace_tries.c
new file mode 100644
index 000000000000..abd5db47a818
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/trace_tries.c
@@ -0,0 +1,74 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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_tries.c - Tracing/Debugging buffers (keycode tries-trees)
+ */
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: trace_tries.c,v 1.6 1999/03/06 22:51:07 tom Exp $")
+
+#ifdef TRACE
+static unsigned char *buffer;
+static unsigned len;
+
+static void recur_tries(struct tries *tree, unsigned level)
+{
+ if (level > len)
+ buffer = (unsigned char *)realloc(buffer, len = (level + 1) * 4);
+
+ while (tree != 0) {
+ if ((buffer[level] = tree->ch) == 0)
+ buffer[level] = 128;
+ buffer[level+1] = 0;
+ if (tree->value != 0) {
+ _tracef("%5d: %s (%s)", tree->value, _nc_visbuf((char *)buffer), keyname(tree->value));
+ }
+ if (tree->child)
+ recur_tries(tree->child, level+1);
+ tree = tree->sibling;
+ }
+}
+
+void _nc_trace_tries(struct tries *tree)
+{
+ buffer = typeMalloc(unsigned char, len = 80);
+ _tracef("BEGIN tries %p", tree);
+ recur_tries(tree, 0);
+ _tracef(". . . tries %p", tree);
+ free(buffer);
+}
+#else
+void _nc_trace_tries(struct tries *tree GCC_UNUSED)
+{
+}
+#endif
diff --git a/contrib/ncurses/ncurses/trace/trace_xnames.c b/contrib/ncurses/ncurses/trace/trace_xnames.c
new file mode 100644
index 000000000000..6287fc85c0a6
--- /dev/null
+++ b/contrib/ncurses/ncurses/trace/trace_xnames.c
@@ -0,0 +1,74 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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>
+#include <term_entry.h>
+
+MODULE_ID("$Id: trace_xnames.c,v 1.3 1999/03/02 01:20:38 tom Exp $")
+
+void _nc_trace_xnames(TERMTYPE *tp GCC_UNUSED)
+{
+#ifdef TRACE
+#if NCURSES_XNAMES
+ int limit = tp->ext_Booleans + tp->ext_Numbers + tp->ext_Strings;
+ int n, m;
+ if (limit) {
+ 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++) {
+ 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/contrib/ncurses/ncurses/tty/MKexpanded.sh b/contrib/ncurses/ncurses/tty/MKexpanded.sh
new file mode 100755
index 000000000000..b008becc4f07
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/MKexpanded.sh
@@ -0,0 +1,103 @@
+#! /bin/sh
+##############################################################################
+# Copyright (c) 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> 1997
+#
+# $Id: MKexpanded.sh,v 1.7 1998/11/11 20:15:39 Alexander.V.Lukyanov 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" 0 1 2 5 15
+
+cat <<EOF
+/* generated by MKexpanded.sh */
+#include <curses.priv.h>
+#include <term.h>
+#ifdef 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
+void _nc_toggle_attr_on(attr_t *S, attr_t at)
+{
+ toggle_attr_on(*S,at);
+}
+void _nc_toggle_attr_off(attr_t *S, attr_t at)
+{
+ toggle_attr_off(*S,at);
+}
+int _nc_can_clear_with(chtype ch)
+{
+ return can_clear_with(ch);
+}
+int _nc_DelCharCost(int count)
+{
+ return DelCharCost(count);
+}
+int _nc_InsCharCost(int count)
+{
+ return InsCharCost(count);
+}
+void _nc_UpdateAttrs(chtype c)
+{
+ UpdateAttrs(c);
+}
+EOF
+
+$preprocessor $TMP 2>/dev/null | sed -e '1,/^IGNORE$/d'
+
+cat <<EOF
+#else /* ! NCURSES_EXPANDED */
+void _nc_expanded(void) { }
+#endif /* NCURSES_EXPANDED */
+EOF
diff --git a/contrib/ncurses/ncurses/tty/hardscroll.c b/contrib/ncurses/ncurses/tty/hardscroll.c
new file mode 100644
index 000000000000..b80d08aa5467
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/hardscroll.c
@@ -0,0 +1,328 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/******************************************************************************
+
+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.33 1999/02/27 20:01:29 tom Exp $")
+
+#if defined(SCROLLDEBUG) || defined(HASHDEBUG)
+
+# undef screen_lines
+# define screen_lines MAXLINES
+int oldnums[MAXLINES];
+# define OLDNUM(n) oldnums[n]
+# define _tracef printf
+# undef TR
+# define TR(n, a) if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); }
+
+#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. */
+# if USE_HASHMAP
+int *_nc_oldnums = 0;
+static int oldnums_allocated = 0;
+# define oldnums _nc_oldnums
+# define OLDNUM(n) oldnums[n]
+# else /* !USE_HASHMAP */
+# define OLDNUM(n) newscr->_line[n].oldindex
+# endif /* !USE_HASHMAP */
+
+#endif /* defined(SCROLLDEBUG) || defined(HASHDEBUG) */
+
+
+void _nc_scroll_optimize(void)
+/* scroll optimization to transform curscr to newscr */
+{
+ int i;
+ int start, end, shift;
+
+ TR(TRACE_ICALLS, ("_nc_scroll_optimize() begins"));
+
+#if !defined(SCROLLDEBUG) && !defined(HASHDEBUG)
+#if USE_HASHMAP
+ /* get enough storage */
+ if (oldnums_allocated < screen_lines)
+ {
+ int *new_oldnums = typeRealloc(int, screen_lines, oldnums);
+ if (!new_oldnums)
+ return;
+ oldnums = new_oldnums;
+ oldnums_allocated = screen_lines;
+ }
+ /* calculate the indices */
+ _nc_hash_map();
+#endif
+#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */
+
+#ifdef TRACE
+ if (_nc_tracing & (TRACE_UPDATE | TRACE_MOVE))
+ _nc_linedump();
+#endif /* TRACE */
+
+ /* pass 1 - from top to bottom scrolling up */
+ for (i = 0; i < screen_lines; )
+ {
+ while (i < screen_lines && (OLDNUM(i) == _NEWINDEX || OLDNUM(i) <= i))
+ i++;
+ if (i >= screen_lines)
+ break;
+
+ shift = OLDNUM(i) - i; /* shift > 0 */
+ start = i;
+
+ i++;
+ while (i < screen_lines && OLDNUM(i) != _NEWINDEX && OLDNUM(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 (_nc_scrolln(shift, start, end, screen_lines - 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-1; i >= 0; )
+ {
+ while (i >= 0 && (OLDNUM(i) == _NEWINDEX || OLDNUM(i) >= i))
+ i--;
+ if (i < 0)
+ break;
+
+ shift = OLDNUM(i) - i; /* shift < 0 */
+ end = i;
+
+ i--;
+ while (i >= 0 && OLDNUM(i) != _NEWINDEX && OLDNUM(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 (_nc_scrolln(shift, start, end, screen_lines - 1) == ERR)
+ {
+ TR(TRACE_UPDATE | TRACE_MOVE, ("unable to scroll"));
+ continue;
+ }
+#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */
+ }
+}
+
+#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG)
+void _nc_linedump(void)
+/* dump the state of the real and virtual oldnum fields */
+{
+ static size_t have;
+ static char *buf;
+
+ int n;
+ size_t want = (screen_lines + 1) * 4;
+
+ if (have < want)
+ buf = typeMalloc(char, have = want);
+
+ (void) strcpy(buf, "virt");
+ for (n = 0; n < screen_lines; n++)
+ (void) sprintf(buf + strlen(buf), " %02d", OLDNUM(n));
+ TR(TRACE_UPDATE | TRACE_MOVE, (buf));
+#if NO_LEAKS
+ free(buf);
+ have = 0;
+#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; 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/contrib/ncurses/ncurses/tty/hashmap.c b/contrib/ncurses/ncurses/tty/hashmap.c
new file mode 100644
index 000000000000..f6a58bc6e112
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/hashmap.c
@@ -0,0 +1,567 @@
+/****************************************************************************
+ * Copyright (c) 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: 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>
+#include <term.h> /* for back_color_erase */
+
+MODULE_ID("$Id: hashmap.c,v 1.33 1999/03/18 02:09:45 Alexander.V.Lukyanov Exp $")
+
+#ifdef HASHDEBUG
+
+# define _tracef printf
+# undef TR
+# define TR(n, a) if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); }
+# undef screen_lines
+# define screen_lines MAXLINES
+# define TEXTWIDTH 1
+int oldnums[MAXLINES], reallines[MAXLINES];
+static chtype oldtext[MAXLINES][TEXTWIDTH], newtext[MAXLINES][TEXTWIDTH];
+# define OLDNUM(n) oldnums[n]
+# define OLDTEXT(n) oldtext[n]
+# define NEWTEXT(m) newtext[m]
+# define PENDING(n) 1
+
+#else /* !HASHDEBUG */
+
+# define OLDNUM(n) _nc_oldnums[n]
+# define OLDTEXT(n) curscr->_line[n].text
+# define NEWTEXT(m) newscr->_line[m].text
+# define TEXTWIDTH (curscr->_maxx+1)
+# define PENDING(n) (newscr->_line[n].firstchar != _NOCHANGE)
+
+#endif /* !HASHDEBUG */
+
+#define oldhash (SP->oldhash)
+#define newhash (SP->newhash)
+
+static inline unsigned long hash(chtype *text)
+{
+ int i;
+ chtype ch;
+ unsigned long result = 0;
+ for (i = TEXTWIDTH; i>0; i--)
+ {
+ ch = *text++;
+ result += (result<<5) + ch;
+ }
+ return result;
+}
+
+/* approximate update cost */
+static int update_cost(chtype *from,chtype *to)
+{
+ int cost=0;
+ int i;
+
+ for (i=TEXTWIDTH; i>0; i--)
+ if (*from++ != *to++)
+ cost++;
+
+ return cost;
+}
+static int update_cost_from_blank(chtype *to)
+{
+ int cost=0;
+ int i;
+ chtype blank = BLANK;
+
+ if (back_color_erase)
+ blank |= (stdscr->_bkgd & A_COLOR);
+
+ for (i=TEXTWIDTH; i>0; i--)
+ if (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 inline bool cost_effective(const int from, const int to, const bool blank)
+{
+ int new_from;
+
+ if (from == to)
+ return FALSE;
+
+ new_from = OLDNUM(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(NEWTEXT(to))
+ : update_cost(OLDTEXT(to),NEWTEXT(to)))
+ + update_cost(OLDTEXT(new_from),NEWTEXT(from)))
+ >= ((new_from==from ? update_cost_from_blank(NEWTEXT(from))
+ : update_cost(OLDTEXT(new_from),NEWTEXT(from)))
+ + update_cost(OLDTEXT(from),NEWTEXT(to)))) ? TRUE : FALSE;
+}
+
+
+typedef struct
+{
+ unsigned long hashval;
+ int oldcount, newcount;
+ int oldindex, newindex;
+}
+ sym;
+
+static sym *hashtab=0;
+static int lines_alloc=0;
+
+static void grow_hunks(void)
+{
+ int start, end, shift;
+ int back_limit, forward_limit; /* limits for cells to fill */
+ int back_ref_limit, forward_ref_limit; /* limits for refrences */
+ 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 && OLDNUM(i) == _NEWINDEX)
+ i++;
+ for ( ; i < screen_lines; i=next_hunk)
+ {
+ start = i;
+ shift = OLDNUM(i) - i;
+
+ /* get forward limit */
+ i = start+1;
+ while (i < screen_lines && OLDNUM(i) != _NEWINDEX && OLDNUM(i) - i == shift)
+ i++;
+ end = i;
+ while (i < screen_lines && OLDNUM(i) == _NEWINDEX)
+ i++;
+ next_hunk = i;
+ forward_limit = i;
+ if (i >= screen_lines || OLDNUM(i) >= i)
+ forward_ref_limit = i;
+ else
+ forward_ref_limit = OLDNUM(i);
+
+ i = start-1;
+ /* grow back */
+ if (shift < 0)
+ back_limit = back_ref_limit + (-shift);
+ while (i >= back_limit)
+ {
+ if(newhash[i] == oldhash[i+shift]
+ || cost_effective(i+shift, i, shift<0))
+ {
+ OLDNUM(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[i] == oldhash[i+shift]
+ || cost_effective(i+shift, i, shift>0))
+ {
+ OLDNUM(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;
+ }
+}
+
+void _nc_hash_map(void)
+{
+ sym *sp;
+ register int i;
+ int start, shift, size;
+
+
+ if (screen_lines > lines_alloc)
+ {
+ if (hashtab)
+ free (hashtab);
+ hashtab = typeMalloc(sym, (screen_lines+1)*2);
+ if (!hashtab)
+ {
+ if (oldhash)
+ FreeAndNull(oldhash);
+ lines_alloc = 0;
+ return;
+ }
+ lines_alloc = screen_lines;
+ }
+
+ if (oldhash && newhash)
+ {
+ /* re-hash only changed lines */
+ for (i = 0; i < screen_lines; i++)
+ {
+ if (PENDING(i))
+ newhash[i] = hash(NEWTEXT(i));
+ }
+ }
+ else
+ {
+ /* re-hash all */
+ if (oldhash == 0)
+ oldhash = typeCalloc (unsigned long, screen_lines);
+ if (newhash == 0)
+ newhash = typeCalloc (unsigned long, screen_lines);
+ if (!oldhash || !newhash)
+ return; /* malloc failure */
+ for (i = 0; i < screen_lines; i++)
+ {
+ newhash[i] = hash(NEWTEXT(i));
+ oldhash[i] = hash(OLDTEXT(i));
+ }
+ }
+
+#ifdef HASH_VERIFY
+ for (i = 0; i < screen_lines; i++)
+ {
+ if(newhash[i] != hash(NEWTEXT(i)))
+ fprintf(stderr,"error in newhash[%d]\n",i);
+ if(oldhash[i] != hash(OLDTEXT(i)))
+ fprintf(stderr,"error in oldhash[%d]\n",i);
+ }
+#endif
+
+ /*
+ * Set up and count line-hash values.
+ */
+ memset(hashtab, '\0', sizeof(*hashtab)*(screen_lines+1)*2);
+ for (i = 0; i < screen_lines; i++)
+ {
+ unsigned long hashval = oldhash[i];
+
+ for (sp = hashtab; sp->hashval; sp++)
+ if (sp->hashval == hashval)
+ break;
+ sp->hashval = hashval; /* in case this is a new entry */
+ sp->oldcount++;
+ sp->oldindex = i;
+ }
+ for (i = 0; i < screen_lines; i++)
+ {
+ unsigned long hashval = newhash[i];
+
+ for (sp = hashtab; sp->hashval; sp++)
+ if (sp->hashval == hashval)
+ break;
+ sp->hashval = hashval; /* in case this is a new entry */
+ sp->newcount++;
+ sp->newindex = i;
+
+ OLDNUM(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 (sp = hashtab; sp->hashval; sp++)
+ if (sp->oldcount == 1 && sp->newcount == 1
+ && sp->oldindex != sp->newindex)
+ {
+ TR(TRACE_UPDATE | TRACE_MOVE,
+ ("new line %d is hash-identical to old line %d (unique)",
+ sp->newindex, sp->oldindex));
+ OLDNUM(sp->newindex) = sp->oldindex;
+ }
+
+ grow_hunks();
+
+ /*
+ * 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; )
+ {
+ while (i < screen_lines && OLDNUM(i) == _NEWINDEX)
+ i++;
+ if (i >= screen_lines)
+ break;
+ start = i;
+ shift = OLDNUM(i) - i;
+ i++;
+ while (i < screen_lines && OLDNUM(i) != _NEWINDEX && OLDNUM(i) - i == shift)
+ i++;
+ size = i - start;
+ if (size < 3 || size+min(size/8,2) < abs(shift))
+ {
+ while (start < i)
+ {
+ OLDNUM(start) = _NEWINDEX;
+ start++;
+ }
+ }
+ }
+
+ /* After clearing invalid hunks, try grow the rest. */
+ grow_hunks();
+
+#if NO_LEAKS
+ FreeAndNull(hashtab);
+ lines_alloc = 0;
+#endif
+}
+
+void _nc_make_oldhash(int i)
+{
+ if (oldhash)
+ oldhash[i] = hash(OLDTEXT(i));
+}
+
+void _nc_scroll_oldhash(int n, int top, int bot)
+{
+ int size;
+ int i;
+
+ if (!oldhash)
+ return;
+
+ size = sizeof(*oldhash) * (bot-top+1-abs(n));
+ if (n > 0)
+ {
+ memmove (oldhash+top, oldhash+top+n, size);
+ for (i = bot; i > bot-n; i--)
+ oldhash[i] = hash(OLDTEXT(i));
+ }
+ else
+ {
+ memmove (oldhash+top-n, oldhash+top, size);
+ for (i = top; i < top-n; i++)
+ oldhash[i] = hash(OLDTEXT(i));
+ }
+}
+
+
+#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;
+
+ SP = typeCalloc(SCREEN,1);
+ for (n = 0; n < screen_lines; n++)
+ {
+ reallines[n] = n;
+ oldnums[n] = _NEWINDEX;
+ oldtext[n][0] = newtext[n][0] = '.';
+ }
+
+ if (isatty(fileno(stdin)))
+ usage();
+
+#ifdef TRACE
+ _nc_tracing = TRACE_MOVE;
+#endif
+ for (;;)
+ {
+ /* grab a test command */
+ if (fgets(line, sizeof(line), stdin) == (char *)NULL)
+ exit(EXIT_SUCCESS);
+
+ switch(line[0])
+ {
+ case '#': /* comment */
+ (void) fputs(line, stderr);
+ break;
+
+ case 'l': /* get initial line number vector */
+ for (n = 0; n < screen_lines; 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; n++)
+ newtext[n][0] = '.';
+ for (n = 0; n < screen_lines; n++)
+ if (line[n+1] == '\n')
+ break;
+ else
+ newtext[n][0] = line[n+1];
+ break;
+
+ case 'o': /* use following letters as text of old lines */
+ for (n = 0; n < screen_lines; n++)
+ oldtext[n][0] = '.';
+ for (n = 0; n < screen_lines; n++)
+ if (line[n+1] == '\n')
+ break;
+ else
+ 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; n++)
+ putchar(oldtext[n][0]);
+ putchar(']');
+ putchar('\n');
+ (void) fputs("New lines: [", stdout);
+ for (n = 0; n < screen_lines; n++)
+ putchar(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;
+ case '?':
+ usage();
+ break;
+ }
+ }
+ return EXIT_SUCCESS;
+}
+
+#endif /* HASHDEBUG */
+
+/* hashmap.c ends here */
diff --git a/contrib/ncurses/ncurses/tty/lib_mvcur.c b/contrib/ncurses/ncurses/tty/lib_mvcur.c
new file mode 100644
index 000000000000..9eca0269390e
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/lib_mvcur.c
@@ -0,0 +1,1242 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+** 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's too high, the algorithm will be a bit
+ * over-biased toward using cup rather than local motions; if it's 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's 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(fy, fx, ty, tx) ((tx > LONG_DIST) && (tx < screen_lines - 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's 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 <term.h>
+#include <ctype.h>
+
+MODULE_ID("$Id: lib_mvcur.c,v 1.57 1999/06/26 22:16:04 tom Exp $")
+
+#define STRLEN(s) (s != 0) ? strlen(s) : 0
+
+#define CURRENT_ATTR SP->_current_attr /* current phys attribute */
+#define CURRENT_ROW SP->_cursrow /* phys cursor row */
+#define CURRENT_COLUMN SP->_curscol /* phys cursor column */
+#define REAL_ATTR SP->_current_attr /* phys current attribute */
+#define WANT_CHAR(y, x) SP->_newscr->_line[y].text[x] /* desired state */
+#define BAUDRATE cur_term->_baudrate /* bits per second */
+
+#if defined(MAIN) || defined(NCURSES_TEST)
+#include <sys/time.h>
+
+static bool profiling = FALSE;
+static float diff;
+#endif /* MAIN */
+
+#define OPT_SIZE 512
+
+static int normalized_cost(const char *const cap, int affcnt);
+
+#if !HAVE_STRSTR
+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 = haystack;
+ break;
+ }
+ haystack++;
+ }
+ return result;
+}
+#endif
+
+/****************************************************************************
+ *
+ * Initialization/wrapup (including cost pre-computation)
+ *
+ ****************************************************************************/
+
+#ifdef TRACE
+static int
+trace_cost_of(const char *capname, const char *cap, int affcnt)
+{
+ int result = _nc_msec_cost(cap,affcnt);
+ TR(TRACE_CHARPUT|TRACE_MOVE, ("CostOf %s %d", capname, result));
+ return result;
+}
+#define CostOf(cap,affcnt) trace_cost_of(#cap,cap,affcnt);
+
+static int
+trace_normalized_cost(const char *capname, const char *cap, int affcnt)
+{
+ int result = normalized_cost(cap,affcnt);
+ TR(TRACE_CHARPUT|TRACE_MOVE, ("NormalizedCost %s %d", capname, result));
+ return result;
+}
+#define NormalizedCost(cap,affcnt) trace_normalized_cost(#cap,cap,affcnt);
+
+#else
+
+#define CostOf(cap,affcnt) _nc_msec_cost(cap,affcnt);
+#define NormalizedCost(cap,affcnt) normalized_cost(cap,affcnt);
+
+#endif
+
+int _nc_msec_cost(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;
+
+ for (cp = cap; *cp; cp++)
+ {
+ /* extract padding, either mandatory or required */
+ if (cp[0] == '$' && cp[1] == '<' && strchr(cp, '>'))
+ {
+ float number = 0;
+
+ for (cp += 2; *cp != '>'; cp++)
+ {
+ if (isdigit(*cp))
+ number = number * 10 + (*cp - '0');
+ else if (*cp == '.')
+ number += (*++cp - 10) / 10.0;
+ else if (*cp == '*')
+ number *= affcnt;
+ }
+
+ cum_cost += number * 10;
+ }
+ else
+ cum_cost += SP->_char_padding;
+ }
+
+ return((int)cum_cost);
+ }
+}
+
+static int normalized_cost(const char *const cap, int affcnt)
+/* compute the effective character-count for an operation (round up) */
+{
+ int cost = _nc_msec_cost(cap, affcnt);
+ if (cost != INFINITY)
+ cost = (cost + SP->_char_padding - 1) / SP->_char_padding;
+ return cost;
+}
+
+static void reset_scroll_region(void)
+/* Set the scroll-region to a known state (the default) */
+{
+ if (change_scroll_region)
+ {
+ TPUTS_TRACE("change_scroll_region");
+ putp(tparm(change_scroll_region, 0, screen_lines - 1));
+ }
+}
+
+void _nc_mvcur_resume(void)
+/* what to do at initialization time and after each shellout */
+{
+ /* initialize screen for cursor access */
+ if (enter_ca_mode)
+ {
+ TPUTS_TRACE("enter_ca_mode");
+ putp(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();
+ SP->_cursrow = SP->_curscol = -1;
+
+ /* restore cursor shape */
+ if (SP->_cursor != -1)
+ {
+ int cursor = SP->_cursor;
+ SP->_cursor = -1;
+ curs_set (cursor);
+ }
+}
+
+void _nc_mvcur_init(void)
+/* initialize the cost structure */
+{
+ /*
+ * 9 = 7 bits + 1 parity + 1 stop.
+ */
+ SP->_char_padding = (9 * 1000 * 10) / (BAUDRATE > 0 ? BAUDRATE : 9600);
+ if (SP->_char_padding <= 0)
+ SP->_char_padding = 1; /* must be nonzero */
+ TR(TRACE_CHARPUT|TRACE_MOVE, ("char_padding %d msecs", SP->_char_padding));
+
+ /* non-parameterized local-motion strings */
+ SP->_cr_cost = CostOf(carriage_return, 0);
+ SP->_home_cost = CostOf(cursor_home, 0);
+ SP->_ll_cost = CostOf(cursor_to_ll, 0);
+#if USE_HARD_TABS
+ SP->_ht_cost = CostOf(tab, 0);
+ SP->_cbt_cost = CostOf(back_tab, 0);
+#endif /* USE_HARD_TABS */
+ SP->_cub1_cost = CostOf(cursor_left, 0);
+ SP->_cuf1_cost = CostOf(cursor_right, 0);
+ SP->_cud1_cost = CostOf(cursor_down, 0);
+ SP->_cuu1_cost = CostOf(cursor_up, 0);
+
+ SP->_smir_cost = CostOf(enter_insert_mode, 0);
+ SP->_rmir_cost = CostOf(exit_insert_mode, 0);
+ SP->_ip_cost = 0;
+ if (insert_padding) {
+ SP->_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->_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->_cup_cost = CostOf(tparm(SP->_address_cursor, 23, 23), 1);
+ SP->_cub_cost = CostOf(tparm(parm_left_cursor, 23), 1);
+ SP->_cuf_cost = CostOf(tparm(parm_right_cursor, 23), 1);
+ SP->_cud_cost = CostOf(tparm(parm_down_cursor, 23), 1);
+ SP->_cuu_cost = CostOf(tparm(parm_up_cursor, 23), 1);
+ SP->_hpa_cost = CostOf(tparm(column_address, 23), 1);
+ SP->_vpa_cost = CostOf(tparm(row_address, 23), 1);
+
+ /* non-parameterized screen-update strings */
+ SP->_ed_cost = NormalizedCost(clr_eos, 1);
+ SP->_el_cost = NormalizedCost(clr_eol, 1);
+ SP->_el1_cost = NormalizedCost(clr_bol, 1);
+ SP->_dch1_cost = NormalizedCost(delete_character, 1);
+ SP->_ich1_cost = NormalizedCost(insert_character, 1);
+
+ /* parameterized screen-update strings */
+ SP->_dch_cost = NormalizedCost(tparm(parm_dch, 23), 1);
+ SP->_ich_cost = NormalizedCost(tparm(parm_ich, 23), 1);
+ SP->_ech_cost = NormalizedCost(tparm(erase_chars, 23), 1);
+ SP->_rep_cost = NormalizedCost(tparm(repeat_char, ' ', 23), 1);
+
+ SP->_cup_ch_cost = NormalizedCost(tparm(SP->_address_cursor, 23, 23), 1);
+ SP->_hpa_ch_cost = NormalizedCost(tparm(column_address, 23), 1);
+
+ /* pre-compute some capability lengths */
+ SP->_carriage_return_length = STRLEN(carriage_return);
+ SP->_cursor_home_length = STRLEN(cursor_home);
+ SP->_cursor_to_ll_length = STRLEN(cursor_to_ll);
+
+ /*
+ * 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
+ * SP->_endwin = TRUE at window initialization time and let this be
+ * called by doupdate's return-from-shellout code.
+ */
+ _nc_mvcur_resume();
+}
+
+void _nc_mvcur_wrap(void)
+/* wrap up cursor-addressing mode */
+{
+ /* leave cursor at screen bottom */
+ mvcur(-1, -1, screen_lines - 1, 0);
+
+ /* set cursor to normal mode */
+ if (SP->_cursor != -1)
+ curs_set(1);
+
+ if (exit_ca_mode)
+ {
+ TPUTS_TRACE("exit_ca_mode");
+ putp(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.
+ */
+ _nc_outch('\r');
+}
+
+/****************************************************************************
+ *
+ * Optimized cursor movement
+ *
+ ****************************************************************************/
+
+/*
+ * Perform repeated-append, returning cost
+ */
+static inline int
+repeated_append (int total, int num, int repeat, char *dst, const char *src)
+{
+ register size_t src_len = strlen(src);
+ register size_t dst_len = STRLEN(dst);
+
+ if ((dst_len + repeat * src_len) < OPT_SIZE-1) {
+ total += (num * repeat);
+ if (dst) {
+ dst += dst_len;
+ while (repeat-- > 0) {
+ (void) strcpy(dst, src);
+ dst += src_len;
+ }
+ }
+ } 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)
+
+/* Note: we'd like to inline this for speed, but GNU C barfs on the attempt. */
+
+static int
+relative_move(char *result, int from_y,int from_x,int to_y,int to_x, bool ovw)
+/* move via local motions (cuu/cuu1/cud/cud1/cub1/cub/cuf1/cuf/vpa/hpa) */
+{
+ int n, vcost = 0, hcost = 0;
+
+ if (result)
+ result[0] = '\0';
+
+ if (to_y != from_y)
+ {
+ vcost = INFINITY;
+
+ if (row_address)
+ {
+ if (result)
+ (void) strcpy(result, tparm(row_address, to_y));
+ vcost = SP->_vpa_cost;
+ }
+
+ if (to_y > from_y)
+ {
+ n = (to_y - from_y);
+
+ if (parm_down_cursor && SP->_cud_cost < vcost)
+ {
+ if (result)
+ (void) strcpy(result, tparm(parm_down_cursor, n));
+ vcost = SP->_cud_cost;
+ }
+
+ if (cursor_down && (n * SP->_cud1_cost < vcost))
+ {
+ if (result)
+ result[0] = '\0';
+ vcost = repeated_append(0, SP->_cud1_cost, n, result, cursor_down);
+ }
+ }
+ else /* (to_y < from_y) */
+ {
+ n = (from_y - to_y);
+
+ if (parm_up_cursor && SP->_cup_cost < vcost)
+ {
+ if (result)
+ (void) strcpy(result, tparm(parm_up_cursor, n));
+ vcost = SP->_cup_cost;
+ }
+
+ if (cursor_up && (n * SP->_cuu1_cost < vcost))
+ {
+ if (result)
+ result[0] = '\0';
+ vcost = repeated_append(0, SP->_cuu1_cost, n, result, cursor_up);
+ }
+ }
+
+ if (vcost == INFINITY)
+ return(INFINITY);
+ }
+
+ if (result)
+ result += strlen(result);
+
+ if (to_x != from_x)
+ {
+ char str[OPT_SIZE];
+
+ hcost = INFINITY;
+
+ if (column_address)
+ {
+ if (result)
+ (void) strcpy(result, tparm(column_address, to_x));
+ hcost = SP->_hpa_cost;
+ }
+
+ if (to_x > from_x)
+ {
+ n = to_x - from_x;
+
+ if (parm_right_cursor && SP->_cuf_cost < hcost)
+ {
+ if (result)
+ (void) strcpy(result, tparm(parm_right_cursor, n));
+ hcost = SP->_cuf_cost;
+ }
+
+ if (cursor_right)
+ {
+ int lhcost = 0;
+
+ str[0] = '\0';
+
+#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(lhcost, SP->_ht_cost, 1, str, tab);
+ if (lhcost == INFINITY)
+ break;
+ }
+
+ n = to_x - fr;
+ from_x = fr;
+ }
+#endif /* USE_HARD_TABS */
+
+#if defined(REAL_ATTR) && defined(WANT_CHAR)
+#ifdef 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
+ && vcost == 0
+ && str[0] == '\0'
+ && isdigit(TextOf(WANT_CHAR(to_y, from_x))))
+ 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++)
+ if ((WANT_CHAR(to_y, from_x + i) & A_ATTRIBUTES) != CURRENT_ATTR)
+ {
+ ovw = FALSE;
+ break;
+ }
+ }
+ if (ovw)
+ {
+ char *sp;
+ int i;
+
+ sp = str + strlen(str);
+
+ for (i = 0; i < n; i++)
+ *sp++ = WANT_CHAR(to_y, from_x + i);
+ *sp = '\0';
+ lhcost += n * SP->_char_padding;
+ }
+ else
+#endif /* defined(REAL_ATTR) && defined(WANT_CHAR) */
+ {
+ lhcost = repeated_append(lhcost, SP->_cuf1_cost, n, str, cursor_right);
+ }
+
+ if (lhcost < hcost)
+ {
+ if (result)
+ (void) strcpy(result, str);
+ hcost = lhcost;
+ }
+ }
+ }
+ else /* (to_x < from_x) */
+ {
+ n = from_x - to_x;
+
+ if (parm_left_cursor && SP->_cub_cost < hcost)
+ {
+ if (result)
+ (void) strcpy(result, tparm(parm_left_cursor, n));
+ hcost = SP->_cub_cost;
+ }
+
+ if (cursor_left)
+ {
+ int lhcost = 0;
+
+ str[0] = '\0';
+
+#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(lhcost, SP->_cbt_cost, 1, str, back_tab);
+ if (lhcost == INFINITY)
+ break;
+ }
+
+ n = fr - to_x;
+ }
+#endif /* USE_HARD_TABS */
+
+ lhcost = repeated_append(lhcost, SP->_cub1_cost, n, str, cursor_left);
+
+ if (lhcost < hcost)
+ {
+ if (result)
+ (void) strcpy(result, str);
+ hcost = lhcost;
+ }
+ }
+ }
+
+ if (hcost == INFINITY)
+ return(INFINITY);
+ }
+
+ return(vcost + hcost);
+}
+#endif /* !NO_OPTIMIZE */
+
+/*
+ * With the machinery set up above, it's 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 inline int
+onscreen_mvcur(int yold,int xold,int ynew,int xnew, bool ovw)
+/* onscreen move from (yold, xold) to (ynew, xnew) */
+{
+ char use[OPT_SIZE], *sp;
+ int tactic = 0, newcost, usecost = INFINITY;
+
+#if defined(MAIN) || defined(NCURSES_TEST)
+ struct timeval before, after;
+
+ gettimeofday(&before, NULL);
+#endif /* MAIN */
+
+ /* tactic #0: use direct cursor addressing */
+ sp = tparm(SP->_address_cursor, ynew, xnew);
+ if (sp)
+ {
+ tactic = 0;
+ (void) strcpy(use, sp);
+ usecost = SP->_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(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(NULL, 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(NULL, yold,0,ynew,xnew, ovw)) != INFINITY)
+ && SP->_cr_cost + newcost < usecost)
+ {
+ tactic = 2;
+ usecost = SP->_cr_cost + newcost;
+ }
+
+ /* tactic #3: use home-cursor + local movement */
+ if (cursor_home
+ && ((newcost=relative_move(NULL, 0, 0, ynew, xnew, ovw)) != INFINITY)
+ && SP->_home_cost + newcost < usecost)
+ {
+ tactic = 3;
+ usecost = SP->_home_cost + newcost;
+ }
+
+ /* tactic #4: use home-down + local movement */
+ if (cursor_to_ll
+ && ((newcost=relative_move(NULL, screen_lines-1, 0, ynew, xnew, ovw)) != INFINITY)
+ && SP->_ll_cost + newcost < usecost)
+ {
+ tactic = 4;
+ usecost = SP->_ll_cost + newcost;
+ }
+
+ /*
+ * tactic #5: use left margin for wrap to right-hand side,
+ * unless strange wrap behavior indicated by xenl might hose us.
+ */
+ if (auto_left_margin && !eat_newline_glitch
+ && yold > 0 && cursor_left
+ && ((newcost=relative_move(NULL, yold-1, screen_columns-1, ynew, xnew, ovw)) != INFINITY)
+ && SP->_cr_cost + SP->_cub1_cost + newcost + newcost < usecost)
+ {
+ tactic = 5;
+ usecost = SP->_cr_cost + SP->_cub1_cost + newcost;
+ }
+
+ /*
+ * These cases are ordered by estimated relative frequency.
+ */
+ if (tactic)
+ {
+ if (tactic == 1)
+ (void) relative_move(use, yold, xold, ynew, xnew, ovw);
+ else if (tactic == 2)
+ {
+ (void) strcpy(use, carriage_return);
+ (void) relative_move(use + SP->_carriage_return_length,
+ yold,0,ynew,xnew, ovw);
+ }
+ else if (tactic == 3)
+ {
+ (void) strcpy(use, cursor_home);
+ (void) relative_move(use + SP->_cursor_home_length,
+ 0, 0, ynew, xnew, ovw);
+ }
+ else if (tactic == 4)
+ {
+ (void) strcpy(use, cursor_to_ll);
+ (void) relative_move(use + SP->_cursor_to_ll_length,
+ screen_lines-1, 0, ynew, xnew, ovw);
+ }
+ else /* if (tactic == 5) */
+ {
+ use[0] = '\0';
+ if (xold > 0)
+ (void) strcat(use, carriage_return);
+ (void) strcat(use, cursor_left);
+ (void) relative_move(use + strlen(use),
+ yold-1, screen_columns-1, ynew, xnew, ovw);
+ }
+ }
+#endif /* !NO_OPTIMIZE */
+
+#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 msec, %f 28.8Kbps char-equivalents\n",
+ (int)diff, diff/288);
+#endif /* MAIN */
+
+ nonlocal:
+ if (usecost != INFINITY)
+ {
+ TPUTS_TRACE("mvcur");
+ tputs(use, 1, _nc_outch);
+ return(OK);
+ }
+ else
+ return(ERR);
+}
+
+int mvcur(int yold, int xold, int ynew, int xnew)
+/* optimized cursor move from (yold, xold) to (ynew, xnew) */
+{
+ TR(TRACE_MOVE, ("mvcur(%d,%d,%d,%d) called", yold, xold, ynew, xnew));
+
+ if (yold == ynew && xold == xnew)
+ return(OK);
+
+ /*
+ * 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)
+ {
+ ynew += xnew / screen_columns;
+ xnew %= screen_columns;
+ }
+ if (xold >= screen_columns)
+ {
+ int l;
+
+ l = (xold + 1) / screen_columns;
+ yold += l;
+ if (yold >= screen_lines)
+ l -= (yold - screen_lines - 1);
+
+ while (l > 0) {
+ if (newline)
+ {
+ TPUTS_TRACE("newline");
+ tputs(newline, 0, _nc_outch);
+ }
+ else
+ putchar('\n');
+ l--;
+ if (xold > 0)
+ {
+ if (carriage_return)
+ {
+ TPUTS_TRACE("carriage_return");
+ tputs(carriage_return, 0, _nc_outch);
+ }
+ else
+ putchar('\r');
+ xold = 0;
+ }
+ }
+ }
+
+ if (yold > screen_lines - 1)
+ yold = screen_lines - 1;
+ if (ynew > screen_lines - 1)
+ ynew = screen_lines - 1;
+
+ /* destination location is on screen now */
+ return(onscreen_mvcur(yold, xold, ynew, xnew, TRUE));
+}
+
+#if defined(TRACE) || defined(NCURSES_TEST)
+int _nc_optimize_enable = OPTIMIZE_ALL;
+#endif
+
+#if defined(MAIN) || defined(NCURSES_TEST)
+/****************************************************************************
+ *
+ * Movement optimizer test code
+ *
+ ****************************************************************************/
+
+#include <tic.h>
+#include <dump_entry.h>
+
+const char *_nc_progname = "mvcur";
+
+static unsigned long xmits;
+
+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);
+}
+
+int putp(const char *string)
+{
+ return(tputs(string, 1, _nc_outch));
+}
+
+int _nc_outch(int ch)
+{
+ putc(ch, stdout);
+ return OK;
+}
+
+static char tname[MAX_ALIAS];
+
+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)
+{
+ (void) strcpy(tname, termname());
+ load_term();
+ _nc_setupscreen(lines, columns, stdout);
+ baudrate();
+
+ _nc_mvcur_init();
+ NC_BUFFERED(FALSE);
+
+ (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];
+
+ (void) fputs("> ", stdout);
+ (void) fgets(buf, sizeof(buf), stdin);
+
+ if (buf[0] == '?')
+ {
+(void) puts("? -- display this help message");
+(void) puts("fy fx ty tx -- (4 numbers) display (fy,fx)->(ty,tx) move");
+(void) puts("s[croll] n t b m -- display scrolling sequence");
+(void) printf("r[eload] -- reload terminal info for %s\n", termname());
+(void) puts("l[oad] <term> -- load terminal info for type <term>");
+(void) puts("d[elete] <cap> -- delete named capability");
+(void) puts("i[nspect] -- display terminal capabilities");
+(void) puts("c[ost] -- dump cursor-optimization cost table");
+(void) puts("o[optimize] -- toggle movement optimization");
+(void) puts("t[orture] <num> -- torture-test with <num> random moves");
+(void) 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')
+ {
+ (void) strcpy(tname, termname());
+ 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_info_hash_table);
+
+ 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] = -1;
+ (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] = (char *)NULL;
+ (void) printf("String capability `%s' (%d) deleted.\n",
+ np->nte_name, np->nte_index);
+ break;
+ }
+ }
+ }
+ else if (buf[0] == 'i')
+ {
+ dump_init((char *)NULL, F_TERMINFO, S_TERMINFO, 70, 0, FALSE);
+ dump_entry(&cur_term->type, FALSE, TRUE, 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, 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", SP->_char_padding);
+ (void) printf("cr cost: %d\n", SP->_cr_cost);
+ (void) printf("cup cost: %d\n", SP->_cup_cost);
+ (void) printf("home cost: %d\n", SP->_home_cost);
+ (void) printf("ll cost: %d\n", SP->_ll_cost);
+#if USE_HARD_TABS
+ (void) printf("ht cost: %d\n", SP->_ht_cost);
+ (void) printf("cbt cost: %d\n", SP->_cbt_cost);
+#endif /* USE_HARD_TABS */
+ (void) printf("cub1 cost: %d\n", SP->_cub1_cost);
+ (void) printf("cuf1 cost: %d\n", SP->_cuf1_cost);
+ (void) printf("cud1 cost: %d\n", SP->_cud1_cost);
+ (void) printf("cuu1 cost: %d\n", SP->_cuu1_cost);
+ (void) printf("cub cost: %d\n", SP->_cub_cost);
+ (void) printf("cuf cost: %d\n", SP->_cuf_cost);
+ (void) printf("cud cost: %d\n", SP->_cud_cost);
+ (void) printf("cuu cost: %d\n", SP->_cuu_cost);
+ (void) printf("hpa cost: %d\n", SP->_hpa_cost);
+ (void) printf("vpa cost: %d\n", SP->_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/contrib/ncurses/ncurses/tty/lib_tstp.c b/contrib/ncurses/ncurses/tty/lib_tstp.c
new file mode 100644
index 000000000000..c241993f0312
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/lib_tstp.c
@@ -0,0 +1,361 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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_tstp.c
+**
+** The routine _nc_signal_handler().
+**
+*/
+
+#include <curses.priv.h>
+
+#include <signal.h>
+#include <SigAction.h>
+
+#if defined(SVR4_ACTION) && !defined(_POSIX_SOURCE)
+#define _POSIX_SOURCE
+#endif
+
+MODULE_ID("$Id: lib_tstp.c,v 1.19 1999/07/24 22:47:20 tom Exp $")
+
+#if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC)
+#define USE_SIGTSTP 1
+#else
+#define USE_SIGTSTP 0
+#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's simpler...
+ */
+
+#if USE_SIGTSTP
+static void tstp(int dummy GCC_UNUSED)
+{
+ sigset_t mask, omask;
+ sigaction_t act, oact;
+
+#ifdef SIGTTOU
+ int sigttou_blocked;
+#endif
+
+ T(("tstp() 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.
+ */
+ if (SP != 0 && !SP->_endwin) /* don't do this if we're not in curses */
+#if HAVE_TCGETPGRP
+ if (tcgetpgrp(STDIN_FILENO) == getpgrp())
+#endif
+ def_prog_mode();
+
+ /*
+ * Block window change and timer signals. The latter
+ * is because applications use timers to decide when
+ * to repaint the screen.
+ */
+ (void)sigemptyset(&mask);
+ (void)sigaddset(&mask, SIGALRM);
+#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.
+ */
+ endwin();
+
+ /* 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);
+ flushinp();
+
+ /*
+ * If the user modified the tty state while suspended, he wants
+ * those changes to stick. So save the new "default" terminal state.
+ */
+ def_shell_mode();
+
+ /*
+ * This relies on the fact that doupdate() will restore the
+ * program-mode tty state, and issue enter_ca_mode if need be.
+ */
+ doupdate();
+
+ /* Reset the signals. */
+ (void)sigprocmask(SIG_SETMASK, &omask, NULL);
+}
+#endif /* USE_SIGTSTP */
+
+static void cleanup(int sig)
+{
+ /*
+ * Actually, doing any sort of I/O from within an signal handler is
+ * "unsafe". But we'll _try_ to clean up the screen and terminal
+ * settings on the way out.
+ */
+ if (sig == SIGINT
+ || sig == SIGQUIT) {
+#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, (sigaction_t *)0) == 0)
+#else
+ if (signal(sig, SIG_IGN) != SIG_ERR)
+#endif
+ {
+ SCREEN *scan = _nc_screen_chain;
+ while(scan)
+ {
+ set_term(scan);
+ endwin();
+ if (SP)
+ SP->_endwin = FALSE; /* in case we have an atexit! */
+ scan = scan->_next_screen;
+ }
+ }
+ }
+ exit(EXIT_FAILURE);
+}
+
+#if USE_SIGWINCH
+static void sigwinch(int sig GCC_UNUSED)
+{
+ SCREEN *scan = _nc_screen_chain;
+ while(scan)
+ {
+ scan->_sig_winch = TRUE;
+ scan = scan->_next_screen;
+ }
+}
+#endif /* USE_SIGWINCH */
+
+/*
+ * If the given signal is still in its default state, set it to the given
+ * handler.
+ */
+#if HAVE_SIGACTION || HAVE_SIGVEC
+static int CatchIfDefault(int sig, sigaction_t *act)
+{
+ sigaction_t old_act;
+
+ if (sigaction(sig, (sigaction_t *)0, &old_act) == 0
+ && (old_act.sa_handler == SIG_DFL
+#if USE_SIGWINCH
+ || (sig == SIGWINCH && old_act.sa_handler == SIG_IGN)
+#endif
+ )) {
+ (void)sigaction(sig, act, (sigaction_t *)0);
+ return TRUE;
+ }
+ return FALSE;
+}
+#else
+static int CatchIfDefault(int sig, RETSIGTYPE (*handler)(int))
+{
+ void (*ohandler)(int);
+
+ ohandler = signal(sig, SIG_IGN);
+ if (ohandler == SIG_DFL
+#if USE_SIGWINCH
+ || (sig == SIGWINCH && ohandler == SIG_IGN)
+#endif
+ ) {
+ signal(sig, handler);
+ return TRUE;
+ } else {
+ signal(sig, ohandler);
+ return FALSE;
+ }
+}
+#endif
+
+/*
+ * 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.
+ */
+void _nc_signal_handler(bool enable)
+{
+#if USE_SIGTSTP /* Xenix 2.x doesn't have SIGTSTP, for example */
+static sigaction_t act, oact;
+static int ignore;
+
+ if (!ignore)
+ {
+ if (!enable)
+ {
+ act.sa_handler = SIG_IGN;
+ sigaction(SIGTSTP, &act, &oact);
+ }
+ else if (act.sa_handler)
+ {
+ sigaction(SIGTSTP, &oact, NULL);
+ }
+ else /*initialize */
+ {
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+#if USE_SIGWINCH
+ act.sa_handler = sigwinch;
+ CatchIfDefault(SIGWINCH, &act);
+#endif
+
+#ifdef SA_RESTART
+ act.sa_flags |= SA_RESTART;
+#endif /* SA_RESTART */
+ act.sa_handler = cleanup;
+ CatchIfDefault(SIGINT, &act);
+ CatchIfDefault(SIGTERM, &act);
+
+ act.sa_handler = tstp;
+ if (!CatchIfDefault(SIGTSTP, &act))
+ ignore = TRUE;
+ }
+ }
+#else /* !USE_SIGTSTP */
+ if (enable)
+ {
+#if HAVE_SIGACTION || HAVE_SIGVEC
+ static sigaction_t act;
+ sigemptyset(&act.sa_mask);
+#if USE_SIGWINCH
+ act.sa_handler = sigwinch;
+ CatchIfDefault(SIGWINCH, &act);
+#endif
+#ifdef SA_RESTART
+ act.sa_flags |= SA_RESTART;
+#endif /* SA_RESTART */
+ act.sa_handler = cleanup;
+ CatchIfDefault(SIGINT, &act);
+ CatchIfDefault(SIGTERM, &act);
+
+#else /* !(HAVE_SIGACTION || HAVE_SIGVEC) */
+
+ CatchIfDefault(SIGINT, cleanup);
+ CatchIfDefault(SIGTERM, cleanup);
+#if USE_SIGWINCH
+ CatchIfDefault(SIGWINCH, sigwinch);
+#endif
+#endif /* !(HAVE_SIGACTION || HAVE_SIGVEC) */
+ }
+#endif /* !USE_SIGTSTP */
+}
diff --git a/contrib/ncurses/ncurses/tty/lib_twait.c b/contrib/ncurses/ncurses/tty/lib_twait.c
new file mode 100644
index 000000000000..40bd2cd3044f
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/lib_twait.c
@@ -0,0 +1,221 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+** 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 USE_FUNC_POLL
+# include <stropts.h>
+# include <poll.h>
+# 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
+
+#ifdef __BEOS__
+/* BeOS select() only works on sockets. Use the tty hack instead */
+#include <socket.h>
+#define select check_select
+#endif
+
+MODULE_ID("$Id: lib_twait.c,v 1.32 1998/06/06 22:44:14 tom Exp $")
+
+static int _nc_gettime(void)
+{
+ int res;
+
+#if HAVE_GETTIMEOFDAY
+# define PRECISE_GETTIME 1
+ struct timeval t;
+ gettimeofday(&t, (struct timezone *)0);
+ res = t.tv_sec*1000 + t.tv_usec/1000;
+#else
+# define PRECISE_GETTIME 0
+ res = time(0)*1000;
+#endif
+ T(("time: %d msec", res));
+ return res;
+}
+
+/*
+ * 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:
+ * 0 - none (absolute time)
+ * 1 - ncurses' normal input-descriptor
+ * 2 - mouse descriptor, if any
+ * 3 - either input or mouse.
+ * 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.
+ */
+int _nc_timed_wait(int mode, int milliseconds, int *timeleft)
+{
+int fd;
+int count;
+
+int result;
+
+#if USE_FUNC_POLL
+struct pollfd fds[2];
+#elif HAVE_SELECT
+static fd_set set;
+#endif
+
+int starttime, returntime;
+
+ T(("start twait: %d milliseconds, mode: %d", milliseconds, mode));
+
+#if PRECISE_GETTIME
+retry:
+#endif
+ starttime = _nc_gettime();
+
+ count = 0;
+
+#if USE_FUNC_POLL
+ if (mode & 1) {
+ fds[count].fd = SP->_ifd;
+ fds[count].events = POLLIN;
+ count++;
+ }
+ if ((mode & 2)
+ && (fd = SP->_mouse_fd) >= 0) {
+ fds[count].fd = fd;
+ fds[count].events = POLLIN;
+ count++;
+ }
+ result = poll(fds, count, milliseconds);
+
+#elif HAVE_SELECT
+ /*
+ * select() modifies the fd_set arguments; do this in the
+ * loop.
+ */
+ FD_ZERO(&set);
+
+ if (mode & 1) {
+ FD_SET(SP->_ifd, &set);
+ count = SP->_ifd + 1;
+ }
+ if ((mode & 2)
+ && (fd = SP->_mouse_fd) >= 0) {
+ FD_SET(fd, &set);
+ count = max(fd, count) + 1;
+ }
+
+ 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
+
+ returntime = _nc_gettime();
+
+ if (milliseconds >= 0)
+ milliseconds -= returntime-starttime;
+
+#if PRECISE_GETTIME
+ /*
+ * 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);
+ milliseconds -= 100;
+ goto retry;
+ }
+#endif
+
+ /* return approximate time left in milliseconds */
+ if (timeleft)
+ *timeleft = milliseconds;
+
+ T(("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 < 2; count++) {
+ if ((mode & (1 << count))
+ && (fds[count].revents & POLLIN)) {
+ result |= (1 << count);
+ count++;
+ }
+ }
+#elif HAVE_SELECT
+ if ((mode & 2)
+ && (fd = SP->_mouse_fd) >= 0
+ && FD_ISSET(fd, &set))
+ result |= 2;
+ if ((mode & 1)
+ && FD_ISSET(SP->_ifd, &set))
+ result |= 1;
+#endif
+ }
+ else
+ result = 0;
+ }
+
+ return (result);
+}
diff --git a/contrib/ncurses/ncurses/tty/lib_vidattr.c b/contrib/ncurses/ncurses/tty/lib_vidattr.c
new file mode 100644
index 000000000000..20cc2b138011
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/lib_vidattr.c
@@ -0,0 +1,278 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * 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>
+#include <term.h>
+
+MODULE_ID("$Id: lib_vidattr.c,v 1.23 1999/06/12 21:20:41 tom Exp $")
+
+#define doPut(mode) TPUTS_TRACE(#mode); tputs(mode, 1, outc)
+
+#define TurnOn(mask,mode) \
+ if ((turn_on & mask) && mode) { doPut(mode); }
+
+#define TurnOff(mask,mode) \
+ if ((turn_off & mask) && mode) { doPut(mode); turn_off &= ~mask; }
+
+ /* if there is no current screen, assume we *can* do color */
+#define SetColorsIf(why,old_attr) \
+ if ((!SP || SP->_coloron) && (why)) { \
+ int old_pair = PAIR_NUMBER(old_attr); \
+ T(("old pair = %d -- new pair = %d", old_pair, pair)); \
+ if ((pair != old_pair) \
+ || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \
+ _nc_do_color(pair, reverse, outc); \
+ } \
+ }
+
+int vidputs(attr_t newmode, int (*outc)(int))
+{
+static attr_t previous_attr = A_NORMAL;
+attr_t turn_on, turn_off;
+int pair;
+bool reverse = FALSE;
+bool used_ncv = FALSE;
+
+ T((T_CALLED("vidputs(%s)"), _traceattr(newmode)));
+
+ /* this allows us to go on whether or not newterm() has been called */
+ if (SP)
+ previous_attr = SP->_current_attr;
+
+ T(("previous attribute was %s", _traceattr(previous_attr)));
+
+#if !USE_XMC_SUPPORT
+ if ((SP != 0)
+ && (magic_cookie_glitch > 0))
+ newmode &= ~(SP->_xmc_suppress);
+#endif
+
+ /*
+ * If we have a terminal that cannot combine color with video
+ * attributes, use the colors in preference.
+ */
+ if ((newmode & A_COLOR)
+ && (no_color_video > 0)) {
+ static const struct {
+ attr_t video;
+ unsigned bit;
+ } table[] = {
+ { A_STANDOUT, 1 },
+ { A_UNDERLINE, 2 },
+ { A_REVERSE, 4 },
+ { A_BLINK, 8 },
+ { A_DIM, 16 },
+ { A_BOLD, 32 },
+ { A_INVIS, 64 },
+ { A_PROTECT, 128 },
+ { A_ALTCHARSET, 256 },
+ };
+ size_t n;
+ for (n = 0; n < SIZEOF(table); n++) {
+ if ((table[n].bit & no_color_video)
+ && (table[n].video & newmode)) {
+ used_ncv = TRUE;
+ if (table[n].video == A_REVERSE)
+ reverse = TRUE;
+ else
+ newmode &= ~table[n].video;
+ }
+ }
+ }
+
+ if (newmode == previous_attr)
+ returnCode(OK);
+
+ pair = PAIR_NUMBER(newmode);
+
+ if (reverse) {
+ newmode &= ~A_REVERSE;
+ }
+
+ turn_off = (~newmode & previous_attr) & ALL_BUT_COLOR;
+ turn_on = (newmode & ~previous_attr) & ALL_BUT_COLOR;
+
+ SetColorsIf(pair == 0, previous_attr);
+
+ 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) {
+ doPut(exit_attribute_mode);
+ previous_attr &= ~A_COLOR;
+ }
+
+ SetColorsIf(pair != 0, previous_attr);
+ } else if (set_attributes && !used_ncv) {
+ if (turn_on || turn_off) {
+ TPUTS_TRACE("set_attributes");
+ tputs(tparm(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 &= ~A_COLOR;
+ }
+ SetColorsIf(pair != 0, previous_attr);
+ } else {
+
+ T(("turning %s off", _traceattr(turn_off)));
+
+ TurnOff(A_ALTCHARSET, exit_alt_charset_mode);
+
+ if (!SP || SP->_use_rmul) {
+ TurnOff(A_UNDERLINE, exit_underline_mode);
+ }
+
+ if (!SP || SP->_use_rmso) {
+ TurnOff(A_STANDOUT, exit_standout_mode);
+ }
+
+ if (turn_off && exit_attribute_mode) {
+ doPut(exit_attribute_mode);
+ turn_on |= (newmode & (chtype)(~A_COLOR));
+ previous_attr &= ~A_COLOR;
+ }
+ SetColorsIf(pair != 0, previous_attr);
+
+ T(("turning %s on", _traceattr(turn_on)));
+
+ 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);
+ 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);
+ }
+
+ if (reverse)
+ newmode |= A_REVERSE;
+
+ if (SP)
+ SP->_current_attr = newmode;
+ else
+ previous_attr = newmode;
+
+ returnCode(OK);
+}
+
+int vidattr(attr_t newmode)
+{
+ T((T_CALLED("vidattr(%s)"), _traceattr(newmode)));
+
+ returnCode(vidputs(newmode, _nc_outch));
+}
+
+chtype termattrs(void)
+{
+ chtype attrs = A_NORMAL;
+
+ 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->_coloron)
+ attrs |= A_COLOR;
+
+ return(attrs);
+}
+
diff --git a/contrib/ncurses/ncurses/tty/tty_display.h b/contrib/ncurses/ncurses/tty/tty_display.h
new file mode 100644
index 000000000000..1bc0d2d9dc42
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/tty_display.h
@@ -0,0 +1,146 @@
+/****************************************************************************
+ * Copyright (c) 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. *
+ ************************************************************************** */
+
+#ifndef TTY_DISPLAY_H
+#define TTY_DISPLAY_H 1
+
+extern bool _nc_tty_beep(void);
+extern bool _nc_tty_check_resize(void);
+extern bool _nc_tty_cursor(int);
+extern bool _nc_tty_flash(void);
+extern bool _nc_tty_init_color(int,int,int,int);
+extern bool _nc_tty_init_pair(int,int,int);
+extern bool _nc_tty_slk_hide(bool);
+extern bool _nc_tty_slk_update(int,const char *);
+extern bool _nc_tty_start_color(void);
+extern void _nc_tty_display_resume(void);
+extern void _nc_tty_display_suspend(void);
+extern void _nc_tty_dispose(void); /* frees SP->_term */
+extern void _nc_tty_switch_to(void);
+extern void _nc_tty_update(void);
+
+struct tty_display_data {
+ int _fifohold; /* set if breakout marked */
+ unsigned long _current_attr; /* terminal attribute current set */
+ int _cursrow; /* physical cursor row (-1=unknown) */
+ int _curscol; /* physical cursor column */
+
+ /* 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) */
+#if USE_HARD_TABS
+ int _ht_cost; /* cost of (tab) */
+ int _cbt_cost; /* cost of (backtab) */
+#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) */
+ /* used in lib_doupdate.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 _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;
+ int _carriage_return_length;
+ int _cursor_home_length;
+ int _cursor_to_ll_length;
+
+ chtype _xmc_suppress; /* attributes to suppress if xmc */
+ chtype _xmc_triggers; /* attributes to process if xmc */
+
+ bool _sig_winch;
+};
+
+
+#define DelCharCost(count) \
+ ((parm_dch != 0) \
+ ? D->_dch_cost \
+ : ((delete_character != 0) \
+ ? (D->_dch1_cost * count) \
+ : INFINITY))
+
+#define InsCharCost(count) \
+ ((parm_ich != 0) \
+ ? D->_ich_cost \
+ : ((enter_insert_mode && exit_insert_mode) \
+ ? D->_smir_cost + D->_rmir_cost + (D->_ip_cost * count) \
+ : ((insert_character != 0) \
+ ? (D->_ich1_cost * count) \
+ : INFINITY)))
+
+#if USE_XMC_SUPPORT
+#define UpdateAttrs(c) if (D->_current_attr != AttrOf(c)) { \
+ attr_t chg = D->_current_attr; \
+ vidattr(AttrOf(c)); \
+ if (magic_cookie_glitch > 0 \
+ && XMC_CHANGES((chg ^ D->_current_attr))) { \
+ T(("%s @%d before glitch %d,%d", \
+ __FILE__, __LINE__, \
+ D->_cursrow, \
+ D->_curscol)); \
+ _nc_do_xmc_glitch(chg); \
+ } \
+ }
+#else
+#define UpdateAttrs(c) if (D->_current_attr != AttrOf(c)) \
+ vidattr(AttrOf(c));
+#endif
+
+/*
+ * 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.
+ */
+#define can_clear_with(ch) \
+ ((ch & ~(NONBLANK_ATTR|(back_color_erase ? A_COLOR:0))) == BLANK)
+
+#define XMC_CHANGES(c) ((c) & D->_xmc_suppress)
+
+#endif /* TTY_DISPLAY_H */
diff --git a/contrib/ncurses/ncurses/tty/tty_input.h b/contrib/ncurses/ncurses/tty/tty_input.h
new file mode 100644
index 000000000000..41c228338990
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/tty_input.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright (c) 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. *
+ ****************************************************************************/
+
+/*
+ * $Id: tty_input.h,v 1.1 1998/12/19 22:42:57 tom Exp $
+ */
+
+#ifndef TTY_INPUT_H
+#define TTY_INPUT_H 1
+
+extern bool _nc_tty_mouse_mask(mmask_t);
+extern bool _nc_tty_pending(void);
+extern int _nc_tty_next_event(int);
+extern void _nc_tty_flags_changed(void);
+extern void _nc_tty_flush(void);
+extern void _nc_tty_input_resume(void);
+extern void _nc_tty_input_suspend(void);
+
+struct tty_input_data {
+ int _ifd; /* input file ptr for screen */
+ int _keypad_xmit; /* current terminal state */
+ int _meta_on; /* current terminal state */
+
+ /*
+ * These are the data that support the mouse interface.
+ */
+ bool (*_mouse_event) (SCREEN *);
+ bool (*_mouse_inline)(SCREEN *);
+ bool (*_mouse_parse) (int);
+ void (*_mouse_resume)(SCREEN *);
+ void (*_mouse_wrap) (SCREEN *);
+ int _mouse_fd; /* file-descriptor, if any */
+ int mousetype;
+};
+
+#endif /* TTY_INPUT_H */
diff --git a/contrib/ncurses/ncurses/tty/tty_update.c b/contrib/ncurses/ncurses/tty/tty_update.c
new file mode 100644
index 000000000000..4118d357f561
--- /dev/null
+++ b/contrib/ncurses/ncurses/tty/tty_update.c
@@ -0,0 +1,1738 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*-----------------------------------------------------------------
+ *
+ * lib_doupdate.c
+ *
+ * The routine doupdate() and its dependents. Also _nc_outstr(),
+ * so all physical output is concentrated here (except _nc_outch()
+ * in lib_tputs.c).
+ *
+ *-----------------------------------------------------------------*/
+
+#include <curses.priv.h>
+
+#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
+#include <stropts.h>
+#include <poll.h>
+#elif HAVE_SELECT
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+#endif
+
+#ifdef __BEOS__
+/* BeOS select() only works on sockets. Use the tty hack instead */
+#include <socket.h>
+#define select check_select
+#endif
+
+#include <term.h>
+
+MODULE_ID("$Id: tty_update.c,v 1.111 1999/02/27 20:07:56 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
+
+/*
+ * 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 inline chtype ClrBlank ( WINDOW *win );
+static int ClrBottom(int total);
+static int InsStr( chtype *line, int count );
+static void ClearScreen( chtype blank );
+static void ClrUpdate( void );
+static void DelChar( int count );
+static void TransformLine( int const lineno );
+
+#ifdef POSITION_DEBUG
+/****************************************************************************
+ *
+ * Debugging code. Only works on ANSI-standard terminals.
+ *
+ ****************************************************************************/
+
+void position_check(int expected_y, int expected_x, char *legend)
+/* check to see if the real cursor position matches the virtual */
+{
+ static char buf[9];
+ int y, x;
+
+ if (_nc_tracing)
+ return;
+
+ memset(buf, '\0', sizeof(buf));
+ (void) write(1, "\033[6n", 4); /* only works on ANSI-compatibles */
+ (void) read(0, (void *)buf, 8);
+ _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 (y - 1 != expected_y || x - 1 != expected_x)
+ _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);
+}
+#endif /* POSITION_DEBUG */
+
+/****************************************************************************
+ *
+ * Optimized update code
+ *
+ ****************************************************************************/
+
+static inline void GoTo(int const row, int const col)
+{
+ chtype oldattr = SP->_current_attr;
+
+ TR(TRACE_MOVE, ("GoTo(%d, %d) from (%d, %d)",
+ row, col, SP->_cursrow, SP->_curscol));
+
+#ifdef POSITION_DEBUG
+ position_check(SP->_cursrow, SP->_curscol, "GoTo");
+#endif /* POSITION_DEBUG */
+
+ /*
+ * 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!
+ */
+ if ((oldattr & A_ALTCHARSET)
+ || (oldattr && !move_standout_mode))
+ {
+ TR(TRACE_CHARPUT, ("turning off (%#lx) %s before move",
+ oldattr, _traceattr(oldattr)));
+ vidattr(A_NORMAL);
+ }
+
+ mvcur(SP->_cursrow, SP->_curscol, row, col);
+ SP->_cursrow = row;
+ SP->_curscol = col;
+}
+
+static inline void PutAttrChar(chtype ch)
+{
+ if (tilde_glitch && (TextOf(ch) == '~'))
+ ch = ('`' | AttrOf(ch));
+
+ TR(TRACE_CHARPUT, ("PutAttrChar(%s) at (%d, %d)",
+ _tracechtype(ch),
+ SP->_cursrow, SP->_curscol));
+ UpdateAttrs(ch);
+ putc((int)TextOf(ch), SP->_ofp);
+#ifdef TRACE
+ _nc_outchars++;
+#endif /* TRACE */
+ SP->_curscol++;
+ if (char_padding) {
+ TPUTS_TRACE("char_padding");
+ putp(char_padding);
+ }
+}
+
+static bool check_pending(void)
+/* 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->_fifohold != 0)
+ return FALSE;
+
+ if (SP->_checkfd >= 0) {
+#if USE_FUNC_POLL
+ struct pollfd fds[1];
+ fds[0].fd = SP->_checkfd;
+ fds[0].events = POLLIN;
+ if (poll(fds, 1, 0) > 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->_checkfd, &fdset);
+ if (select(SP->_checkfd+1, &fdset, NULL, NULL, &ktimeout) != 0)
+ {
+ have_pending = TRUE;
+ }
+#endif
+ }
+ if (have_pending) {
+ SP->_fifohold = 5;
+ fflush(SP->_ofp);
+ }
+ return FALSE;
+}
+
+/*
+ * No one supports recursive inline functions. However, gcc is quieter if we
+ * instantiate the recursive part separately.
+ */
+#if CC_HAS_INLINE_FUNCS
+static void callPutChar(chtype const);
+#else
+#define callPutChar(ch) PutChar(ch)
+#endif
+
+static inline void PutChar(chtype const ch); /* forward declaration */
+
+/* put char at lower right corner */
+static void PutCharLR(chtype const ch)
+{
+ if (!auto_right_margin)
+ {
+ /* we can put the char directly */
+ PutAttrChar(ch);
+ }
+ else if (enter_am_mode && exit_am_mode)
+ {
+ /* we can suppress automargin */
+ TPUTS_TRACE("exit_am_mode");
+ putp(exit_am_mode);
+
+ PutAttrChar(ch);
+
+ TPUTS_TRACE("enter_am_mode");
+ putp(enter_am_mode);
+ }
+ else if ((enter_insert_mode && exit_insert_mode)
+ || insert_character || parm_ich)
+ {
+ GoTo(screen_lines-1,screen_columns-2);
+ callPutChar(ch);
+ GoTo(screen_lines-1,screen_columns-2);
+ InsStr(newscr->_line[screen_lines-1].text+screen_columns-2,1);
+ }
+}
+
+static void wrap_cursor(void)
+{
+ 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's safe to just tell the code that the
+ * cursor is in hyperspace and let the next mvcur()
+ * call straighten things out.
+ */
+ SP->_curscol = -1;
+ SP->_cursrow = -1;
+ }
+ else if (auto_right_margin)
+ {
+ SP->_curscol = 0;
+ SP->_cursrow++;
+ }
+ else
+ {
+ SP->_curscol--;
+ }
+}
+
+static inline void PutChar(chtype const ch)
+/* insert character, handling automargin stuff */
+{
+ if (SP->_cursrow == screen_lines-1 && SP->_curscol == screen_columns-1)
+ PutCharLR(ch);
+ else
+ PutAttrChar(ch);
+
+ if (SP->_curscol >= screen_columns)
+ wrap_cursor();
+
+#ifdef POSITION_DEBUG
+ position_check(SP->_cursrow, SP->_curscol, "PutChar");
+#endif /* POSITION_DEBUG */
+}
+
+/*
+ * 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(const chtype *ntext, int num)
+{
+ int i;
+
+ if (erase_chars || repeat_char)
+ {
+ while (num > 0)
+ {
+ int runcount;
+ chtype ntext0;
+
+ while (num>1 && ntext[0]!=ntext[1])
+ {
+ PutChar(ntext[0]);
+ ntext++;
+ num--;
+ }
+ ntext0 = ntext[0];
+ if (num==1)
+ {
+ PutChar(ntext0);
+ return 0;
+ }
+ runcount = 2;
+
+ while (runcount < num && ntext[runcount] == ntext0)
+ runcount++;
+
+ /*
+ * The cost expression in the middle isn't exactly right.
+ * _cup_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->_ech_cost + SP->_cup_cost
+ && can_clear_with(ntext0))
+ {
+ UpdateAttrs(ntext0);
+ putp(tparm(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(SP->_cursrow, SP->_curscol + runcount);
+ else
+ return 1; /* cursor stays in the middle */
+ }
+ else if (repeat_char && runcount > SP->_rep_cost)
+ {
+ bool wrap_possible = (SP->_curscol + runcount >= screen_columns);
+ int rep_count = runcount;
+
+ if (wrap_possible)
+ rep_count--;
+
+ UpdateAttrs(ntext0);
+ putp(tparm(repeat_char, TextOf(ntext0), rep_count));
+ SP->_curscol += rep_count;
+
+ if (wrap_possible)
+ PutChar(ntext0);
+ }
+ else
+ {
+ for (i = 0; i < runcount; i++)
+ PutChar(ntext[i]);
+ }
+ ntext += runcount;
+ num -= runcount;
+ }
+ return 0;
+ }
+
+ for (i = 0; i < num; i++)
+ PutChar(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(
+ const chtype *otext,
+ const chtype *ntext,
+ int row,
+ int first, int last)
+{
+ int j, run;
+ int cost = min(SP->_cup_ch_cost, SP->_hpa_ch_cost);
+
+ TR(TRACE_CHARPUT, ("PutRange(%p, %p, %d, %d, %d)",
+ otext, ntext, row, first, last));
+
+ if (otext != ntext
+ && (last-first+1) > cost) {
+ for (j = first, run = 0; j <= last; j++) {
+ if (otext[j] == ntext[j]) {
+ run++;
+ } else {
+ if (run > cost) {
+ int before_run = (j - run);
+ EmitRange(ntext+first, before_run-first);
+ GoTo(row, first = j);
+ }
+ run = 0;
+ }
+ }
+ }
+ return EmitRange(ntext + first, last-first+1);
+}
+
+#if CC_HAS_INLINE_FUNCS
+static void callPutChar(chtype const ch)
+{
+ PutChar(ch);
+}
+#endif
+
+#define MARK_NOCHANGE(win,row) \
+ { \
+ win->_line[row].firstchar = _NOCHANGE; \
+ win->_line[row].lastchar = _NOCHANGE; \
+ if_USE_SCROLL_HINTS(win->_line[row].oldindex = row); \
+ }
+
+int doupdate(void)
+{
+int i;
+int nonempty;
+#if USE_TRACE_TIMES
+struct tms before, after;
+#endif /* USE_TRACE_TIMES */
+
+ T((T_CALLED("doupdate()")));
+
+#ifdef TRACE
+ if (_nc_tracing & TRACE_UPDATE)
+ {
+ if (curscr->_clear)
+ _tracef("curscr is clear");
+ else
+ _tracedump("curscr", curscr);
+ _tracedump("newscr", newscr);
+ }
+#endif /* TRACE */
+
+ _nc_signal_handler(FALSE);
+
+ if (SP->_fifohold)
+ SP->_fifohold--;
+
+#if USE_SIZECHANGE
+ if (SP->_endwin || SP->_sig_winch)
+ {
+ /*
+ * 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();
+ }
+#endif
+
+ if (SP->_endwin) {
+
+ T(("coming back from shell mode"));
+ reset_prog_mode();
+
+ _nc_mvcur_resume();
+ _nc_screen_resume();
+ SP->_mouse_resume(SP);
+
+ SP->_endwin = FALSE;
+ }
+
+#if USE_TRACE_TIMES
+ /* zero the metering machinery */
+ _nc_outchars = 0;
+ (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's
+ * 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; i++)
+ for (j = 0; j < screen_columns; j++)
+ {
+ bool failed = FALSE;
+ chtype turnon = AttrOf(newscr->_line[i].text[j]) & ~rattr;
+
+ /* is an attribute turned on here? */
+ if (turnon == 0) {
+ rattr = AttrOf(newscr->_line[i].text[j]);
+ continue;
+ }
+
+ T(("At (%d, %d): from %s...", i, j, _traceattr(rattr)));
+ T(("...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(a) !((a) & (chtype)~NONBLANK_ATTR)
+ if (TextOf(newscr->_line[i].text[j])==' ' && SAFE(turnon))
+ {
+ newscr->_line[i].text[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
+ || TextOf(newscr->_line[i].text[j-k]) != ' '
+ || !SAFE(AttrOf(newscr->_line[i].text[j-k])))
+ failed = TRUE;
+ if (!failed)
+ {
+ bool end_onscreen = FALSE;
+ int m, n = j;
+
+ /* find end of span, if it's onscreen */
+ for (m = i; m < screen_lines; m++)
+ {
+ for ( ; n < screen_columns; n++)
+ {
+ if (AttrOf(newscr->_line[m].text[n]) == rattr)
+ {
+ end_onscreen = TRUE;
+ T(("Range attributed with %s ends at (%d, %d)",
+ _traceattr(turnon),m,n));
+ goto foundit;
+ }
+ }
+ n = 0;
+ }
+ T(("Range attributed with %s ends offscreen",
+ _traceattr(turnon)));
+ foundit:;
+
+ if (end_onscreen)
+ {
+ chtype *lastline = newscr->_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
+ && TextOf(lastline[n]) == ' '
+ && SAFE(AttrOf(lastline[n])))
+ 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
+ || TextOf(lastline[n + k]) != ' '
+ || !SAFE(AttrOf(lastline[n+k])))
+ failed = TRUE;
+ }
+ }
+
+ if (failed)
+ {
+ int p, q = j;
+
+ T(("Clearing %s beginning at (%d, %d)",
+ _traceattr(turnon), i, j));
+
+ /* turn off new attributes over span */
+ for (p = i; p < screen_lines; p++)
+ {
+ for ( ; q < screen_columns; q++)
+ {
+ if (AttrOf(newscr->_line[p].text[q]) == rattr)
+ goto foundend;
+ newscr->_line[p].text[q] &= ~turnon;
+ }
+ q = 0;
+ }
+ foundend:;
+ }
+ else
+ {
+ T(("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++)
+ newscr->_line[i].text[j-k] |= turnon;
+ }
+
+ rattr = AttrOf(newscr->_line[i].text[j]);
+ }
+
+#ifdef TRACE
+ /* show altered highlights after magic-cookie check */
+ if (_nc_tracing & TRACE_UPDATE)
+ {
+ _tracef("After magic-cookie check...");
+ _tracedump("newscr", newscr);
+ }
+#endif /* TRACE */
+ }
+#endif /* USE_XMC_SUPPORT */
+
+ nonempty = 0;
+ if (curscr->_clear || newscr->_clear) { /* force refresh ? */
+ T(("clearing and updating from scratch"));
+ ClrUpdate();
+ curscr->_clear = FALSE; /* reset flag */
+ newscr->_clear = FALSE; /* reset flag */
+ } else {
+ int changedlines = CHECK_INTERVAL;
+
+ if(check_pending())
+ goto cleanup;
+
+ nonempty = min(screen_lines, newscr->_maxy+1);
+
+ if (SP->_scrolling) {
+ _nc_scroll_optimize();
+ }
+
+ nonempty = ClrBottom(nonempty);
+
+ T(("Transforming lines, nonempty %d", nonempty));
+ for (i = 0; i < nonempty; i++) {
+ /*
+ * Here is our line-breakout optimization.
+ */
+ if (changedlines == CHECK_INTERVAL)
+ {
+ if (check_pending())
+ 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 (newscr->_line[i].firstchar != _NOCHANGE
+ || curscr->_line[i].firstchar != _NOCHANGE)
+ {
+ TransformLine(i);
+ changedlines++;
+ }
+
+ /* mark line changed successfully */
+ if (i <= newscr->_maxy)
+ MARK_NOCHANGE(newscr,i)
+ if (i <= curscr->_maxy)
+ MARK_NOCHANGE(curscr,i)
+ }
+ }
+
+ /* put everything back in sync */
+ for (i = nonempty; i <= newscr->_maxy; i++)
+ MARK_NOCHANGE(newscr,i)
+ for (i = nonempty; i <= curscr->_maxy; i++)
+ MARK_NOCHANGE(curscr,i)
+
+ if (!newscr->_leaveok)
+ {
+ curscr->_curx = newscr->_curx;
+ curscr->_cury = newscr->_cury;
+
+ GoTo(curscr->_cury, curscr->_curx);
+ }
+
+ cleanup:
+ /*
+ * Keep the physical screen in normal mode in case we get other
+ * processes writing to the screen.
+ */
+ UpdateAttrs(A_NORMAL);
+
+ fflush(SP->_ofp);
+ curscr->_attrs = newscr->_attrs;
+/* curscr->_bkgd = newscr->_bkgd; */
+
+#if USE_TRACE_TIMES
+ (void) times(&after);
+ TR(TRACE_TIMES, ("Update cost: %ld chars, %ld clocks system time, %ld clocks user time",
+ _nc_outchars,
+ after.tms_stime-before.tms_stime,
+ after.tms_utime-before.tms_utime));
+#endif /* USE_TRACE_TIMES */
+
+ _nc_signal_handler(TRUE);
+
+ returnCode(OK);
+}
+
+/*
+ * 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(win) (((win) == curscr ? stdscr : (win))->_bkgd)
+
+static inline chtype ClrBlank (WINDOW *win)
+{
+chtype blank = BLANK;
+ if (back_color_erase)
+ blank |= (BCE_BKGD(win) & BCE_ATTRS);
+ return blank;
+}
+
+/*
+** ClrUpdate()
+**
+** Update by clearing and redrawing the entire screen.
+**
+*/
+
+static void ClrUpdate(void)
+{
+ int i;
+ chtype blank = ClrBlank(stdscr);
+ int nonempty = min(screen_lines, newscr->_maxy+1);
+
+ T(("ClrUpdate() called"));
+
+ ClearScreen(blank);
+
+ T(("updating screen from scratch"));
+
+ nonempty = ClrBottom(nonempty);
+
+ for (i = 0; i < nonempty; i++)
+ TransformLine(i);
+}
+
+/*
+** ClrToEOL(blank)
+**
+** Clear to end of current line, starting at the cursor position
+*/
+
+static void ClrToEOL(chtype blank)
+{
+int j;
+bool needclear = FALSE;
+
+ for (j = SP->_curscol; j < screen_columns; j++)
+ {
+ chtype *cp = &(curscr->_line[SP->_cursrow].text[j]);
+
+ if (*cp != blank)
+ {
+ *cp = blank;
+ needclear = TRUE;
+ }
+ }
+
+ if (needclear)
+ {
+ UpdateAttrs(blank);
+ TPUTS_TRACE("clr_eol");
+ if (SP->_el_cost > (screen_columns - SP->_curscol))
+ {
+ int count = (screen_columns - SP->_curscol);
+ while (count-- > 0)
+ PutChar(blank);
+ }
+ else
+ putp(clr_eol);
+ }
+}
+
+/*
+** ClrToEOS(blank)
+**
+** Clear to end of screen, starting at the cursor position
+*/
+
+static void ClrToEOS(chtype blank)
+{
+int row, col;
+
+ UpdateAttrs(blank);
+ TPUTS_TRACE("clr_eos");
+ row = SP->_cursrow;
+ tputs(clr_eos, screen_lines-row, _nc_outch);
+
+ for (col = SP->_curscol; col < screen_columns; col++)
+ curscr->_line[row].text[col] = blank;
+
+ for (row++; row < screen_lines; row++)
+ {
+ for (col = 0; col < screen_columns; col++)
+ curscr->_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(int total)
+{
+static chtype *tstLine;
+static size_t lenLine;
+
+int row, col;
+int top = total;
+int last = min(screen_columns, newscr->_maxx+1);
+size_t length = sizeof(chtype) * last;
+chtype blank = newscr->_line[total-1].text[last-1]; /* lower right char */
+
+ if(!clr_eos || !can_clear_with(blank))
+ return total;
+
+ if ((tstLine == 0) || (last > (int)lenLine)) {
+ tstLine = typeRealloc(chtype, last, tstLine);
+ }
+
+ if (tstLine != 0) {
+ lenLine = last;
+ for (col = 0; col < last; col++)
+ tstLine[col] = blank;
+
+ for (row = total-1; row >= 0; row--) {
+ if (memcmp(tstLine, newscr->_line[row].text, length))
+ break;
+ if (memcmp(tstLine, curscr->_line[row].text, length))
+ top = row;
+ }
+
+ /* don't use clr_eos for just one line if clr_eol available */
+ if (top < total-1 || (top < total && !clr_eol && !clr_bol)) {
+ GoTo(top,0);
+ ClrToEOS(blank);
+ total = top;
+ if (SP->oldhash && SP->newhash)
+ {
+ for (row = top; row < screen_lines; row++)
+ SP->oldhash[row] = SP->newhash[row];
+ }
+ }
+ }
+#if NO_LEAKS
+ if (tstLine != 0)
+ FreeAndNull(tstLine);
+#endif
+ return total;
+}
+
+
+/*
+** TransformLine(lineno)
+**
+** Transform the given line in curscr to the one in newscr, using
+** Insert/Delete Character if _nc_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(int const lineno)
+{
+int firstChar, oLastChar, nLastChar;
+chtype *newLine = newscr->_line[lineno].text;
+chtype *oldLine = curscr->_line[lineno].text;
+int n;
+bool attrchanged = FALSE;
+
+ T(("TransformLine(%d) called", lineno));
+
+ /* copy new hash value to old one */
+ if (SP->oldhash && SP->newhash)
+ SP->oldhash[lineno] = SP->newhash[lineno];
+
+ if(ceol_standout_glitch && clr_eol) {
+ firstChar = 0;
+ while(firstChar < screen_columns) {
+ if(AttrOf(newLine[firstChar]) != AttrOf(oldLine[firstChar]))
+ attrchanged = TRUE;
+ firstChar++;
+ }
+ }
+
+ firstChar = 0;
+
+ if (attrchanged) { /* we may have to disregard the whole line */
+ GoTo(lineno, firstChar);
+ ClrToEOL(ClrBlank(curscr));
+ PutRange(oldLine, newLine, lineno, 0, (screen_columns-1));
+#if USE_XMC_SUPPORT
+
+#define NEW(r,c) newscr->_line[r].text[c]
+#define xmc_turn_on(a,b) ((((a)^(b)) & ~(a) & SP->_xmc_triggers) != 0)
+#define xmc_turn_off(a,b) xmc_turn_on(b,a)
+
+ /*
+ * 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(lineno, firstChar);
+ for (n = 0; n < screen_columns; 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 (TextOf(newLine[n]) == ' '
+ && ((n > 0
+ && xmc_turn_on(newLine[n-1], newLine[n]))
+ || (n == 0
+ && lineno > 0
+ && xmc_turn_on(NEW(lineno-1,screen_columns-1), newLine[n])))) {
+ n = m;
+ }
+
+ PutChar(newLine[n]);
+
+ /* check for turn-off:
+ * If we are writing an attributed non-blank, where the
+ * next cell is blank, and not attributed.
+ */
+ if (TextOf(newLine[n]) != ' '
+ && ((n+1 < screen_columns
+ && xmc_turn_off(newLine[n], newLine[n+1]))
+ || (n+1 >= screen_columns
+ && lineno+1 < screen_lines
+ && xmc_turn_off(newLine[n], NEW(lineno+1,0))))) {
+ n = m;
+ }
+
+ }
+#undef NEW
+#endif
+ } else {
+ chtype blank;
+
+ /* find the first differing character */
+ while (firstChar < screen_columns &&
+ newLine[firstChar] == oldLine[firstChar])
+ firstChar++;
+
+ /* if there wasn't one, we're done */
+ if (firstChar >= screen_columns)
+ return;
+
+ /* it may be cheap to clear leading whitespace with clr_bol */
+ if (clr_bol && can_clear_with(blank=newLine[0]))
+ {
+ int oFirstChar, nFirstChar;
+
+ for (oFirstChar = 0; oFirstChar < screen_columns; oFirstChar++)
+ if (oldLine[oFirstChar] != blank)
+ break;
+ for (nFirstChar = 0; nFirstChar < screen_columns; nFirstChar++)
+ if (newLine[nFirstChar] != blank)
+ break;
+
+ if (nFirstChar > oFirstChar + SP->_el1_cost)
+ {
+ if (nFirstChar >= screen_columns && SP->_el_cost <= SP->_el1_cost)
+ {
+ GoTo(lineno, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("clr_eol");
+ putp(clr_eol);
+ }
+ else
+ {
+ GoTo(lineno, nFirstChar - 1);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("clr_bol");
+ putp(clr_bol);
+ }
+
+ while (firstChar < nFirstChar)
+ oldLine[firstChar++] = blank;
+
+ if (firstChar >= screen_columns)
+ return;
+ }
+ }
+
+ blank = newLine[screen_columns-1];
+
+ if(!can_clear_with(blank))
+ {
+ /* find the last differing character */
+ nLastChar = screen_columns - 1;
+
+ while (nLastChar > firstChar
+ && newLine[nLastChar] == oldLine[nLastChar])
+ nLastChar--;
+
+ if (nLastChar >= firstChar) {
+ GoTo(lineno, firstChar);
+ PutRange(oldLine, newLine, lineno, firstChar, nLastChar);
+ memcpy( oldLine + firstChar,
+ newLine + firstChar,
+ (nLastChar - firstChar + 1) * sizeof(chtype));
+ }
+ return;
+ }
+
+ /* find last non-blank character on old line */
+ oLastChar = screen_columns - 1;
+ while (oLastChar > firstChar && oldLine[oLastChar] == blank)
+ oLastChar--;
+
+ /* find last non-blank character on new line */
+ nLastChar = screen_columns - 1;
+ while (nLastChar > firstChar && newLine[nLastChar] == blank)
+ nLastChar--;
+
+ if((nLastChar == firstChar)
+ && (SP->_el_cost < (oLastChar - nLastChar))) {
+ GoTo(lineno, firstChar);
+ if(newLine[firstChar] != blank )
+ PutChar(newLine[firstChar]);
+ ClrToEOL(blank);
+ } else if( (nLastChar != oLastChar)
+ && (newLine[nLastChar] != oldLine[oLastChar]
+ || !(_nc_idcok && has_ic())) ) {
+ GoTo(lineno, firstChar);
+ if ((oLastChar - nLastChar) > SP->_el_cost) {
+ if(PutRange(oldLine, newLine, lineno, firstChar, nLastChar))
+ GoTo(lineno, nLastChar+1);
+ ClrToEOL(blank);
+ } else {
+ n = max( nLastChar , oLastChar );
+ PutRange(oldLine, newLine, lineno, firstChar, n);
+ }
+ } else {
+ int nLastNonblank = nLastChar;
+ int oLastNonblank = oLastChar;
+
+ /* find the last characters that really differ */
+ while (newLine[nLastChar] == oldLine[oLastChar]) {
+ if (nLastChar != 0
+ && oLastChar != 0) {
+ nLastChar--;
+ oLastChar--;
+ } else {
+ break;
+ }
+ }
+
+ n = min(oLastChar, nLastChar);
+ if (n >= firstChar) {
+ GoTo(lineno, firstChar);
+ PutRange(oldLine, newLine, lineno, firstChar, n);
+ }
+
+ if (oLastChar < nLastChar) {
+ int m = max(nLastNonblank, oLastNonblank);
+ GoTo(lineno, n+1);
+ if (InsCharCost(nLastChar - oLastChar)
+ > (m - n)) {
+ PutRange(oldLine, newLine, lineno, n+1, m);
+ } else {
+ InsStr(&newLine[n+1], nLastChar - oLastChar);
+ }
+ } else if (oLastChar > nLastChar ) {
+ GoTo(lineno, n+1);
+ if (DelCharCost(oLastChar - nLastChar)
+ > SP->_el_cost + nLastNonblank - (n+1)) {
+ if(PutRange(oldLine, newLine, lineno,
+ n+1, nLastNonblank))
+ GoTo(lineno, nLastNonblank+1);
+ ClrToEOL(blank);
+ } 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(blank);
+ DelChar(oLastChar - nLastChar);
+ }
+ }
+ }
+ }
+
+ /* update the code's internal representation */
+ if (screen_columns > firstChar)
+ memcpy( oldLine + firstChar,
+ newLine + firstChar,
+ (screen_columns - firstChar) * sizeof(chtype));
+}
+
+/*
+** ClearScreen(blank)
+**
+** Clear the physical screen and put cursor at home
+**
+*/
+
+static void ClearScreen(chtype blank)
+{
+ int i, j;
+
+ T(("ClearScreen() called"));
+
+ if (clear_screen) {
+ UpdateAttrs(blank);
+ TPUTS_TRACE("clear_screen");
+ putp(clear_screen);
+ SP->_cursrow = SP->_curscol = 0;
+#ifdef POSITION_DEBUG
+ position_check(SP->_cursrow, SP->_curscol, "ClearScreen");
+#endif /* POSITION_DEBUG */
+ } else if (clr_eos) {
+ SP->_cursrow = SP->_curscol = -1;
+ GoTo(0,0);
+
+ UpdateAttrs(blank);
+ TPUTS_TRACE("clr_eos");
+ putp(clr_eos);
+ } else if (clr_eol) {
+ SP->_cursrow = SP->_curscol = -1;
+
+ for (i = 0; i < screen_lines; i++) {
+ GoTo(i, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("clr_eol");
+ putp(clr_eol);
+ }
+ GoTo(0,0);
+ } else {
+ T(("cannot clear screen"));
+ return;
+ }
+
+ for (i = 0; i < screen_lines; i++) {
+ for (j = 0; j < screen_columns; j++)
+ curscr->_line[i].text[j] = blank;
+ }
+
+ T(("screen cleared"));
+}
+
+/*
+** InsStr(line, count)
+**
+** Insert the count characters pointed to by line.
+**
+*/
+
+static int InsStr(chtype *line, int count)
+{
+ T(("InsStr(%p,%d) called", 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");
+ tputs(tparm(parm_ich, count), count, _nc_outch);
+ while (count) {
+ PutAttrChar(*line);
+ line++;
+ count--;
+ }
+ return(OK);
+ } else if (enter_insert_mode && exit_insert_mode) {
+ TPUTS_TRACE("enter_insert_mode");
+ putp(enter_insert_mode);
+ while (count) {
+ PutAttrChar(*line);
+ if (insert_padding)
+ {
+ TPUTS_TRACE("insert_padding");
+ putp(insert_padding);
+ }
+ line++;
+ count--;
+ }
+ TPUTS_TRACE("exit_insert_mode");
+ putp(exit_insert_mode);
+ return(OK);
+ } else {
+ while (count) {
+ TPUTS_TRACE("insert_character");
+ putp(insert_character);
+ PutAttrChar(*line);
+ if (insert_padding)
+ {
+ TPUTS_TRACE("insert_padding");
+ putp(insert_padding);
+ }
+ line++;
+ count--;
+ }
+ return(OK);
+ }
+}
+
+/*
+** DelChar(count)
+**
+** Delete count characters at current position
+**
+*/
+
+static void DelChar(int count)
+{
+ T(("DelChar(%d) called, position = (%d,%d)", count, newscr->_cury, newscr->_curx));
+
+ if (parm_dch) {
+ TPUTS_TRACE("parm_dch");
+ tputs(tparm(parm_dch, count), count, _nc_outch);
+ } else {
+ while (count--)
+ {
+ TPUTS_TRACE("delete_character");
+ putp(delete_character);
+ }
+ }
+}
+
+/*
+** _nc_outstr(char *str)
+**
+** Emit a string without waiting for update.
+*/
+
+void _nc_outstr(const char *str)
+{
+ FILE *ofp = SP ? SP->_ofp : stdout;
+
+ (void) fputs(str, ofp);
+ (void) fflush(ofp);
+
+#ifdef TRACE
+ _nc_outchars += strlen(str);
+#endif /* TRACE */
+}
+
+/*
+ * 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(int n, int top, int bot, int miny, int maxy, chtype blank)
+{
+ int i;
+
+ if (n == 1 && scroll_forward && top == miny && bot == maxy)
+ {
+ GoTo(bot, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("scroll_forward");
+ tputs(scroll_forward, 0, _nc_outch);
+ }
+ else if (n == 1 && delete_line && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("delete_line");
+ tputs(delete_line, 0, _nc_outch);
+ }
+ else if (parm_index && top == miny && bot == maxy)
+ {
+ GoTo(bot, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("parm_index");
+ tputs(tparm(parm_index, n, 0), n, _nc_outch);
+ }
+ else if (parm_delete_line && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("parm_delete_line");
+ tputs(tparm(parm_delete_line, n, 0), n, _nc_outch);
+ }
+ else if (scroll_forward && top == miny && bot == maxy)
+ {
+ GoTo(bot, 0);
+ UpdateAttrs(blank);
+ for (i = 0; i < n; i++)
+ {
+ TPUTS_TRACE("scroll_forward");
+ tputs(scroll_forward, 0, _nc_outch);
+ }
+ }
+ else if (delete_line && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ for (i = 0; i < n; i++)
+ {
+ TPUTS_TRACE("delete_line");
+ tputs(delete_line, 0, _nc_outch);
+ }
+ }
+ else
+ return ERR;
+
+ return OK;
+}
+
+/* Try to scroll down assuming given csr (miny, maxy). Returns ERR on failure */
+/* n > 0 */
+static int scroll_csr_backward(int n, int top, int bot, int miny, int maxy, chtype blank)
+{
+ int i;
+
+ if (n == 1 && scroll_reverse && top == miny && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("scroll_reverse");
+ tputs(scroll_reverse, 0, _nc_outch);
+ }
+ else if (n == 1 && insert_line && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("insert_line");
+ tputs(insert_line, 0, _nc_outch);
+ }
+ else if (parm_rindex && top == miny && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("parm_rindex");
+ tputs(tparm(parm_rindex, n, 0), n, _nc_outch);
+ }
+ else if (parm_insert_line && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ TPUTS_TRACE("parm_insert_line");
+ tputs(tparm(parm_insert_line, n, 0), n, _nc_outch);
+ }
+ else if (scroll_reverse && top == miny && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ for (i = 0; i < n; i++)
+ {
+ TPUTS_TRACE("scroll_reverse");
+ tputs(scroll_reverse, 0, _nc_outch);
+ }
+ }
+ else if (insert_line && bot == maxy)
+ {
+ GoTo(top, 0);
+ UpdateAttrs(blank);
+ for (i = 0; i < n; i++)
+ {
+ TPUTS_TRACE("insert_line");
+ tputs(insert_line, 0, _nc_outch);
+ }
+ }
+ else
+ return ERR;
+
+ return OK;
+}
+
+/* scroll by using delete_line at del and insert_line at ins */
+/* n > 0 */
+static int scroll_idl(int n, int del, int ins, chtype blank)
+{
+ int i;
+
+ if(!((parm_delete_line || delete_line) && (parm_insert_line || insert_line)))
+ return ERR;
+
+ GoTo(del, 0);
+ UpdateAttrs(blank);
+ if (n == 1 && delete_line)
+ {
+ TPUTS_TRACE("delete_line");
+ tputs(delete_line, 0, _nc_outch);
+ }
+ else if (parm_delete_line)
+ {
+ TPUTS_TRACE("parm_delete_line");
+ tputs(tparm(parm_delete_line, n, 0), n, _nc_outch);
+ }
+ else /* if (delete_line) */
+ {
+ for (i = 0; i < n; i++)
+ {
+ TPUTS_TRACE("delete_line");
+ tputs(delete_line, 0, _nc_outch);
+ }
+ }
+
+ GoTo(ins, 0);
+ UpdateAttrs(blank);
+ if (n == 1 && insert_line)
+ {
+ TPUTS_TRACE("insert_line");
+ tputs(insert_line, 0, _nc_outch);
+ }
+ else if (parm_insert_line)
+ {
+ TPUTS_TRACE("parm_insert_line");
+ tputs(tparm(parm_insert_line, n, 0), n, _nc_outch);
+ }
+ else /* if (insert_line) */
+ {
+ for (i = 0; i < n; i++)
+ {
+ TPUTS_TRACE("insert_line");
+ tputs(insert_line, 0, _nc_outch);
+ }
+ }
+
+ return OK;
+}
+
+int _nc_scrolln(int n, int top, int bot, int maxy)
+/* scroll region from top to bot by n lines */
+{
+ chtype blank=ClrBlank(stdscr);
+ int i;
+ bool cursor_saved=FALSE;
+ int res;
+
+ TR(TRACE_MOVE, ("mvcur_scrolln(%d, %d, %d, %d)", n, top, bot, maxy));
+
+#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.
+ */
+ if (non_dest_scroll_region || (memory_above && top == 0)) {
+ for (i = 0; i < n; i++)
+ {
+ GoTo(i, 0);
+ ClrToEOL(BLANK);
+ }
+ }
+
+ res = scroll_csr_forward(n, top, bot, 0, maxy, blank);
+
+ if (res == ERR && change_scroll_region)
+ {
+ if ((((n==1 && scroll_forward) || parm_index)
+ && (SP->_cursrow == bot || SP->_cursrow == bot-1))
+ && save_cursor && restore_cursor)
+ {
+ cursor_saved=TRUE;
+ TPUTS_TRACE("save_cursor");
+ tputs(save_cursor, 0, _nc_outch);
+ }
+ TPUTS_TRACE("change_scroll_region");
+ tputs(tparm(change_scroll_region, top, bot), 0, _nc_outch);
+ if (cursor_saved)
+ {
+ TPUTS_TRACE("restore_cursor");
+ tputs(restore_cursor, 0, _nc_outch);
+ }
+ else
+ {
+ SP->_cursrow = SP->_curscol = -1;
+ }
+
+ res = scroll_csr_forward(n, top, bot, top, bot, blank);
+
+ TPUTS_TRACE("change_scroll_region");
+ tputs(tparm(change_scroll_region, 0, maxy), 0, _nc_outch);
+ SP->_cursrow = SP->_curscol = -1;
+ }
+
+ if (res == ERR && _nc_idlok)
+ res = scroll_idl(n, top, bot-n+1, blank);
+ }
+ else /* (n < 0) - scroll down (backward) */
+ {
+ /*
+ * Do explicit clear to end of region if it's possible that the
+ * terminal might hold on to stuff we push off the end.
+ */
+ if (non_dest_scroll_region || (memory_below && bot == maxy))
+ {
+ if (bot == maxy && clr_eos)
+ {
+ GoTo(maxy + n, 0);
+ ClrToEOS(BLANK);
+ }
+ else if (clr_eol)
+ {
+ for (i = 0; i < -n; i++)
+ {
+ GoTo(maxy + n + i, 0);
+ ClrToEOL(BLANK);
+ }
+ }
+ }
+
+ res = scroll_csr_backward(-n, top, bot, 0, maxy, blank);
+
+ if (res == ERR && change_scroll_region)
+ {
+ if (top != 0 && (SP->_cursrow == top || SP->_cursrow == top-1)
+ && save_cursor && restore_cursor)
+ {
+ cursor_saved=TRUE;
+ TPUTS_TRACE("save_cursor");
+ tputs(save_cursor, 0, _nc_outch);
+ }
+ TPUTS_TRACE("change_scroll_region");
+ tputs(tparm(change_scroll_region, top, bot), 0, _nc_outch);
+ if (cursor_saved)
+ {
+ TPUTS_TRACE("restore_cursor");
+ tputs(restore_cursor, 0, _nc_outch);
+ }
+ else
+ {
+ SP->_cursrow = SP->_curscol = -1;
+ }
+
+ res = scroll_csr_backward(-n, top, bot, top, bot, blank);
+
+ TPUTS_TRACE("change_scroll_region");
+ tputs(tparm(change_scroll_region, 0, maxy), 0, _nc_outch);
+ SP->_cursrow = SP->_curscol = -1;
+ }
+
+ if (res == ERR && _nc_idlok)
+ res = scroll_idl(-n, bot+n+1, top, blank);
+ }
+
+ if (res == ERR)
+ return(ERR);
+
+ _nc_scroll_window(curscr, n, top, bot, blank);
+
+ /* shift hash values too - they can be reused */
+ _nc_scroll_oldhash(n, top, bot);
+
+ return(OK);
+}
+
+
+void _nc_screen_resume()
+{
+ /* make sure terminal is in a sane known state */
+ SP->_current_attr = A_NORMAL;
+ newscr->_clear = TRUE;
+
+ if (SP->_coloron == TRUE && orig_pair)
+ putp(orig_pair);
+ if (exit_attribute_mode)
+ putp(exit_attribute_mode);
+ else
+ {
+ /* turn off attributes */
+ if (exit_alt_charset_mode)
+ putp(exit_alt_charset_mode);
+ if (exit_standout_mode)
+ putp(exit_standout_mode);
+ if (exit_underline_mode)
+ putp(exit_underline_mode);
+ }
+ if (exit_insert_mode)
+ putp(exit_insert_mode);
+ if (enter_am_mode && exit_am_mode)
+ putp(auto_right_margin ? enter_am_mode : exit_am_mode);
+}
+
+void _nc_screen_init()
+{
+ _nc_screen_resume();
+}
+
+/* wrap up screen handling */
+void _nc_screen_wrap()
+{
+ UpdateAttrs(A_NORMAL);
+}
+
+#if USE_XMC_SUPPORT
+void _nc_do_xmc_glitch(attr_t previous)
+{
+ attr_t chg = XMC_CHANGES(previous ^ SP->_current_attr);
+
+ while (chg != 0) {
+ if (chg & 1) {
+ SP->_curscol += magic_cookie_glitch;
+ if (SP->_curscol >= SP->_columns)
+ wrap_cursor();
+ T(("bumped to %d,%d after cookie", SP->_cursrow, SP->_curscol));
+ }
+ chg >>= 1;
+ }
+}
+#endif /* USE_XMC_SUPPORT */
diff --git a/contrib/ncurses/panel/Makefile.in b/contrib/ncurses/panel/Makefile.in
new file mode 100644
index 000000000000..3110f830558c
--- /dev/null
+++ b/contrib/ncurses/panel/Makefile.in
@@ -0,0 +1,143 @@
+# $Id: Makefile.in,v 1.28 1998/11/29 01:03:31 Rick.Ohnemus Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+MODEL = @DFT_LWR_MODEL@
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+
+ticdir = $(datadir)/terminfo
+
+INSTALL = @INSTALL@
+INSTALL_LIB = @INSTALL@ @INSTALL_LIB@
+INSTALL_DATA = @INSTALL_DATA@
+
+AR = @AR@
+AR_OPTS = @AR_OPTS@
+AWK = @AWK@
+LD = @LD@
+LN_S = @LN_S@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+
+CPPFLAGS = @CPPFLAGS@ \
+ -DHAVE_CONFIG_H -DTERMINFO=\"$(ticdir)\"
+
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -pg
+CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
+
+LINK = $(CC)
+LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@
+
+SHLIB_DIRS = -L../lib -L$(libdir)
+SHLIB_LIST = $(SHLIB_DIRS) -lncurses @SHLIB_LIST@
+
+MK_SHARED_LIB = @MK_SHARED_LIB@
+
+REL_VERSION = @cf_cv_rel_version@
+ABI_VERSION = @cf_cv_abi_version@
+
+RANLIB = @RANLIB@
+
+LIBRARIES = @LIBS_TO_MAKE@
+
+LINT = @LINT@
+LINT_OPTS = @LINT_OPTS@
+LINT_LIBS = -lpanel -lncurses @LIBS@
+
+AUTO_SRC = \
+ ../include/panel.h
+
+################################################################################
+all install :: $(AUTO_SRC) $(LIBRARIES)
+
+sources: $(AUTO_SRC)
+
+$(INSTALL_PREFIX)$(libdir) :
+ $(srcdir)/../mkinstalldirs $@
+
+# 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 $@
+
+PANEL_PRIV_H = \
+ $(srcdir)/panel.priv.h \
+ $(srcdir)/panel.h
+
+tags:
+ ctags *.[ch]
+
+TAGS:
+ etags *.[ch]
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.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/contrib/ncurses/panel/headers b/contrib/ncurses/panel/headers
new file mode 100644
index 000000000000..fa0164cde8cd
--- /dev/null
+++ b/contrib/ncurses/panel/headers
@@ -0,0 +1,31 @@
+##############################################################################
+# Copyright (c) 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> 1996
+#
+$(srcdir)/panel.h
diff --git a/contrib/ncurses/panel/llib-lpanel b/contrib/ncurses/panel/llib-lpanel
new file mode 100644
index 000000000000..ab75ffee56e8
--- /dev/null
+++ b/contrib/ncurses/panel/llib-lpanel
@@ -0,0 +1,167 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997 *
+ ****************************************************************************/
+/* LINTLIBRARY */
+
+/* ./panel.c */
+
+#include "panel.priv.h"
+
+#undef _nc_free_obscure
+void _nc_free_obscure(
+ PANEL *pan)
+ { /* void */ }
+
+#undef _nc_override
+void _nc_override(
+ const PANEL *pan,
+ int show)
+ { /* void */ }
+
+#undef _nc_calculate_obscure
+void _nc_calculate_obscure(void)
+ { /* void */ }
+
+#undef _nc_panel_is_linked
+bool _nc_panel_is_linked(
+ const PANEL *pan)
+ { return(*(bool *)0); }
+
+#undef _nc_panel_link_bottom
+void _nc_panel_link_bottom(
+ PANEL *pan)
+ { /* void */ }
+
+/* ./p_above.c */
+
+#undef panel_above
+PANEL *panel_above(
+ const PANEL *pan)
+ { return(*(PANEL **)0); }
+
+/* ./p_below.c */
+
+#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
+void update_panels(void)
+ { /* void */ }
+
+/* ./p_user.c */
+
+#undef set_panel_userptr
+int set_panel_userptr(
+ PANEL *pan,
+ void *uptr)
+ { return(*(int *)0); }
+
+#undef panel_userptr
+void *panel_userptr(
+ const PANEL *pan)
+ { return(*(void **)0); }
+
+/* ./p_win.c */
+
+#undef panel_window
+WINDOW *panel_window(
+ const PANEL *pan)
+ { return(*(WINDOW **)0); }
diff --git a/contrib/ncurses/panel/modules b/contrib/ncurses/panel/modules
new file mode 100644
index 000000000000..ed51d2c12a90
--- /dev/null
+++ b/contrib/ncurses/panel/modules
@@ -0,0 +1,49 @@
+##############################################################################
+# Copyright (c) 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> 1995,1997
+#
+
+@ base
+# Library objects
+panel lib $(srcdir) $(PANEL_PRIV_H)
+p_above lib $(srcdir) $(PANEL_PRIV_H)
+p_below lib $(srcdir) $(PANEL_PRIV_H)
+p_bottom lib $(srcdir) $(PANEL_PRIV_H)
+p_delete lib $(srcdir) $(PANEL_PRIV_H)
+p_hide lib $(srcdir) $(PANEL_PRIV_H)
+p_hidden lib $(srcdir) $(PANEL_PRIV_H)
+p_move lib $(srcdir) $(PANEL_PRIV_H)
+p_new lib $(srcdir) $(PANEL_PRIV_H)
+p_replace lib $(srcdir) $(PANEL_PRIV_H)
+p_show lib $(srcdir) $(PANEL_PRIV_H)
+p_top lib $(srcdir) $(PANEL_PRIV_H)
+p_update lib $(srcdir) $(PANEL_PRIV_H)
+p_user lib $(srcdir) $(PANEL_PRIV_H)
+p_win lib $(srcdir) $(PANEL_PRIV_H)
+
diff --git a/contrib/ncurses/panel/p_above.c b/contrib/ncurses/panel/p_above.c
new file mode 100644
index 000000000000..0c3d10fc224c
--- /dev/null
+++ b/contrib/ncurses/panel/p_above.c
@@ -0,0 +1,51 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* p_above.c
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_above.c,v 1.2 1998/02/11 12:14:01 tom Exp $")
+
+PANEL*
+panel_above(const PANEL *pan)
+{
+ if(!pan)
+ {
+ /* if top and bottom are equal, we have no or only the pseudo panel;
+ if not, we return the panel above the pseudo panel */
+ return(_nc_bottom_panel==_nc_top_panel ? (PANEL*)0 : _nc_bottom_panel->above);
+ }
+ else
+ return(pan->above);
+}
diff --git a/contrib/ncurses/panel/p_below.c b/contrib/ncurses/panel/p_below.c
new file mode 100644
index 000000000000..7e0f2b24d07d
--- /dev/null
+++ b/contrib/ncurses/panel/p_below.c
@@ -0,0 +1,53 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* p_below.c
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_below.c,v 1.2 1998/02/11 12:14:01 tom Exp $")
+
+PANEL*
+panel_below(const PANEL *pan)
+{
+ if(!pan)
+ {
+ /* if top and bottom are equal, we have no or only the pseudo panel */
+ return(_nc_top_panel==_nc_bottom_panel ? (PANEL*)0 : _nc_top_panel);
+ }
+ else
+ {
+ /* we must not return the pseudo panel */
+ return(pan->below==_nc_bottom_panel ? (PANEL*) 0 : pan->below);
+ }
+}
diff --git a/contrib/ncurses/panel/p_bottom.c b/contrib/ncurses/panel/p_bottom.c
new file mode 100644
index 000000000000..47abc694a8f4
--- /dev/null
+++ b/contrib/ncurses/panel/p_bottom.c
@@ -0,0 +1,53 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* 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.2 1998/02/11 12:14:01 tom Exp $")
+
+int
+bottom_panel(PANEL *pan)
+{
+ if(!pan)
+ return(ERR);
+ if(pan == _nc_bottom_panel)
+ return(OK);
+ dBug(("--> bottom_panel %s", USER_PTR(pan->user)));
+ if(_nc_panel_is_linked(pan))
+ (void)hide_panel(pan);
+ _nc_panel_link_bottom(pan);
+ return(OK);
+}
diff --git a/contrib/ncurses/panel/p_delete.c b/contrib/ncurses/panel/p_delete.c
new file mode 100644
index 000000000000..aabccdc428f1
--- /dev/null
+++ b/contrib/ncurses/panel/p_delete.c
@@ -0,0 +1,53 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* 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.2 1998/02/11 12:14:01 tom Exp $")
+
+int
+del_panel(PANEL *pan)
+{
+ if(pan)
+ {
+ dBug(("--> del_panel %s", USER_PTR(pan->user)));
+ if(_nc_panel_is_linked(pan))
+ (void)hide_panel(pan);
+ free((void *)pan);
+ return(OK);
+ }
+ return(ERR);
+}
diff --git a/contrib/ncurses/panel/p_hidden.c b/contrib/ncurses/panel/p_hidden.c
new file mode 100644
index 000000000000..4b90a619da0b
--- /dev/null
+++ b/contrib/ncurses/panel/p_hidden.c
@@ -0,0 +1,47 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* p_hidden.c
+ * Test whether or not panel is hidden
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_hidden.c,v 1.2 1998/02/11 12:14:01 tom Exp $")
+
+int
+panel_hidden(const PANEL *pan)
+{
+ if(!pan)
+ return(ERR);
+ return(_nc_panel_is_linked(pan) ? TRUE : FALSE);
+}
diff --git a/contrib/ncurses/panel/p_hide.c b/contrib/ncurses/panel/p_hide.c
new file mode 100644
index 000000000000..bc7c192156cf
--- /dev/null
+++ b/contrib/ncurses/panel/p_hide.c
@@ -0,0 +1,99 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:01 tom Exp $")
+
+/*+-------------------------------------------------------------------------
+ __panel_unlink(pan) - unlink panel from stack
+--------------------------------------------------------------------------*/
+static void
+__panel_unlink(PANEL *pan)
+{
+ PANEL *prev;
+ PANEL *next;
+
+#ifdef TRACE
+ dStack("<u%d>",1,pan);
+ if(!_nc_panel_is_linked(pan))
+ return;
+#endif
+
+ _nc_override(pan,P_TOUCH);
+ _nc_free_obscure(pan);
+
+ prev = pan->below;
+ next = pan->above;
+
+ if(prev)
+ { /* if non-zero, we will not update the list head */
+ prev->above = next;
+ if(next)
+ next->below = prev;
+ }
+ else if(next)
+ next->below = prev;
+ if(pan == _nc_bottom_panel)
+ _nc_bottom_panel = next;
+ if(pan == _nc_top_panel)
+ _nc_top_panel = prev;
+
+ _nc_calculate_obscure();
+
+ pan->above = (PANEL *)0;
+ pan->below = (PANEL *)0;
+ dStack("<u%d>",9,pan);
+}
+
+int
+hide_panel(register PANEL *pan)
+{
+ if(!pan)
+ return(ERR);
+
+ dBug(("--> hide_panel %s", USER_PTR(pan->user)));
+
+ if(!_nc_panel_is_linked(pan))
+ {
+ pan->above = (PANEL *)0;
+ pan->below = (PANEL *)0;
+ return(ERR);
+ }
+
+ __panel_unlink(pan);
+ return(OK);
+}
diff --git a/contrib/ncurses/panel/p_move.c b/contrib/ncurses/panel/p_move.c
new file mode 100644
index 000000000000..6bec36b91246
--- /dev/null
+++ b/contrib/ncurses/panel/p_move.c
@@ -0,0 +1,59 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* p_move.c
+ * Move a panel to a new location
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_move.c,v 1.2 1998/02/11 12:14:01 tom Exp $")
+
+int
+move_panel(PANEL *pan, int starty, int startx)
+{
+ WINDOW *win;
+
+ if(!pan)
+ return(ERR);
+ if(_nc_panel_is_linked(pan))
+ _nc_override(pan,P_TOUCH);
+ win = pan->win;
+ if(mvwin(win,starty,startx))
+ return(ERR);
+ getbegyx(win, pan->wstarty, pan->wstartx);
+ pan->wendy = pan->wstarty + getmaxy(win);
+ pan->wendx = pan->wstartx + getmaxx(win);
+ if(_nc_panel_is_linked(pan))
+ _nc_calculate_obscure();
+ return(OK);
+}
diff --git a/contrib/ncurses/panel/p_new.c b/contrib/ncurses/panel/p_new.c
new file mode 100644
index 000000000000..b4acc27983cb
--- /dev/null
+++ b/contrib/ncurses/panel/p_new.c
@@ -0,0 +1,99 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* p_new.c
+ * Creation of a new panel
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_new.c,v 1.2 1998/02/11 12:14:01 tom Exp $")
+
+/*+-------------------------------------------------------------------------
+ Get root (i.e. stdscr's) panel.
+ Establish the pseudo panel for stdscr if necessary.
+--------------------------------------------------------------------------*/
+static PANEL*
+root_panel(void)
+{
+ if(_nc_stdscr_pseudo_panel == (PANEL*)0)
+ {
+
+ assert(stdscr && !_nc_bottom_panel && !_nc_top_panel);
+ _nc_stdscr_pseudo_panel = (PANEL*)malloc(sizeof(PANEL));
+ if (_nc_stdscr_pseudo_panel != 0) {
+ PANEL* pan = _nc_stdscr_pseudo_panel;
+ WINDOW* win = stdscr;
+ pan->win = win;
+ getbegyx(win, pan->wstarty, pan->wstartx);
+ pan->wendy = pan->wstarty + getmaxy(win);
+ pan->wendx = pan->wstartx + getmaxx(win);
+ pan->below = (PANEL*)0;
+ pan->above = (PANEL*)0;
+ pan->obscure = (PANELCONS*)0;
+#ifdef TRACE
+ pan->user = "stdscr";
+#else
+ pan->user = (void*)0;
+#endif
+ _nc_panel_link_bottom(pan);
+ }
+ }
+ return _nc_stdscr_pseudo_panel;
+}
+
+PANEL *
+new_panel(WINDOW *win)
+{
+ PANEL *pan = (PANEL*)0;
+
+ (void)root_panel();
+ assert(_nc_stdscr_pseudo_panel);
+
+ if (!(win->_flags & _ISPAD) && (pan = (PANEL*)malloc(sizeof(PANEL))))
+ {
+ pan->win = win;
+ pan->above = (PANEL *)0;
+ pan->below = (PANEL *)0;
+ getbegyx(win, pan->wstarty, pan->wstartx);
+ pan->wendy = pan->wstarty + getmaxy(win);
+ pan->wendx = pan->wstartx + getmaxx(win);
+#ifdef TRACE
+ pan->user = "new";
+#else
+ pan->user = (char *)0;
+#endif
+ pan->obscure = (PANELCONS *)0;
+ (void)show_panel(pan);
+ }
+ return(pan);
+}
diff --git a/contrib/ncurses/panel/p_replace.c b/contrib/ncurses/panel/p_replace.c
new file mode 100644
index 000000000000..c34d51d3813c
--- /dev/null
+++ b/contrib/ncurses/panel/p_replace.c
@@ -0,0 +1,52 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:01 tom Exp $")
+
+int
+replace_panel(PANEL *pan, WINDOW *win)
+{
+ if(!pan)
+ return(ERR);
+ if(_nc_panel_is_linked(pan))
+ _nc_override(pan,P_TOUCH);
+ pan->win = win;
+ if(_nc_panel_is_linked(pan))
+ _nc_calculate_obscure();
+ return(OK);
+}
diff --git a/contrib/ncurses/panel/p_show.c b/contrib/ncurses/panel/p_show.c
new file mode 100644
index 000000000000..10781efb73a2
--- /dev/null
+++ b/contrib/ncurses/panel/p_show.c
@@ -0,0 +1,76 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:01 tom Exp $")
+
+static void
+panel_link_top(PANEL *pan)
+{
+#ifdef TRACE
+ dStack("<lt%d>",1,pan);
+ if(_nc_panel_is_linked(pan))
+ return;
+#endif
+
+ pan->above = (PANEL *)0;
+ pan->below = (PANEL *)0;
+ if(_nc_top_panel)
+ {
+ _nc_top_panel->above = pan;
+ pan->below = _nc_top_panel;
+ }
+ _nc_top_panel = pan;
+ if(!_nc_bottom_panel)
+ _nc_bottom_panel = pan;
+ _nc_calculate_obscure();
+ dStack("<lt%d>",9,pan);
+}
+
+int
+show_panel(PANEL *pan)
+{
+ if(!pan)
+ return(ERR);
+ if(pan == _nc_top_panel)
+ return(OK);
+ dBug(("--> show_panel %s", USER_PTR(pan->user)));
+ if(_nc_panel_is_linked(pan))
+ (void)hide_panel(pan);
+ panel_link_top(pan);
+ return(OK);
+}
diff --git a/contrib/ncurses/panel/p_top.c b/contrib/ncurses/panel/p_top.c
new file mode 100644
index 000000000000..2ce5bb3e6695
--- /dev/null
+++ b/contrib/ncurses/panel/p_top.c
@@ -0,0 +1,45 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:01 tom Exp $")
+
+int
+top_panel(PANEL *pan)
+{
+ return(show_panel(pan));
+}
diff --git a/contrib/ncurses/panel/p_update.c b/contrib/ncurses/panel/p_update.c
new file mode 100644
index 000000000000..e7e31ef69295
--- /dev/null
+++ b/contrib/ncurses/panel/p_update.c
@@ -0,0 +1,61 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* p_update.c
+ * wnoutrefresh windows in an orderly fashion
+ */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: p_update.c,v 1.2 1998/02/11 12:14:01 tom Exp $")
+
+void
+update_panels(void)
+{
+ PANEL *pan;
+
+ dBug(("--> update_panels"));
+ pan = _nc_bottom_panel;
+ while(pan)
+ {
+ _nc_override(pan,P_UPDATE);
+ pan = pan->above;
+ }
+
+ pan = _nc_bottom_panel;
+ while (pan)
+ {
+ if (is_wintouched(pan->win))
+ Wnoutrefresh(pan);
+ pan = pan->above;
+ }
+}
diff --git a/contrib/ncurses/panel/p_user.c b/contrib/ncurses/panel/p_user.c
new file mode 100644
index 000000000000..28b6526bb41c
--- /dev/null
+++ b/contrib/ncurses/panel/p_user.c
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.3 1998/02/11 12:14:01 tom Exp $")
+
+int
+set_panel_userptr(PANEL *pan, NCURSES_CONST void *uptr)
+{
+ if(!pan)
+ return(ERR);
+ pan->user = uptr;
+ return(OK);
+}
+
+NCURSES_CONST void*
+panel_userptr(const PANEL *pan)
+{
+ return(pan ? pan->user : (NCURSES_CONST void *)0);
+}
+
diff --git a/contrib/ncurses/panel/p_win.c b/contrib/ncurses/panel/p_win.c
new file mode 100644
index 000000000000..9c5a313de36f
--- /dev/null
+++ b/contrib/ncurses/panel/p_win.c
@@ -0,0 +1,49 @@
+/****************************************************************************
+ * Copyright (c) 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: 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.2 1998/02/11 12:14:01 tom Exp $")
+
+WINDOW*
+panel_window(const PANEL *pan)
+{
+ return(pan ? pan->win : (WINDOW *)0);
+}
+
+
+
+
diff --git a/contrib/ncurses/panel/panel.c b/contrib/ncurses/panel/panel.c
new file mode 100644
index 000000000000..749664392080
--- /dev/null
+++ b/contrib/ncurses/panel/panel.c
@@ -0,0 +1,308 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* panel.c -- implementation of panels library, some core routines */
+#include "panel.priv.h"
+
+MODULE_ID("$Id: panel.c,v 1.16 1998/09/19 21:26:31 Todd.Miller Exp $")
+
+#ifdef TRACE
+#ifndef TRACE_TXT
+const char *_nc_my_visbuf(const void *ptr)
+{
+ char temp[32];
+ if (ptr != 0)
+ sprintf(temp, "ptr:%p", ptr);
+ else
+ strcpy(temp, "<null>");
+ return _nc_visbuf(temp);
+}
+#endif
+#endif
+
+
+/*+-------------------------------------------------------------------------
+ dPanel(text,pan)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+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),
+ (pan->below) ? USER_PTR(pan->below->user) : "--",
+ (pan->above) ? USER_PTR(pan->above->user) : "--",
+ pan->wstarty, pan->wstartx);
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+ dStack(fmt,num,pan)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+void
+_nc_dStack(const char *fmt, int num, const PANEL *pan)
+{
+ char s80[80];
+
+ sprintf(s80,fmt,num,pan);
+ _tracef("%s b=%s t=%s",s80,
+ (_nc_bottom_panel) ? USER_PTR(_nc_bottom_panel->user) : "--",
+ (_nc_top_panel) ? USER_PTR(_nc_top_panel->user) : "--");
+ if(pan)
+ _tracef("pan id=%s", USER_PTR(pan->user));
+ pan = _nc_bottom_panel;
+ while(pan)
+ {
+ dPanel("stk",pan);
+ pan = pan->above;
+ }
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+ Wnoutrefresh(pan) - debugging hook for wnoutrefresh
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+void
+_nc_Wnoutrefresh(const PANEL *pan)
+{
+ dPanel("wnoutrefresh",pan);
+ wnoutrefresh(pan->win);
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+ Touchpan(pan)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+void
+_nc_Touchpan(const PANEL *pan)
+{
+ dPanel("Touchpan",pan);
+ touchwin(pan->win);
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+ Touchline(pan,start,count)
+--------------------------------------------------------------------------*/
+#ifdef TRACE
+void
+_nc_Touchline(const PANEL *pan, int start, int count)
+{
+ char s80[80];
+ sprintf(s80,"Touchline s=%d c=%d",start,count);
+ dPanel(s80,pan);
+ touchline(pan->win,start,count);
+}
+#endif
+
+/*+-------------------------------------------------------------------------
+ __panels_overlapped(pan1,pan2) - check panel overlapped
+--------------------------------------------------------------------------*/
+static INLINE bool
+__panels_overlapped(register const PANEL *pan1, register const PANEL *pan2)
+{
+ if(!pan1 || !pan2)
+ return(FALSE);
+
+ dBug(("__panels_overlapped %s %s", USER_PTR(pan1->user), USER_PTR(pan2->user)));
+ /* pan1 intersects with pan2 ? */
+ if( (((pan1->wstarty >= pan2->wstarty) && (pan1->wstarty < pan2->wendy)) ||
+ ((pan2->wstarty >= pan1->wstarty) && (pan2->wstarty < pan1->wendy))) &&
+ (((pan1->wstartx >= pan2->wstartx) && (pan1->wstartx < pan2->wendx)) ||
+ ((pan2->wstartx >= pan1->wstartx) && (pan2->wstartx < pan1->wendx)))
+ ) return(TRUE);
+ else {
+ dBug((" no"));
+ return(FALSE);
+ }
+}
+
+/*+-------------------------------------------------------------------------
+ _nc_free_obscure(pan)
+--------------------------------------------------------------------------*/
+void
+_nc_free_obscure(PANEL *pan)
+{
+ PANELCONS *tobs = pan->obscure; /* "this" one */
+ PANELCONS *nobs; /* "next" one */
+
+ while(tobs)
+ {
+ nobs = tobs->above;
+ free((char *)tobs);
+ tobs = nobs;
+ }
+ pan->obscure = (PANELCONS *)0;
+}
+
+/*+-------------------------------------------------------------------------
+ __override(pan,show)
+--------------------------------------------------------------------------*/
+void
+_nc_override(const PANEL *pan, int show)
+{
+ int y;
+ PANEL *pan2;
+ PANELCONS *tobs = pan->obscure; /* "this" one */
+
+ dBug(("_nc_override %s,%d", USER_PTR(pan->user),show));
+
+ switch (show)
+ {
+ case P_TOUCH:
+ Touchpan(pan);
+ /* The following while loop will now mark all panel window lines
+ * obscured by use or obscuring us as touched, so they will be
+ * updated.
+ */
+ break;
+ case P_UPDATE:
+ while(tobs && (tobs->pan != pan))
+ tobs = tobs->above;
+ /* The next loop will now only go through the panels obscuring pan;
+ * it updates all the lines in the obscuring panels in sync. with
+ * the lines touched in pan itself. This is called in update_panels()
+ * in a loop from the bottom_panel to the top_panel, resulting in
+ * the desired update effect.
+ */
+ break;
+ default:
+ return;
+ }
+
+ while(tobs)
+ {
+ if((pan2 = tobs->pan) != pan) {
+ dBug(("test obs pan=%s pan2=%s", USER_PTR(pan->user), USER_PTR(pan2->user)));
+ for(y = pan->wstarty; y < pan->wendy; y++) {
+ if( (y >= pan2->wstarty) && (y < pan2->wendy) &&
+ ((is_linetouched(pan->win,y - pan->wstarty) == TRUE)) )
+ Touchline(pan2,y - pan2->wstarty,1);
+ }
+ }
+ tobs = tobs->above;
+ }
+}
+
+/*+-------------------------------------------------------------------------
+ __calculate_obscure()
+--------------------------------------------------------------------------*/
+void
+_nc_calculate_obscure(void)
+{
+ PANEL *pan;
+ PANEL *pan2;
+ PANELCONS *tobs; /* "this" one */
+ PANELCONS *lobs = (PANELCONS *)0; /* last one */
+
+ pan = _nc_bottom_panel;
+ while(pan)
+ {
+ if(pan->obscure)
+ _nc_free_obscure(pan);
+ dBug(("--> __calculate_obscure %s", USER_PTR(pan->user)));
+ lobs = (PANELCONS *)0; /* last one */
+ pan2 = _nc_bottom_panel;
+ /* This loop builds a list of panels obsured by pan or obscuring
+ pan; pan itself is in the list; all panels before pan are
+ obscured by pan, all panels after pan are obscuring pan. */
+ while(pan2)
+ {
+ if(__panels_overlapped(pan,pan2))
+ {
+ if(!(tobs = (PANELCONS *)malloc(sizeof(PANELCONS))))
+ return;
+ tobs->pan = pan2;
+ dPanel("obscured",pan2);
+ tobs->above = (PANELCONS *)0;
+ if(lobs)
+ lobs->above = tobs;
+ else
+ pan->obscure = tobs;
+ lobs = tobs;
+ }
+ pan2 = pan2->above;
+ }
+ _nc_override(pan,P_TOUCH);
+ pan = pan->above;
+ }
+}
+
+/*+-------------------------------------------------------------------------
+ _nc_panel_is_linked(pan) - check to see if panel is in the stack
+--------------------------------------------------------------------------*/
+bool
+_nc_panel_is_linked(const PANEL *pan)
+{
+ /* 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 */
+ return ( ((pan->above!=(PANEL *)0) ||
+ (pan->below!=(PANEL *)0) ||
+ (pan==_nc_bottom_panel)) ? TRUE : FALSE );
+}
+
+
+/*+-------------------------------------------------------------------------
+ __panel_link_bottom(pan) - link panel into stack at bottom
+--------------------------------------------------------------------------*/
+void
+_nc_panel_link_bottom(PANEL *pan)
+{
+#ifdef TRACE
+ dStack("<lb%d>",1,pan);
+ if(_nc_panel_is_linked(pan))
+ return;
+#endif
+
+ pan->above = (PANEL *)0;
+ pan->below = (PANEL *)0;
+ if(_nc_bottom_panel)
+ { /* the stdscr pseudo panel always stays real bottom;
+ so we insert after bottom panel*/
+ pan->below = _nc_bottom_panel;
+ pan->above = _nc_bottom_panel->above;
+ if (pan->above)
+ pan->above->below = pan;
+ _nc_bottom_panel->above = pan;
+ }
+ else
+ _nc_bottom_panel = pan;
+ if(!_nc_top_panel)
+ _nc_top_panel = pan;
+ assert(_nc_bottom_panel == _nc_stdscr_pseudo_panel);
+ _nc_calculate_obscure();
+ dStack("<lb%d>",9,pan);
+}
diff --git a/contrib/ncurses/panel/panel.h b/contrib/ncurses/panel/panel.h
new file mode 100644
index 000000000000..2ebc3292b3b1
--- /dev/null
+++ b/contrib/ncurses/panel/panel.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/* panel.h -- interface file for panels library */
+
+#ifndef _PANEL_H
+#define _PANEL_H
+
+#include <curses.h>
+
+typedef struct panel
+{
+ WINDOW *win;
+ int wstarty;
+ int wendy;
+ int wstartx;
+ int wendx;
+ struct panel *below;
+ struct panel *above;
+ NCURSES_CONST void *user;
+ struct panelcons *obscure;
+}
+PANEL;
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern WINDOW *panel_window(const PANEL *);
+extern void update_panels(void);
+extern int hide_panel(PANEL *);
+extern int show_panel(PANEL *);
+extern int del_panel(PANEL *);
+extern int top_panel(PANEL *);
+extern int bottom_panel(PANEL *);
+extern PANEL *new_panel(WINDOW *);
+extern PANEL *panel_above(const PANEL *);
+extern PANEL *panel_below(const PANEL *);
+extern int set_panel_userptr(PANEL *, NCURSES_CONST void *);
+extern NCURSES_CONST void* panel_userptr(const PANEL *);
+extern int move_panel(PANEL *, int, int);
+extern int replace_panel(PANEL *,WINDOW *);
+extern int panel_hidden(const PANEL *);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* _PANEL_H */
+
+/* end of panel.h */
diff --git a/contrib/ncurses/panel/panel.priv.h b/contrib/ncurses/panel/panel.priv.h
new file mode 100644
index 000000000000..80b1d8f9f27d
--- /dev/null
+++ b/contrib/ncurses/panel/panel.priv.h
@@ -0,0 +1,85 @@
+/* $Id: panel.priv.h,v 1.8 1997/10/21 10:19:37 juergen Exp $ */
+
+#ifndef _PANEL_PRIV_H
+#define _PANEL_PRIV_H
+
+#if HAVE_CONFIG_H
+# include <ncurses_cfg.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#if HAVE_LIBDMALLOC
+# include <dmalloc.h> /* Gray Watson's library */
+#endif
+
+#if HAVE_LIBDBMALLOC
+# include <dbmalloc.h> /* Conor Cahill's library */
+#endif
+
+#include <nc_panel.h>
+#include "panel.h"
+
+#if ( CC_HAS_INLINE_FUNCS && !defined(TRACE) )
+# define INLINE inline
+#else
+# define INLINE
+#endif
+
+typedef struct panelcons
+{
+ struct panelcons *above;
+ struct panel *pan;
+} PANELCONS;
+
+#ifdef USE_RCS_IDS
+# define MODULE_ID(id) static const char Ident[] = id;
+#else
+# define MODULE_ID(id) /*nothing*/
+#endif
+
+#define P_TOUCH (0)
+#define P_UPDATE (1)
+
+#ifdef TRACE
+ extern const char *_nc_my_visbuf(const void *);
+# ifdef TRACE_TXT
+# define USER_PTR(ptr) _nc_visbuf((const char *)ptr)
+# else
+# define USER_PTR(ptr) _nc_my_visbuf((const char *)ptr)
+# endif
+
+ extern void _nc_dPanel(const char*, const PANEL*);
+ extern void _nc_dStack(const char*, int, const PANEL*);
+ extern void _nc_Wnoutrefresh(const PANEL*);
+ extern void _nc_Touchpan(const PANEL*);
+ extern 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 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
+
+#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
+
+extern void _nc_panel_link_bottom(PANEL*);
+extern bool _nc_panel_is_linked(const PANEL*);
+extern void _nc_calculate_obscure(void);
+extern void _nc_free_obscure(PANEL*);
+extern void _nc_override(const PANEL*,int);
+
+#endif /* _PANEL_PRIV_H */
diff --git a/contrib/ncurses/progs/MKtermsort.sh b/contrib/ncurses/progs/MKtermsort.sh
new file mode 100755
index 000000000000..6cbe9548354e
--- /dev/null
+++ b/contrib/ncurses/progs/MKtermsort.sh
@@ -0,0 +1,121 @@
+#!/bin/sh
+#
+# MKtermsort.sh -- generate indirection vectors for the various sort methods
+#
+# 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.
+#
+AWK=${1-awk}
+DATA=${2-../include/Caps}
+
+echo "/*";
+echo " * termsort.c --- sort order arrays for use by infocmp.";
+echo " *";
+echo " * Note: this file is generated using termsort.sh, do not edit by hand.";
+echo " */";
+
+echo "static const int 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 int 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 int 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 int 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 int 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 int 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 int 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 int 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 int 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 int bool_from_termcap[] = {";
+$AWK <$DATA '
+$3 == "bool" && substr($5, 1, 1) == "-" {print "0,\t/* ", $2, " */";}
+$3 == "bool" && substr($5, 1, 1) == "Y" {print "1,\t/* ", $2, " */";}
+'
+echo "};";
+echo "";
+
+echo "static const int num_from_termcap[] = {";
+$AWK <$DATA '
+$3 == "num" && substr($5, 1, 1) == "-" {print "0,\t/* ", $2, " */";}
+$3 == "num" && substr($5, 1, 1) == "Y" {print "1,\t/* ", $2, " */";}
+'
+echo "};";
+echo "";
+
+echo "static const int str_from_termcap[] = {";
+$AWK <$DATA '
+$3 == "str" && substr($5, 1, 1) == "-" {print "0,\t/* ", $2, " */";}
+$3 == "str" && substr($5, 1, 1) == "Y" {print "1,\t/* ", $2, " */";}
+'
+echo "};";
+echo "";
+
diff --git a/contrib/ncurses/progs/Makefile.in b/contrib/ncurses/progs/Makefile.in
new file mode 100644
index 000000000000..f22a016843bc
--- /dev/null
+++ b/contrib/ncurses/progs/Makefile.in
@@ -0,0 +1,243 @@
+# $Id: Makefile.in,v 1.37 1998/05/31 00:07:33 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+CF_MFLAGS = @cf_cv_makeflags@
+@SET_MAKE@
+x = @PROG_EXT@
+
+MODEL = ../@DFT_OBJ_SUBDIR@
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+
+ticdir = $(datadir)/terminfo
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+
+AWK = @AWK@
+LN_S = @LN_S@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+
+INCDIR = $(srcdir)/../include
+CPPFLAGS = -I../progs -I$(srcdir) @CPPFLAGS@ \
+ -DHAVE_CONFIG_H -DTERMINFO=\"$(ticdir)\"
+
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -pg
+CFLAGS_SHARED = $(CCFLAGS) # @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
+
+LD = @LD@
+LINK = @LINK_PROGS@ $(CC)
+LDFLAGS = @EXTRA_LDFLAGS@ \
+ @PROG_ARGS@ @LDFLAGS@ @LD_MODEL@ @LIBS@ @EXTRA_LIBS@
+
+LDFLAGS_NORMAL = $(LDFLAGS)
+LDFLAGS_DEBUG = $(LDFLAGS) @CC_G_OPT@
+LDFLAGS_PROFILE = $(LDFLAGS) -pg
+LDFLAGS_SHARED = $(LDFLAGS) @LD_SHARED_OPTS@
+
+LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@)
+
+LINT = @LINT@
+LINT_OPTS = @LINT_OPTS@
+LINT_LIBS = -lncurses @LIBS@
+
+AUTO_SRC = \
+ termsort.c
+
+PROGS = tic$x toe$x infocmp$x clear$x tput$x tset$x
+
+TESTPROGS = mvcur$x tctest$x hardscroll$x hashmap$x
+
+# Default library, for linking applications
+DEPS_CURSES = @LIB_PREFIX@ncurses@DFT_DEP_SUFFIX@
+
+################################################################################
+all: $(AUTO_SRC) $(PROGS)
+
+sources: $(AUTO_SRC)
+
+install: install.progs
+uninstall: uninstall.progs
+
+# this line simplifies the configure-script
+install.libs:
+uninstall.libs:
+
+install.progs: $(PROGS) $(INSTALL_PREFIX)$(bindir)
+ $(INSTALL_PROGRAM) tic$x $(INSTALL_PREFIX)$(bindir)/tic$x
+ $(INSTALL_PROGRAM) toe$x $(INSTALL_PREFIX)$(bindir)/toe$x
+ $(INSTALL_PROGRAM) infocmp$x $(INSTALL_PREFIX)$(bindir)/infocmp$x
+ $(INSTALL_PROGRAM) clear$x $(INSTALL_PREFIX)$(bindir)/clear$x
+ $(INSTALL_PROGRAM) tput$x $(INSTALL_PREFIX)$(bindir)/tput$x
+ $(INSTALL_PROGRAM) tset$x $(INSTALL_PREFIX)$(bindir)/tset$x
+ @echo "linking captoinfo to tic"
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/captoinfo$x
+ (cd $(INSTALL_PREFIX)$(bindir) && $(LN_S) tic$x captoinfo$x)
+ @echo "linking infotocap to tic"
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/infotocap$x
+ (cd $(INSTALL_PREFIX)$(bindir) && $(LN_S) tic$x infotocap$x)
+ @echo "linking reset to tset"
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/reset$x
+ (cd $(INSTALL_PREFIX)$(bindir) && $(LN_S) tset$x reset$x)
+
+uninstall.progs:
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/tic$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/toe$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/infocmp$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/clear$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/tput$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/tset$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/captoinfo$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/infotocap$x
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/reset$x
+
+$(INSTALL_PREFIX)$(bindir) :
+ $(srcdir)/../mkinstalldirs $@
+
+#
+# Utilities normally built by make all start here
+#
+
+DEPS_TIC = \
+ $(MODEL)/tic.o \
+ $(MODEL)/dump_entry.o
+
+tic$x: $(DEPS_TIC) $(DEPS_CURSES)
+ @ECHO_LINK@ $(LINK) $(DEPS_TIC) $(LDFLAGS_DEFAULT) -o $@
+
+DEPS_TOE = \
+ $(MODEL)/toe.o \
+ $(MODEL)/dump_entry.o
+
+toe$x: $(DEPS_TOE) $(DEPS_CURSES)
+ @ECHO_LINK@ $(LINK) $(DEPS_TOE) $(LDFLAGS_DEFAULT) -o $@
+
+DEPS_CLEAR = \
+ $(MODEL)/clear.o
+
+clear$x: $(DEPS_CLEAR) $(DEPS_CURSES)
+ @ECHO_LINK@ $(LINK) $(DEPS_CLEAR) $(LDFLAGS_DEFAULT) -o $@
+
+DEPS_TPUT = \
+ $(MODEL)/tput.o
+
+tput$x: $(DEPS_TPUT) $(DEPS_CURSES)
+ @ECHO_LINK@ $(LINK) $(DEPS_TPUT) $(LDFLAGS_DEFAULT) -o $@
+
+DEPS_INFOCMP = \
+ $(MODEL)/infocmp.o \
+ $(MODEL)/dump_entry.o
+
+infocmp$x: $(DEPS_INFOCMP) $(DEPS_CURSES)
+ @ECHO_LINK@ $(LINK) $(DEPS_INFOCMP) $(LDFLAGS_DEFAULT) -o $@
+
+DEPS_TSET = \
+ $(MODEL)/tset.o \
+ $(MODEL)/dump_entry.o
+
+tset$x: $(DEPS_TSET) $(DEPS_CURSES)
+ @ECHO_LINK@ $(LINK) $(DEPS_TSET) $(LDFLAGS_DEFAULT) -o $@
+
+termsort.c: $(srcdir)/MKtermsort.sh
+ sh -c "$(srcdir)/MKtermsort.sh $(AWK) $(srcdir)/../include/Caps" >$@
+
+#
+# Utility productions start here
+#
+
+tags:
+ ctags *.[ch]
+
+TAGS:
+ etags *.[ch]
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+ -rm -f $(TESTPROGS)
+
+clean :: mostlyclean
+ -rm -f $(AUTO_SRC)
+ -rm -f $(PROGS)
+
+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) $(CF_MFLAGS)
+$(DEPS_CURSES) :
+ cd ../ncurses; $(MAKE) $(CF_MFLAGS)
+
+lint:
+ $(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)/tic.c $(srcdir)/dump_entry.c $(LINT_LIBS)
+ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/toe.c $(srcdir)/dump_entry.c $(LINT_LIBS)
+ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tput.c $(LINT_LIBS)
+ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tset.c $(srcdir)/dump_entry.c $(LINT_LIBS)
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/contrib/ncurses/progs/capconvert b/contrib/ncurses/progs/capconvert
new file mode 100755
index 000000000000..2125a0d68d02
--- /dev/null
+++ b/contrib/ncurses/progs/capconvert
@@ -0,0 +1,229 @@
+#!/bin/sh
+# $Id: capconvert,v 1.3 1997/08/02 21:52:06 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
+ if test "$TERM" = "xterm"
+ then
+ 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;
+ else
+ echo "We will have to make a local one for you anyway, to capture the effect"
+ echo "of your TERMCAP variable."
+ fi
+else
+ echo "No system-wide terminfo tree. We will make you a local one."
+fi
+echo "";
+
+# Check if test -x works (it's 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="$ac_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=`echo $master | 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 ans;
+ ;;
+ 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$$.*" 0 1 2 5 15
+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 0 1 2 5 15
+#
+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's 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 decription you want with infocmp(1),"
+echo "edit to taste, and recompile using tic(1)."
+
+# capconvert ends here
+
diff --git a/contrib/ncurses/progs/clear.c b/contrib/ncurses/progs/clear.c
new file mode 100644
index 000000000000..d27b62544a94
--- /dev/null
+++ b/contrib/ncurses/progs/clear.c
@@ -0,0 +1,58 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * clear.c -- clears the terminal's screen
+ */
+
+#include <progs.priv.h>
+
+#include <curses.h>
+
+MODULE_ID("$Id: clear.c,v 1.8 1998/09/26 11:42:50 tom Exp $")
+
+static int putch(int c)
+{
+ return putchar(c);
+}
+
+int main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ setupterm((char *) 0, STDOUT_FILENO, (int *) 0);
+ return (tputs(clear_screen, lines > 0 ? lines : 1, putch) == ERR)
+ ? EXIT_FAILURE
+ : EXIT_SUCCESS;
+}
diff --git a/contrib/ncurses/progs/clear.sh b/contrib/ncurses/progs/clear.sh
new file mode 100755
index 000000000000..1b6b0bb8a607
--- /dev/null
+++ b/contrib/ncurses/progs/clear.sh
@@ -0,0 +1 @@
+exec tput clear
diff --git a/contrib/ncurses/progs/dump_entry.c b/contrib/ncurses/progs/dump_entry.c
new file mode 100644
index 000000000000..8324fe225228
--- /dev/null
+++ b/contrib/ncurses/progs/dump_entry.c
@@ -0,0 +1,913 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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> *
+ ****************************************************************************/
+
+#define __INTERNAL_CAPS_VISIBLE
+#include <progs.priv.h>
+
+#include "dump_entry.h"
+#include "termsort.c" /* this C file is generated */
+#include <parametrized.h> /* so is this */
+
+MODULE_ID("$Id: dump_entry.c,v 1.37 1999/03/14 12:29:30 tom Exp $")
+
+#define INDENT 8
+
+#define DISCARD(string) string = ABSENT_STRING
+
+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 column; /* current column, limited by 'width' */
+static int oldcol; /* last value of column before wrap */
+static int tracelevel; /* level of debug output */
+static bool pretty; /* true if we format if-then-else strings */
+
+static char *outbuf; /* the output-buffer */
+static size_t out_used; /* ...its current length */
+static size_t out_size; /* ...and its allocated length */
+
+/* indirection pointers for implementing sort and display modes */
+static const int *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;
+
+/* 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 */
+
+#define OBSOLETE(n) (n[0] == 'O' && n[1] == 'T')
+
+#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
+
+#if NO_LEAKS
+void _nc_leaks_dump_entry(void)
+{
+ if (outbuf != 0) {
+ free(outbuf);
+ outbuf = 0;
+ }
+}
+#endif
+
+NCURSES_CONST char *nametrans(const char *name)
+/* translate a capability name from termcap to 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:
+ if (bool_from_termcap[np->nte_index])
+ return(boolcodes[np->nte_index]);
+ break;
+
+ case NUMBER:
+ if (num_from_termcap[np->nte_index])
+ return(numcodes[np->nte_index]);
+ break;
+
+ case STRING:
+ if (str_from_termcap[np->nte_index])
+ return(strcodes[np->nte_index]);
+ break;
+ }
+
+ return(0);
+}
+
+void dump_init(const char *version, int mode, int sort, int twidth, int traceval, bool formatted)
+/* set up for entry display */
+{
+ width = twidth;
+ pretty = formatted;
+ tracelevel = traceval;
+
+ /* 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 ? ", " : ",";
+ trailer = "\n\t";
+ break;
+
+ case F_VARIABLE:
+ bool_names = boolfnames;
+ num_names = numfnames;
+ str_names = strfnames;
+ separator = twidth ? ", " : ",";
+ trailer = "\n\t";
+ break;
+
+ case F_TERMCAP:
+ case F_TCONVERR:
+ bool_names = boolcodes;
+ num_names = numcodes;
+ str_names = strcodes;
+ separator = ":";
+ trailer = "\\\n\t:";
+ break;
+ }
+
+ /* 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 TERMTYPE *cur_type;
+
+static int dump_predicate(int type, int 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(TERMTYPE *tp);
+static void repair_acsc(TERMTYPE *tp);
+
+/* is this the index of a function key string? */
+#define FNKEY(i) (((i)<= 65 && (i)>= 75) || ((i)<= 216 && (i)>= 268))
+
+static bool version_filter(int type, int 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:
+ /* below and including xon_xoff */
+ return ((idx <= 20) ? TRUE : FALSE);
+ case NUMBER:
+ /* below and including width_status_line */
+ return ((idx <= 7) ? TRUE : FALSE);
+ case STRING:
+ /* below and including prtr_non */
+ return ((idx <= 144) ? TRUE : FALSE);
+ }
+ break;
+
+ case V_HPUX: /* Hewlett-Packard */
+ switch (type)
+ {
+ case BOOLEAN:
+ /* below and including xon_xoff */
+ return ((idx <= 20) ? TRUE : FALSE);
+ case NUMBER:
+ /* below and including label_width */
+ return ((idx <= 10) ? TRUE : FALSE);
+ case STRING:
+ if (idx <= 144) /* below and including prtr_non */
+ return(TRUE);
+ else if (FNKEY(idx)) /* function keys */
+ return(TRUE);
+ else if (idx==147||idx==156||idx==157) /* plab_norm,label_on,label_off */
+ return(TRUE);
+ else
+ return(FALSE);
+ }
+ break;
+
+ case V_AIX: /* AIX */
+ switch (type)
+ {
+ case BOOLEAN:
+ /* below and including xon_xoff */
+ return ((idx <= 20) ? TRUE : FALSE);
+ case NUMBER:
+ /* below and including width_status_line */
+ return ((idx <= 7) ? TRUE : FALSE);
+ case STRING:
+ if (idx <= 144) /* below and including prtr_non */
+ return(TRUE);
+ else if (FNKEY(idx)) /* function keys */
+ return(TRUE);
+ else
+ return(FALSE);
+ }
+ break;
+
+ case V_BSD: /* BSD */
+ switch (type)
+ {
+ case BOOLEAN:
+ return bool_from_termcap[idx];
+ case NUMBER:
+ return num_from_termcap[idx];
+ case STRING:
+ return str_from_termcap[idx];
+ }
+ break;
+ }
+
+ return(FALSE); /* pacify the compiler */
+}
+
+static
+void append_output (const char *src)
+{
+ if (src == 0) {
+ out_used = 0;
+ append_output("");
+ } else {
+ size_t need = strlen(src);
+ size_t want = need + out_used + 1;
+ if (want > out_size) {
+ out_size += want; /* be generous */
+ if (outbuf == 0)
+ outbuf = malloc(out_size);
+ else
+ outbuf = realloc(outbuf, out_size);
+ }
+ (void)strcpy(outbuf + out_used, src);
+ out_used += need;
+ }
+}
+
+static
+void force_wrap(void)
+{
+ oldcol = column;
+ append_output(trailer);
+ column = INDENT;
+}
+
+static
+void wrap_concat(const char *src)
+{
+ int need = strlen(src);
+ int want = strlen(separator) + need;
+
+ if (column > INDENT
+ && column + want > width) {
+ force_wrap();
+ }
+ append_output(src);
+ append_output(separator);
+ column += need;
+}
+
+#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 char * fmt_complex(char *dst, char *src, int level)
+{
+ int percent = 0;
+ int n;
+
+ dst += strlen(dst);
+ while (*src != '\0') {
+ switch (*src) {
+ case '\\':
+ percent = 0;
+ *dst++ = *src++;
+ break;
+ case '%':
+ percent = 1;
+ break;
+ case '?': /* "if" */
+ case 't': /* "then" */
+ case 'e': /* "else" */
+ if (percent) {
+ percent = 0;
+ dst[-1] = '\n';
+ for (n = 0; n <= level; n++)
+ *dst++ = '\t';
+ *dst++ = '%';
+ *dst++ = *src;
+ *dst = '\0';
+ if (*src++ == '?') {
+ src = fmt_complex(dst, src, level+1);
+ dst += strlen(dst);
+ } else if (level == 1) {
+ _nc_warning("%%%c without %%?", *src);
+ }
+ continue;
+ }
+ break;
+ case ';': /* "endif" */
+ if (percent) {
+ percent = 0;
+ if (level > 1) {
+ dst[-1] = '\n';
+ for (n = 0; n < level; n++)
+ *dst++ = '\t';
+ *dst++ = '%';
+ *dst++ = *src++;
+ *dst = '\0';
+ return src;
+ }
+ _nc_warning("%%; without %%?");
+ }
+ break;
+ default:
+ percent = 0;
+ break;
+ }
+ *dst++ = *src++;
+ }
+ *dst = '\0';
+ return src;
+}
+
+int fmt_entry(TERMTYPE *tterm,
+ int (*pred)(int type, int idx),
+ bool suppress_untranslatable,
+ bool infodump,
+ int numbers)
+{
+int i, j;
+char buffer[MAX_TERMINFO_LENGTH];
+NCURSES_CONST char *name;
+int predval, len;
+int num_bools = 0;
+int num_values = 0;
+int num_strings = 0;
+bool outcount = 0;
+
+#define WRAP_CONCAT \
+ wrap_concat(buffer); \
+ outcount = TRUE
+
+ len = 12; /* terminfo file-header */
+
+ if (pred == 0) {
+ cur_type = tterm;
+ pred = dump_predicate;
+ }
+
+ append_output(0);
+ append_output(tterm->term_names);
+ append_output(separator);
+ column = out_used;
+ force_wrap();
+
+ for_each_boolean(j,tterm) {
+ i = BoolIndirect(j);
+ name = ExtBoolname(tterm,i,bool_names);
+
+ if (!version_filter(BOOLEAN, i))
+ continue;
+ else if ((outform == F_LITERAL || outform == F_TERMINFO || outform == F_VARIABLE)
+ && (OBSOLETE(name) && outform != F_LITERAL))
+ continue;
+
+ predval = pred(BOOLEAN, i);
+ if (predval != FAIL) {
+ (void) strcpy(buffer, name);
+ if (predval <= 0)
+ (void) strcat(buffer, "@");
+ else if (i + 1 > num_bools)
+ num_bools = i + 1;
+ WRAP_CONCAT;
+ }
+ }
+
+ if (column != INDENT)
+ force_wrap();
+
+ for_each_number(j,tterm) {
+ i = NumIndirect(j);
+ name = ExtNumname(tterm,i,num_names);
+
+ if (!version_filter(NUMBER, i))
+ continue;
+ else if ((outform == F_LITERAL || outform == F_TERMINFO || outform == F_VARIABLE)
+ && (OBSOLETE(name) && outform != F_LITERAL))
+ continue;
+
+ predval = pred(NUMBER, i);
+ if (predval != FAIL) {
+ if (tterm->Numbers[i] < 0) {
+ sprintf(buffer, "%s@", name);
+ } else {
+ sprintf(buffer, "%s#%d", name, tterm->Numbers[i]);
+ if (i + 1 > num_values)
+ num_values = i + 1;
+ }
+ WRAP_CONCAT;
+ }
+ }
+
+ if (column != INDENT)
+ force_wrap();
+
+ len += num_bools
+ + num_values * 2
+ + strlen(tterm->term_names) + 1;
+ if (len & 1)
+ len++;
+
+ repair_acsc(tterm);
+ for_each_string(j, tterm) {
+ i = StrIndirect(j);
+ name = ExtStrname(tterm,i,str_names);
+
+ if (!version_filter(STRING, i))
+ continue;
+ else if ((outform == F_LITERAL || outform == F_TERMINFO || outform == F_VARIABLE)
+ && (OBSOLETE(name) && outform != F_LITERAL))
+ continue;
+
+ /*
+ * 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 (outform==F_TERMCAP)
+ {
+#undef CUR
+#define CUR tterm->
+ if (insert_character || parm_ich)
+ {
+ if (&tterm->Strings[i] == &enter_insert_mode
+ && enter_insert_mode == ABSENT_STRING)
+ {
+ (void) strcpy(buffer, "im=");
+ goto catenate;
+ }
+
+ if (&tterm->Strings[i] == &exit_insert_mode
+ && exit_insert_mode == ABSENT_STRING)
+ {
+ (void) strcpy(buffer, "ei=");
+ goto catenate;
+ }
+ }
+
+ if (init_3string != 0
+ && termcap_reset != 0
+ && !strcmp(init_3string, termcap_reset))
+ DISCARD(init_3string);
+
+ if (reset_2string != 0
+ && termcap_reset != 0
+ && !strcmp(reset_2string, termcap_reset))
+ DISCARD(reset_2string);
+ }
+
+ predval = pred(STRING, i);
+ buffer[0] = '\0';
+ if (predval != FAIL) {
+ if (tterm->Strings[i] != ABSENT_STRING
+ && i + 1 > num_strings)
+ num_strings = i + 1;
+ if (!VALID_STRING(tterm->Strings[i]))
+ sprintf(buffer, "%s@", name);
+ else if (outform == F_TERMCAP || outform == F_TCONVERR)
+ {
+ char *srccap = _nc_tic_expand(tterm->Strings[i], FALSE, numbers);
+ char *cv = _nc_infotocap(name, srccap, parametrized[i]);
+
+ if (cv == 0)
+ {
+ if (outform == F_TCONVERR)
+ sprintf(buffer, "%s=!!! %s WILL NOT CONVERT !!!", name, srccap);
+ else if (suppress_untranslatable)
+ continue;
+ else
+ sprintf(buffer, "..%s=%s", name, srccap);
+ }
+ else
+ sprintf(buffer, "%s=%s", name, cv);
+ len += strlen(tterm->Strings[i]) + 1;
+ }
+ else
+ {
+ char *src = _nc_tic_expand(tterm->Strings[i], outform==F_TERMINFO, numbers);
+ sprintf(buffer, "%s=", name);
+ if (pretty && outform==F_TERMINFO)
+ fmt_complex(buffer + strlen(buffer), src, 1);
+ else
+ strcat(buffer, src);
+ len += strlen(tterm->Strings[i]) + 1;
+ }
+
+ catenate:
+ WRAP_CONCAT;
+ }
+ }
+ len += 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 (memory_lock)
+ {
+ (void) sprintf(buffer, "meml=%s", memory_lock);
+ WRAP_CONCAT;
+ }
+ if (memory_unlock)
+ {
+ (void) sprintf(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)
+ {
+ (void) strcpy(buffer, "box1=");
+ (void) strcat(buffer, _nc_tic_expand(boxchars, outform==F_TERMINFO, numbers));
+ WRAP_CONCAT;
+ }
+ }
+ }
+
+ /*
+ * kludge: trim off trailer to avoid an extra blank line
+ * in infocmp -u output when there are no string differences
+ */
+ if (outcount)
+ {
+ j = out_used;
+ if (j >= 2
+ && outbuf[j-1] == '\t'
+ && outbuf[j-2] == '\n') {
+ out_used -= 2;
+ } else if (j >= 4
+ && outbuf[j-1] == ':'
+ && outbuf[j-2] == '\t'
+ && outbuf[j-3] == '\n'
+ && outbuf[j-4] == '\\') {
+ out_used -= 4;
+ }
+ outbuf[out_used] = '\0';
+ column = oldcol;
+ }
+
+#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, out_used, outbuf);
+#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 : termcap_length(outbuf));
+}
+
+int dump_entry(TERMTYPE *tterm, bool limited, int numbers, int (*pred)(int type, int idx))
+/* dump a single entry */
+{
+ int len, critlen;
+ const char *legend;
+ bool infodump;
+
+ if (outform==F_TERMCAP || outform==F_TCONVERR)
+ {
+ critlen = MAX_TERMCAP_LENGTH;
+ legend = "older termcap";
+ infodump = FALSE;
+ set_obsolete_termcaps(tterm);
+ }
+ else
+ {
+ critlen = MAX_TERMINFO_LENGTH;
+ legend = "terminfo";
+ infodump = TRUE;
+ }
+
+ if (((len = fmt_entry(tterm, pred, FALSE, infodump, numbers)) > critlen) && limited)
+ {
+ (void) printf("# (untranslatable capabilities removed to fit entry within %d bytes)\n",
+ critlen);
+ if ((len = fmt_entry(tterm, pred, TRUE, infodump, numbers)) > critlen)
+ {
+ /*
+ * We pick on sgr because it's a nice long string capability that
+ * is really just an optimization hack.
+ */
+ char *oldsgr = set_attributes;
+ set_attributes = ABSENT_STRING;
+ (void) printf("# (sgr removed to fit entry within %d bytes)\n",
+ critlen);
+ if ((len = fmt_entry(tterm, pred, TRUE, infodump, numbers)) > critlen)
+ {
+ int oldversion = tversion;
+
+ tversion = V_BSD;
+ (void) printf("# (terminfo-only capabilities suppressed to fit entry within %d bytes)\n",
+ critlen);
+
+ if ((len = fmt_entry(tterm, pred, TRUE, infodump, numbers)) > critlen)
+ {
+ (void) fprintf(stderr,
+ "warning: %s entry is %d bytes long\n",
+ _nc_first_name(tterm->term_names),
+ len);
+ (void) printf(
+ "# WARNING: this entry, %d bytes long, may core-dump %s libraries!\n",
+ len, legend);
+ }
+ tversion = oldversion;
+ }
+ set_attributes = oldsgr;
+ }
+ }
+
+ (void) fputs(outbuf, stdout);
+ return len;
+}
+
+int dump_uses(const char *name, bool infodump)
+/* dump "use=" clauses in the appropriate format */
+{
+ char buffer[MAX_TERMINFO_LENGTH];
+
+ append_output(0);
+ (void)sprintf(buffer, "%s%s", infodump ? "use=" : "tc=", name);
+ wrap_concat(buffer);
+ (void) fputs(outbuf, stdout);
+ return out_used;
+}
+
+void compare_entry(void (*hook)(int t, int i, const char *name), TERMTYPE *tp GCC_UNUSED)
+/* compare two entries */
+{
+ int i, j;
+ NCURSES_CONST char * name;
+
+ (void) fputs(" comparing booleans.\n", stdout);
+ for_each_boolean(j,tp)
+ {
+ i = BoolIndirect(j);
+ name = ExtBoolname(tp,i,bool_names);
+
+ if ((outform == F_LITERAL || outform == F_TERMINFO || outform == F_VARIABLE)
+ && (OBSOLETE(name) && outform != F_LITERAL))
+ continue;
+
+ (*hook)(BOOLEAN, i, name);
+ }
+
+ (void) fputs(" comparing numbers.\n", stdout);
+ for_each_number(j,tp)
+ {
+ i = NumIndirect(j);
+ name = ExtNumname(tp,i,num_names);
+
+ if ((outform==F_LITERAL || outform==F_TERMINFO || outform==F_VARIABLE)
+ && (OBSOLETE(name) && outform != F_LITERAL))
+ continue;
+
+ (*hook)(NUMBER, i, name);
+ }
+
+ (void) fputs(" comparing strings.\n", stdout);
+ for_each_string(j,tp)
+ {
+ i = StrIndirect(j);
+ name = ExtStrname(tp,i,str_names);
+
+ if ((outform==F_LITERAL || outform==F_TERMINFO || outform==F_VARIABLE)
+ && (OBSOLETE(name) && outform != F_LITERAL))
+ continue;
+
+ (*hook)(STRING, i, name);
+ }
+}
+
+#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(TERMTYPE *tp)
+{
+#include "capdefaults.c"
+}
+
+/*
+ * Convert an alternate-character-set string to canonical form: sorted and
+ * unique.
+ */
+static void repair_acsc(TERMTYPE *tp)
+{
+ if (VALID_STRING(acs_chars)) {
+ size_t n, m;
+ char mapped[256];
+ char extra = 0;
+ unsigned source;
+ unsigned target;
+ bool fix_needed = FALSE;
+
+ for (n = 0, source = 0; acs_chars[n] != 0; n++) {
+ target = acs_chars[n];
+ if (source >= target) {
+ fix_needed = TRUE;
+ break;
+ }
+ source = target;
+ if (acs_chars[n+1])
+ n++;
+ }
+ if (fix_needed) {
+ memset(mapped, 0, sizeof(mapped));
+ for (n = 0; acs_chars[n] != 0; n++) {
+ source = acs_chars[n];
+ if ((target = (unsigned char)acs_chars[n+1]) != 0) {
+ mapped[source] = target;
+ n++;
+ } else {
+ extra = source;
+ }
+ }
+ for (n = m = 0; n < sizeof(mapped); n++) {
+ if (mapped[n]) {
+ acs_chars[m++] = n;
+ acs_chars[m++] = mapped[n];
+ }
+ }
+ if (extra)
+ acs_chars[m++] = extra; /* garbage in, garbage out */
+ acs_chars[m] = 0;
+ }
+ }
+}
diff --git a/contrib/ncurses/progs/dump_entry.h b/contrib/ncurses/progs/dump_entry.h
new file mode 100644
index 000000000000..d7e27c53f667
--- /dev/null
+++ b/contrib/ncurses/progs/dump_entry.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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> *
+ ****************************************************************************/
+
+
+/*
+ * Dump control definitions and variables
+ */
+
+/* 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 */
+
+extern NCURSES_CONST char *nametrans(const char *);
+extern void dump_init(const char *, int, int, int, int, bool);
+extern int fmt_entry(TERMTYPE *, int (*)(int, int), bool, bool, int);
+extern int dump_entry(TERMTYPE *, bool, int, int (*)(int, int));
+extern int dump_uses(const char *, bool);
+extern void compare_entry(void (*)(int, int, const char *), TERMTYPE *);
+
+#define FAIL -1
diff --git a/contrib/ncurses/progs/infocmp.c b/contrib/ncurses/progs/infocmp.c
new file mode 100644
index 000000000000..596522408515
--- /dev/null
+++ b/contrib/ncurses/progs/infocmp.c
@@ -0,0 +1,1321 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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> *
+ ****************************************************************************/
+
+
+/*
+ * infocmp.c -- decompile an entry, or compare two entries
+ * written by Eric S. Raymond
+ */
+
+#include <progs.priv.h>
+
+#include <term_entry.h>
+#include <dump_entry.h>
+
+MODULE_ID("$Id: infocmp.c,v 1.44 1999/06/16 00:39:48 tom Exp $")
+
+#define L_CURL "{"
+#define R_CURL "}"
+
+#define MAXTERMS 32 /* max # terminal arguments we can handle */
+
+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 char *tname[MAXTERMS]; /* terminal type names */
+static TERMTYPE term[MAXTERMS]; /* terminfo entries */
+static int termcount; /* count of terminal entries */
+
+static const char *tversion; /* terminfo version selected */
+static int numbers = 0; /* format "%'char'" to/from "%{number}" */
+static int outform; /* output format */
+static int sortmode; /* sort_mode */
+static int itrace; /* trace flag for debugging */
+static int mwidth = 60;
+
+/* 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
+#undef ExitProgram
+static void ExitProgram(int code) GCC_NORETURN;
+static void ExitProgram(int code)
+{
+ while (termcount-- > 0)
+ _nc_free_termtype(&term[termcount]);
+ _nc_leaks_dump_entry();
+ _nc_free_and_exit(code);
+}
+#endif
+
+static char *canonical_name(char *ptr, char *buf)
+/* extract the terminal type's primary name */
+{
+ char *bp;
+
+ (void) strcpy(buf, ptr);
+ if ((bp = strchr(buf, '|')) != (char *)NULL)
+ *bp = '\0';
+
+ return(buf);
+}
+
+/***************************************************************************
+ *
+ * Predicates for dump function
+ *
+ ***************************************************************************/
+
+static int capcmp(const char *s, const char *t)
+/* capability comparison function */
+{
+ if (!VALID_STRING(s) && !VALID_STRING(t))
+ return(0);
+ else if (!VALID_STRING(s) || !VALID_STRING(t))
+ return(1);
+
+ if (ignorepads)
+ return(_nc_capcmp(s, t));
+ else
+ return(strcmp(s, t));
+}
+
+static int use_predicate(int type, int idx)
+/* predicate function to use for use decompilation */
+{
+ TERMTYPE *tp;
+
+ 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'.
+ */
+ for (tp = &term[1]; tp < term + termcount; tp++)
+ if (tp->Booleans[idx]) {
+ is_set = TRUE;
+ break;
+ }
+ if (is_set != term->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 (tp = &term[1]; tp < term + termcount; tp++)
+ if (tp->Numbers[idx] >= 0) {
+ value = tp->Numbers[idx];
+ break;
+ }
+
+ if (value != term->Numbers[idx])
+ return(value != ABSENT_NUMERIC);
+ else
+ return(FAIL);
+ }
+
+ case STRING: {
+ char *termstr, *usestr = ABSENT_STRING;
+
+ termstr = term->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 (tp = &term[1]; tp < term + termcount; tp++)
+ if (tp->Strings[idx])
+ {
+ usestr = tp->Strings[idx];
+ break;
+ }
+
+ if (usestr == ABSENT_STRING && termstr == ABSENT_STRING)
+ return(FAIL);
+ else if (!usestr || !termstr || capcmp(usestr, termstr))
+ return(TRUE);
+ else
+ return(FAIL);
+ }
+ }
+
+ return(FALSE); /* pacify compiler */
+}
+
+static bool entryeq(TERMTYPE *t1, TERMTYPE *t2)
+/* are two terminal types equal */
+{
+ int 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(t1->Strings[i], t2->Strings[i]))
+ return(FALSE);
+
+ return(TRUE);
+}
+
+#define TIC_EXPAND(result) _nc_tic_expand(result, outform==F_TERMINFO, numbers)
+
+static void compare_predicate(int type, int idx, const char *name)
+/* predicate function to use for entry difference reports */
+{
+ register TERMTYPE *t1 = &term[0];
+ register TERMTYPE *t2 = &term[1];
+ char *s1, *s2;
+
+ switch(type)
+ {
+ case BOOLEAN:
+ switch(compare)
+ {
+ case C_DIFFERENCE:
+ if (t1->Booleans[idx] != t2->Booleans[idx])
+ (void) printf("\t%s: %c:%c.\n",
+ name,
+ t1->Booleans[idx] ? 'T' : 'F',
+ t2->Booleans[idx] ? 'T' : 'F');
+ break;
+
+ case C_COMMON:
+ if (t1->Booleans[idx] && t2->Booleans[idx])
+ (void) printf("\t%s= T.\n", name);
+ break;
+
+ case C_NAND:
+ if (!t1->Booleans[idx] && !t2->Booleans[idx])
+ (void) printf("\t!%s.\n", name);
+ break;
+ }
+ break;
+
+ case NUMBER:
+ switch(compare)
+ {
+ case C_DIFFERENCE:
+ if (t1->Numbers[idx] != t2->Numbers[idx])
+ (void) printf("\t%s: %d:%d.\n",
+ name, t1->Numbers[idx], t2->Numbers[idx]);
+ break;
+
+ case C_COMMON:
+ if (t1->Numbers[idx]!=-1 && t2->Numbers[idx]!=-1
+ && t1->Numbers[idx] == t2->Numbers[idx])
+ (void) printf("\t%s= %d.\n", name, t1->Numbers[idx]);
+ break;
+
+ case C_NAND:
+ if (t1->Numbers[idx]==-1 && t2->Numbers[idx] == -1)
+ (void) printf("\t!%s.\n", name);
+ break;
+ }
+ break;
+
+ case STRING:
+ s1 = t1->Strings[idx];
+ s2 = t2->Strings[idx];
+ switch(compare)
+ {
+ case C_DIFFERENCE:
+ if (capcmp(s1, s2))
+ {
+ char buf1[BUFSIZ], buf2[BUFSIZ];
+
+ if (s1 == (char *)NULL)
+ (void) strcpy(buf1, "NULL");
+ else
+ {
+ (void) strcpy(buf1, "'");
+ (void) strcat(buf1, TIC_EXPAND(s1));
+ (void) strcat(buf1, "'");
+ }
+
+ if (s2 == (char *)NULL)
+ (void) strcpy(buf2, "NULL");
+ else
+ {
+ (void) strcpy(buf2, "'");
+ (void) strcat(buf2, TIC_EXPAND(s2));
+ (void) strcat(buf2, "'");
+ }
+
+ if (strcmp(buf1, buf2))
+ (void) printf("\t%s: %s, %s.\n",
+ name, buf1, buf2);
+ }
+ break;
+
+ case C_COMMON:
+ if (s1 && s2 && !capcmp(s1, s2))
+ (void) printf("\t%s= '%s'.\n", name, TIC_EXPAND(s1));
+ break;
+
+ case C_NAND:
+ if (!s1 && !s2)
+ (void) printf("\t!%s.\n", name);
+ break;
+ }
+ break;
+ }
+
+}
+
+/***************************************************************************
+ *
+ * Init string analysis
+ *
+ ***************************************************************************/
+
+typedef struct {const char *from; const char *to;} assoc;
+
+static const assoc std_caps[] =
+{
+ /* these are specified by X.364 and iBCS2 */
+ {"\033c", "RIS"}, /* full reset */
+ {"\0337", "SC"}, /* save cursor */
+ {"\0338", "RC"}, /* restore cursor */
+ {"\033[r", "RSR"}, /* not an X.364 mnemonic */
+ {"\033[m", "SGR0"}, /* not an X.364 mnemonic */
+ {"\033[2J", "ED2"}, /* clear page */
+
+ /* this group is specified by ISO 2022 */
+ {"\033(0", "ISO DEC G0"}, /* enable DEC graphics for G0 */
+ {"\033(A", "ISO UK G0"}, /* enable UK chars for G0 */
+ {"\033(B", "ISO US G0"}, /* enable US chars for G0 */
+ {"\033)0", "ISO DEC G1"}, /* enable DEC graphics for G1 */
+ {"\033)A", "ISO UK G1"}, /* enable UK chars for G1 */
+ {"\033)B", "ISO US G1"}, /* enable US chars for G1 */
+
+ /* these are DEC private modes widely supported by emulators */
+ {"\033=", "DECPAM"}, /* application keypad mode */
+ {"\033>", "DECPNM"}, /* normal keypad mode */
+ {"\033<", "DECANSI"}, /* enter ANSI mode */
+
+ { (char *)0, (char *)0}
+};
+
+static const assoc private_modes[] =
+/* DEC \E[ ... [hl] modes recognized by many emulators */
+{
+ {"1", "CKM"}, /* application cursor keys */
+ {"2", "ANM"}, /* set VT52 mode */
+ {"3", "COLM"}, /* 132-column mode */
+ {"4", "SCLM"}, /* smooth scroll */
+ {"5", "SCNM"}, /* reverse video mode */
+ {"6", "OM"}, /* origin mode */
+ {"7", "AWM"}, /* wraparound mode */
+ {"8", "ARM"}, /* auto-repeat mode */
+ {(char *)0, (char *)0}
+};
+
+static const assoc ecma_highlights[] =
+/* recognize ECMA attribute sequences */
+{
+ {"0", "NORMAL"}, /* normal */
+ {"1", "+BOLD"}, /* bold on */
+ {"2", "+DIM"}, /* dim on */
+ {"3", "+ITALIC"}, /* italic on */
+ {"4", "+UNDERLINE"}, /* underline on */
+ {"5", "+BLINK"}, /* blink on */
+ {"6", "+FASTBLINK"}, /* fastblink on */
+ {"7", "+REVERSE"}, /* reverse on */
+ {"8", "+INVISIBLE"}, /* invisible on */
+ {"9", "+DELETED"}, /* deleted on */
+ {"10", "MAIN-FONT"}, /* select primary font */
+ {"11", "ALT-FONT-1"}, /* select alternate font 1 */
+ {"12", "ALT-FONT-2"}, /* select alternate font 2 */
+ {"13", "ALT-FONT-3"}, /* select alternate font 3 */
+ {"14", "ALT-FONT-4"}, /* select alternate font 4 */
+ {"15", "ALT-FONT-5"}, /* select alternate font 5 */
+ {"16", "ALT-FONT-6"}, /* select alternate font 6 */
+ {"17", "ALT-FONT-7"}, /* select alternate font 7 */
+ {"18", "ALT-FONT-1"}, /* select alternate font 1 */
+ {"19", "ALT-FONT-1"}, /* select alternate font 1 */
+ {"20", "FRAKTUR"}, /* Fraktur font */
+ {"21", "DOUBLEUNDER"}, /* double underline */
+ {"22", "-DIM"}, /* dim off */
+ {"23", "-ITALIC"}, /* italic off */
+ {"24", "-UNDERLINE"}, /* underline off */
+ {"25", "-BLINK"}, /* blink off */
+ {"26", "-FASTBLINK"}, /* fastblink off */
+ {"27", "-REVERSE"}, /* reverse off */
+ {"28", "-INVISIBLE"}, /* invisible off */
+ {"29", "-DELETED"}, /* deleted off */
+ {(char *)0, (char *)0}
+};
+
+static void analyze_string(const char *name, const char *cap, TERMTYPE *tp)
+{
+ char buf[MAX_TERMINFO_LENGTH];
+ char buf2[MAX_TERMINFO_LENGTH];
+ const char *sp, *ep;
+ const assoc *ap;
+
+ if (cap == ABSENT_STRING || cap == CANCELLED_STRING)
+ return;
+ (void) printf("%s: ", name);
+
+ buf[0] = '\0';
+ for (sp = cap; *sp; sp++)
+ {
+ int i;
+ size_t len = 0;
+ const char *expansion = 0;
+
+ /* first, check other capabilities in this entry */
+ for (i = 0; i < STRCOUNT; i++)
+ {
+ char *cp = tp->Strings[i];
+
+ /* don't use soft-key capabilities */
+ if (strnames[i][0] == 'k' && strnames[i][0] == 'f')
+ continue;
+
+
+ if (cp != ABSENT_STRING && cp != CANCELLED_STRING && cp[0] && cp != cap)
+ {
+ len = strlen(cp);
+ (void) strncpy(buf2, sp, len);
+ buf2[len] = '\0';
+
+ if (_nc_capcmp(cp, buf2))
+ continue;
+
+#define ISRS(s) (!strncmp((s), "is", 2) || !strncmp((s), "rs", 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)
+ for (ap = std_caps; ap->from; ap++)
+ {
+ len = strlen(ap->from);
+
+ if (strncmp(ap->from, sp, len) == 0)
+ {
+ expansion = ap->to;
+ break;
+ }
+ }
+
+ /* now check for private-mode sequences */
+ if (!expansion
+ && sp[0] == '\033' && sp[1] == '[' && sp[2] == '?'
+ && (len = strspn(sp + 3, "0123456789;"))
+ && ((sp[3 + len] == 'h') || (sp[3 + len] == 'l')))
+ {
+ char buf3[MAX_TERMINFO_LENGTH];
+
+ (void) strcpy(buf2, (sp[3 + len] == 'h') ? "DEC+" : "DEC-");
+ (void) strncpy(buf3, sp + 3, len);
+ len += 4;
+ buf3[len] = '\0';
+
+ ep = strtok(buf3, ";");
+ do {
+ bool found = FALSE;
+
+ for (ap = private_modes; ap->from; ap++)
+ {
+ size_t tlen = strlen(ap->from);
+
+ if (strncmp(ap->from, ep, tlen) == 0)
+ {
+ (void) strcat(buf2, ap->to);
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ (void) strcat(buf2, ep);
+ (void) strcat(buf2, ";");
+ } while
+ ((ep = strtok((char *)NULL, ";")));
+ buf2[strlen(buf2) - 1] = '\0';
+ expansion = buf2;
+ }
+
+ /* now check for ECMA highlight sequences */
+ if (!expansion
+ && sp[0] == '\033' && sp[1] == '['
+ && (len = strspn(sp + 2, "0123456789;"))
+ && sp[2 + len] == 'm')
+ {
+ char buf3[MAX_TERMINFO_LENGTH];
+
+ (void) strcpy(buf2, "SGR:");
+ (void) strncpy(buf3, sp + 2, len);
+ len += 3;
+ buf3[len] = '\0';
+
+ ep = strtok(buf3, ";");
+ do {
+ bool found = FALSE;
+
+ for (ap = ecma_highlights; ap->from; ap++)
+ {
+ size_t tlen = strlen(ap->from);
+
+ if (strncmp(ap->from, ep, tlen) == 0)
+ {
+ (void) strcat(buf2, ap->to);
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ (void) strcat(buf2, ep);
+ (void) strcat(buf2, ";");
+ } while
+ ((ep = strtok((char *)NULL, ";")));
+
+ buf2[strlen(buf2) - 1] = '\0';
+ expansion = buf2;
+ }
+ /* now check for scroll region reset */
+ if (!expansion)
+ {
+ (void) sprintf(buf2, "\033[1;%dr", tp->Numbers[2]);
+ len = strlen(buf2);
+ if (strncmp(buf2, sp, len) == 0)
+ expansion = "RSR";
+ }
+
+ /* now check for home-down */
+ if (!expansion)
+ {
+ (void) sprintf(buf2, "\033[%d;1H", tp->Numbers[2]);
+ len = strlen(buf2);
+ if (strncmp(buf2, sp, len) == 0)
+ expansion = "LL";
+ }
+
+ /* now look at the expansion we got, if any */
+ if (expansion)
+ {
+ (void) sprintf(buf + strlen(buf), "{%s}", expansion);
+ sp += len - 1;
+ continue;
+ }
+ else
+ {
+ /* couldn't match anything */
+ buf2[0] = *sp;
+ buf2[1] = '\0';
+ (void) strcat(buf, TIC_EXPAND(buf2));
+ }
+ }
+ (void) printf("%s\n", buf);
+}
+
+/***************************************************************************
+ *
+ * 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 *tails[MAXCOMPARE];
+ ENTRY *qp, *rp;
+ int i, n;
+
+ dump_init((char *)NULL, F_LITERAL, S_TERMINFO, 0, itrace, FALSE);
+
+ for (n = 0; n < argc && n < MAXCOMPARE; n++)
+ {
+ if (freopen(argv[n], "r", stdin) == NULL)
+ _nc_err_abort("Can't open %s", argv[n]);
+
+ _nc_head = _nc_tail = (ENTRY *)NULL;
+
+ /* parse entries out of the source file */
+ _nc_set_source(argv[n]);
+ _nc_read_entry_source(stdin, NULL, TRUE, FALSE, NULLHOOK);
+
+ if (itrace)
+ (void) fprintf(stderr, "Resolving file %d...\n", n-0);
+
+ /* do use resolution */
+ if (!_nc_resolve_uses())
+ {
+ (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);
+ }
+ exit(EXIT_FAILURE);
+ }
+
+ heads[filecount] = _nc_head;
+ tails[filecount] = _nc_tail;
+ 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. We're not using the use[]
+ * slots any more (they got zeroed out by resolve_uses) so
+ * we stash each entry's matches in the other file there.
+ * 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))
+ {
+ /*
+ * This is why the uses structure parent element is
+ * (void *) -- so we can have either (char *) for
+ * names or entry structure pointers in them and still
+ * be type-safe.
+ */
+ if (qp->nuses < MAX_USES)
+ qp->uses[qp->nuses].parent = (void *)rp;
+ qp->nuses++;
+
+ if (rp->nuses < MAX_USES)
+ rp->uses[rp->nuses].parent = (void *)qp;
+ rp->nuses++;
+ }
+ }
+
+ /* 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->nuses > 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->nuses,
+ argv[1]);
+ for (i = 0; i < qp->nuses; i++)
+ (void) fprintf(stderr,
+ "\t%s\n",
+ _nc_first_name(((ENTRY *)qp->uses[i].parent)->tterm.term_names));
+ }
+ for (rp = heads[1]; rp; rp = rp->next)
+ if (rp->nuses > 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->nuses,
+ argv[0]);
+ for (i = 0; i < rp->nuses; i++)
+ (void) fprintf(stderr,
+ "\t%s\n",
+ _nc_first_name(((ENTRY *)rp->uses[i].parent)->tterm.term_names));
+ }
+
+ (void) printf("In file 1 (%s) only:\n", argv[0]);
+ for (qp = heads[0]; qp; qp = qp->next)
+ if (qp->nuses == 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->nuses == 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)
+ {
+ rp = (ENTRY *)qp->uses[0].parent;
+
+ if (qp->nuses == 1 && entryeq(&qp->tterm, &rp->tterm))
+ {
+ char name1[NAMESIZE], name2[NAMESIZE];
+
+ (void) canonical_name(qp->tterm.term_names, name1);
+ (void) 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)
+ {
+ rp = (ENTRY *)qp->uses[0].parent;
+
+#if NCURSES_XNAMES
+ if (termcount > 1)
+ _nc_align_termtype(&qp->tterm, &rp->tterm);
+#endif
+ if (qp->nuses == 1 && !entryeq(&qp->tterm, &rp->tterm))
+ {
+ char name1[NAMESIZE], name2[NAMESIZE];
+
+ term[0] = qp->tterm;
+ term[1] = rp->tterm;
+
+ (void) canonical_name(qp->tterm.term_names, name1);
+ (void) canonical_name(rp->tterm.term_names, name2);
+
+ switch (compare)
+ {
+ case C_DIFFERENCE:
+ if (itrace)
+ (void)fprintf(stderr, "infocmp: dumping differences\n");
+ (void) printf("comparing %s to %s.\n", name1, name2);
+ compare_entry(compare_predicate, term);
+ break;
+
+ case C_COMMON:
+ if (itrace)
+ (void) fprintf(stderr,
+ "infocmp: dumping common capabilities\n");
+ (void) printf("comparing %s to %s.\n", name1, name2);
+ compare_entry(compare_predicate, term);
+ break;
+
+ case C_NAND:
+ if (itrace)
+ (void) fprintf(stderr,
+ "infocmp: dumping differences\n");
+ (void) printf("comparing %s to %s.\n", name1, name2);
+ compare_entry(compare_predicate, term);
+ break;
+
+ }
+ }
+ }
+}
+
+static void usage(void)
+{
+ static const char *tbl[] = {
+ "Usage: infocmp [options] [-A directory] [-B directory] [termname...]"
+ ,""
+ ,"Options:"
+ ," -1 print single-column"
+ ," -C use termcap-names"
+ ," -F compare terminfo-files"
+ ," -I use terminfo-names"
+ ," -L use long names"
+ ," -R subset (see manpage)"
+ ," -T eliminate size limits (test)"
+ ," -V print version"
+ ," -c list common capabilities"
+ ," -d list different capabilities"
+ ," -e format output for C initializer"
+ ," -E format output as C tables"
+ ," -f with -1, format complex strings"
+ ," -G format %{number} to %'char'"
+ ," -g format %'char' to %{number}"
+ ," -i analyze initialization/reset"
+ ," -l output terminfo names"
+ ," -n list capabilities in neither"
+ ," -p ignore padding specifiers"
+ ," -r with -C, output in termcap form"
+ ," -s [d|i|l|c] sort fields"
+ ," -u produce source with 'use='"
+ ," -v number (verbose)"
+ ," -w number (width)"
+ };
+ const size_t first = 3;
+ const size_t last = sizeof(tbl)/sizeof(tbl[0]);
+ const size_t left = (last - first + 1) / 2 + first;
+ size_t n;
+
+ for (n = 0; n < left; n++) {
+ size_t m = (n < first) ? last : n + left - first;
+ if (m < last)
+ fprintf(stderr, "%-40.40s%s\n", tbl[n], tbl[m]);
+ else
+ fprintf(stderr, "%s\n", tbl[n]);
+ }
+ exit(EXIT_FAILURE);
+}
+
+static char * name_initializer(const char *type)
+{
+ static char *initializer;
+ char *s;
+
+ if (initializer == 0)
+ initializer = malloc(strlen(term->term_names) + 20);
+
+ (void) sprintf(initializer, "%s_data_%s", type, term->term_names);
+ for (s = initializer; *s != 0 && *s != '|'; s++)
+ {
+ if (!isalnum(*s))
+ *s = '_';
+ }
+ *s = 0;
+ return initializer;
+}
+
+/* dump C initializers for the terminal type */
+static void dump_initializers(void)
+{
+ int n;
+ const char *str = 0;
+ int size;
+
+ (void) printf("static bool %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/* %3d: %-8s */\t%s,\n",
+ n, ExtBoolname(term,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:
+ sprintf(buf, "%d", term->Numbers[n]);
+ str = buf;
+ break;
+ }
+ (void) printf("\t/* %3d: %-8s */\t%s,\n", n, ExtNumname(term,n,numnames), str);
+ }
+ (void) printf("%s;\n", R_CURL);
+
+ size = sizeof(TERMTYPE)
+ + (NUM_BOOLEANS(term) * sizeof(term->Booleans[0]))
+ + (NUM_NUMBERS(term) * sizeof(term->Numbers[0]));
+
+ (void) printf("static char * %s[] = %s\n", name_initializer("string"), L_CURL);
+
+ for_each_string(n,term)
+ {
+ char buf[BUFSIZ], *sp, *tp;
+
+ if (term->Strings[n] == ABSENT_STRING)
+ str = "ABSENT_STRING";
+ else if (term->Strings[n] == CANCELLED_STRING)
+ str = "CANCELLED_STRING";
+ else
+ {
+ tp = buf;
+ *tp++ = '"';
+ for (sp = term->Strings[n]; *sp; sp++)
+ {
+ if (isascii(*sp) && isprint(*sp) && *sp !='\\' && *sp != '"')
+ *tp++ = *sp;
+ else
+ {
+ (void) sprintf(tp, "\\%03o", *sp & 0xff);
+ tp += 4;
+ }
+ }
+ *tp++ = '"';
+ *tp = '\0';
+ size += (strlen(term->Strings[n]) + 1);
+ str = buf;
+ }
+#if NCURSES_XNAMES
+ if (n == STRCOUNT)
+ {
+ (void) printf("%s;\n", R_CURL);
+
+ (void) printf("static char * %s[] = %s\n", name_initializer("string_ext"), L_CURL);
+ }
+#endif
+ (void) printf("\t/* %3d: %-8s */\t%s,\n", n, ExtStrname(term,n,strnames), str);
+ }
+ (void) printf("%s;\n", R_CURL);
+}
+
+/* dump C initializers for the terminal type */
+static void dump_termtype(void)
+{
+ (void) printf("\t%s\n\t\t\"%s\",\n", L_CURL, term->term_names);
+ (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_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");
+#endif /* NCURSES_XNAMES */
+ (void) printf("\t%s\n", R_CURL);
+}
+
+/***************************************************************************
+ *
+ * Main sequence
+ *
+ ***************************************************************************/
+
+int main(int argc, char *argv[])
+{
+ char *terminal, *firstdir, *restdir;
+ /* Avoid "local data >32k" error with mwcc */
+ /* Also avoid overflowing smaller stacks on systems like AmigaOS */
+ path *tfile = malloc(sizeof(path)*MAXTERMS);
+ int c, i, len;
+ bool formatted = FALSE;
+ bool filecompare = FALSE;
+ int initdump = 0;
+ bool init_analyze = FALSE;
+ bool limited = TRUE;
+
+ if ((terminal = getenv("TERM")) == NULL)
+ {
+ (void) fprintf(stderr,
+ "infocmp: environment variable TERM not set\n");
+ return EXIT_FAILURE;
+ }
+
+ /* where is the terminfo database location going to default to? */
+ restdir = firstdir = 0;
+
+ while ((c = getopt(argc, argv, "deEcCfFGgIinlLprR:s:uv:Vw:A:B:1T")) != EOF)
+ switch (c)
+ {
+ case 'd':
+ compare = C_DIFFERENCE;
+ break;
+
+ case 'e':
+ initdump |= 1;
+ break;
+
+ case 'E':
+ initdump |= 2;
+ break;
+
+ case 'c':
+ compare = C_COMMON;
+ break;
+
+ case 'C':
+ outform = F_TERMCAP;
+ tversion = "BSD";
+ if (sortmode == S_DEFAULT)
+ sortmode = S_TERMCAP;
+ break;
+
+ case 'f':
+ formatted = TRUE;
+ break;
+
+ case 'G':
+ numbers = 1;
+ break;
+
+ case 'g':
+ numbers = -1;
+ break;
+
+ case 'F':
+ filecompare = TRUE;
+ 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_TERMINFO;
+ break;
+
+ case 'L':
+ outform = F_VARIABLE;
+ if (sortmode == S_DEFAULT)
+ sortmode = S_VARIABLE;
+ break;
+
+ case 'n':
+ compare = C_NAND;
+ break;
+
+ case 'p':
+ ignorepads = TRUE;
+ break;
+
+ case 'r':
+ tversion = 0;
+ limited = FALSE;
+ break;
+
+ case 'R':
+ tversion = optarg;
+ 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,
+ "infocmp: unknown sort mode\n");
+ return EXIT_FAILURE;
+ }
+ break;
+
+ case 'u':
+ compare = C_USEALL;
+ break;
+
+ case 'v':
+ itrace = atoi(optarg);
+ _nc_tracing = (1 << itrace) - 1;
+ break;
+
+ case 'V':
+ (void) fputs(NCURSES_VERSION, stdout);
+ putchar('\n');
+ ExitProgram(EXIT_SUCCESS);
+
+ case 'w':
+ mwidth = atoi(optarg);
+ break;
+
+ case 'A':
+ firstdir = optarg;
+ break;
+
+ case 'B':
+ restdir = optarg;
+ break;
+
+ case '1':
+ mwidth = 0;
+ break;
+
+ case 'T':
+ limited = FALSE;
+ break;
+ default:
+ usage();
+ }
+
+ /* by default, sort by terminfo name */
+ if (sortmode == S_DEFAULT)
+ sortmode = S_TERMINFO;
+
+ /* set up for display */
+ dump_init(tversion, outform, sortmode, mwidth, itrace, formatted);
+
+ /* make sure we have at least one terminal name to work with */
+ if (optind >= argc)
+ argv[argc++] = terminal;
+
+ /* if user is after a comparison, make sure we have two entries */
+ if (compare != C_DEFAULT && optind >= argc - 1)
+ argv[argc++] = terminal;
+
+ /* exactly two terminal names with no options means do -d */
+ if (argc - optind == 2 && compare == C_DEFAULT)
+ compare = C_DIFFERENCE;
+
+ if (!filecompare)
+ {
+ /* grab the entries */
+ termcount = 0;
+ for (; optind < argc; optind++)
+ {
+ if (termcount >= MAXTERMS)
+ {
+ (void) fprintf(stderr,
+ "infocmp: too many terminal type arguments\n");
+ return EXIT_FAILURE;
+ }
+ else
+ {
+ const char *directory = termcount ? restdir : firstdir;
+ int status;
+
+ tname[termcount] = argv[optind];
+
+ if (directory)
+ {
+ (void) sprintf(tfile[termcount], "%s/%c/%s",
+ directory,
+ *argv[optind], argv[optind]);
+ if (itrace)
+ (void) fprintf(stderr,
+ "infocmp: reading entry %s from file %s\n",
+ argv[optind], tfile[termcount]);
+
+ status = _nc_read_file_entry(tfile[termcount],
+ &term[termcount]);
+ }
+ else
+ {
+ if (itrace)
+ (void) fprintf(stderr,
+ "infocmp: reading entry %s from system directories %s\n",
+ argv[optind], tname[termcount]);
+
+ status = _nc_read_entry(tname[termcount],
+ tfile[termcount],
+ &term[termcount]);
+ directory = TERMINFO; /* for error message */
+ }
+
+ if (status <= 0)
+ {
+ (void) fprintf(stderr,
+ "infocmp: couldn't open terminfo file %s.\n",
+ tfile[termcount]);
+ return EXIT_FAILURE;
+ }
+ termcount++;
+ }
+ }
+
+#if NCURSES_XNAMES
+ if (termcount > 1)
+ _nc_align_termtype(&term[0], &term[1]);
+#endif
+
+ /* dump as C initializer for the terminal type */
+ if (initdump)
+ {
+ if (initdump & 1)
+ dump_termtype();
+ if (initdump & 2)
+ dump_initializers();
+ ExitProgram(EXIT_SUCCESS);
+ }
+
+ /* analyze the init strings */
+ if (init_analyze)
+ {
+#undef CUR
+#define CUR term[0].
+ analyze_string("is1", init_1string, &term[0]);
+ analyze_string("is2", init_2string, &term[0]);
+ analyze_string("is3", init_3string, &term[0]);
+ analyze_string("rs1", reset_1string, &term[0]);
+ analyze_string("rs2", reset_2string, &term[0]);
+ analyze_string("rs3", reset_3string, &term[0]);
+ analyze_string("smcup", enter_ca_mode, &term[0]);
+ analyze_string("rmcup", exit_ca_mode, &term[0]);
+#undef CUR
+ ExitProgram(EXIT_SUCCESS);
+ }
+
+ /*
+ * Here's where the real work gets done
+ */
+ switch (compare)
+ {
+ case C_DEFAULT:
+ if (itrace)
+ (void) fprintf(stderr,
+ "infocmp: about to dump %s\n",
+ tname[0]);
+ (void) printf("#\tReconstructed via infocmp from file: %s\n",
+ tfile[0]);
+ len = dump_entry(&term[0], limited, numbers, NULL);
+ putchar('\n');
+ if (itrace)
+ (void)fprintf(stderr, "infocmp: length %d\n", len);
+ break;
+
+ case C_DIFFERENCE:
+ if (itrace)
+ (void)fprintf(stderr, "infocmp: dumping differences\n");
+ (void) printf("comparing %s to %s.\n", tname[0], tname[1]);
+ compare_entry(compare_predicate, term);
+ break;
+
+ case C_COMMON:
+ if (itrace)
+ (void) fprintf(stderr,
+ "infocmp: dumping common capabilities\n");
+ (void) printf("comparing %s to %s.\n", tname[0], tname[1]);
+ compare_entry(compare_predicate, term);
+ break;
+
+ case C_NAND:
+ if (itrace)
+ (void) fprintf(stderr,
+ "infocmp: dumping differences\n");
+ (void) printf("comparing %s to %s.\n", tname[0], tname[1]);
+ compare_entry(compare_predicate, term);
+ break;
+
+ case C_USEALL:
+ if (itrace)
+ (void) fprintf(stderr, "infocmp: dumping use entry\n");
+ len = dump_entry(&term[0], limited, numbers, use_predicate);
+ for (i = 1; i < termcount; i++)
+ len += dump_uses(tname[i], !(outform==F_TERMCAP || outform==F_TCONVERR));
+ putchar('\n');
+ if (itrace)
+ (void)fprintf(stderr, "infocmp: length %d\n", 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);
+
+ ExitProgram(EXIT_SUCCESS);
+}
+
+/* infocmp.c ends here */
diff --git a/contrib/ncurses/progs/modules b/contrib/ncurses/progs/modules
new file mode 100644
index 000000000000..54cd2020269e
--- /dev/null
+++ b/contrib/ncurses/progs/modules
@@ -0,0 +1,40 @@
+# Program modules (some are in ncurses lib!)
+##############################################################################
+# Copyright (c) 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> 1995,1997
+#
+
+@ base
+clear progs $(srcdir) ../include/term.h
+tic progs $(srcdir) ../include/term.h $(INCDIR)/tic.h $(srcdir)/dump_entry.h
+toe progs $(srcdir) ../include/term.h $(INCDIR)/tic.h $(srcdir)/dump_entry.h
+dump_entry progs $(srcdir) ../include/term.h $(INCDIR)/tic.h $(srcdir)/dump_entry.h ../include/parametrized.h termsort.c
+infocmp progs $(srcdir) ../include/term.h $(INCDIR)/tic.h $(srcdir)/dump_entry.h
+tput progs $(srcdir) ../include/term.h
+tset progs $(srcdir) ../include/term.h
diff --git a/contrib/ncurses/progs/progs.priv.h b/contrib/ncurses/progs/progs.priv.h
new file mode 100644
index 000000000000..3384d37c4e6d
--- /dev/null
+++ b/contrib/ncurses/progs/progs.priv.h
@@ -0,0 +1,160 @@
+/****************************************************************************
+ * Copyright (c) 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> 1997,1998 *
+ ****************************************************************************/
+/*
+ * $Id: progs.priv.h,v 1.19 1999/02/23 11:10:32 tom Exp $
+ *
+ * progs.priv.h
+ *
+ * Header file for curses utility programs
+ */
+
+#include <ncurses_cfg.h>
+
+#ifdef 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>
+#else
+# if HAVE_LIBC_H
+# include <libc.h>
+# endif
+#endif
+
+#if HAVE_SYS_BSDTYPES_H
+#include <sys/bsdtypes.h> /* needed for ISC */
+#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)
+#else
+# define dirent 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
+
+#include <errno.h>
+
+#if DECL_ERRNO
+extern int errno;
+#endif
+
+#if HAVE_GETOPT_H
+#include <getopt.h>
+#else
+/* 'getopt()' may be prototyped in <stdlib.h>, but declaring its
+ * variables doesn't hurt.
+ */
+extern char *optarg;
+extern int optind;
+#endif /* HAVE_GETOPT_H */
+
+#include <curses.h>
+#include <term_entry.h>
+#include <tic.h>
+#include <nc_alloc.h>
+
+/* usually in <unistd.h> */
+#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 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.
+ */
+#ifndef HAVE_ISASCII
+# undef isascii
+# if ('z'-'a' == 25) && ('z' < 127) && ('Z'-'A' == 25) && ('Z' < 127) && ('9' < 127)
+# define isascii(c) (((c) & 0xff) <= 127)
+# else
+# define isascii(c) 1 /* not really ascii anyway */
+# endif
+#endif
diff --git a/contrib/ncurses/progs/tic.c b/contrib/ncurses/progs/tic.c
new file mode 100644
index 000000000000..d81af0a3cdc6
--- /dev/null
+++ b/contrib/ncurses/progs/tic.c
@@ -0,0 +1,812 @@
+/****************************************************************************
+ * Copyright (c) 1998,1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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> *
+ ****************************************************************************/
+
+/*
+ * tic.c --- Main program for terminfo compiler
+ * by Eric S. Raymond
+ *
+ */
+
+#include <progs.priv.h>
+
+#include <dump_entry.h>
+#include <term_entry.h>
+
+MODULE_ID("$Id: tic.c,v 1.51 1999/06/19 21:35:36 Philippe.De.Muyter Exp $")
+
+const char *_nc_progname = "tic";
+
+static FILE *log_fp;
+static FILE *tmp_fp;
+static bool showsummary = FALSE;
+static const char *to_remove;
+
+static void (*save_check_termtype)(TERMTYPE *);
+static void check_termtype(TERMTYPE *tt);
+
+static const char usage_string[] = "[-h] [-v[n]] [-e names] [-CILNRTcfrswx1] source-file\n";
+
+static void cleanup(void)
+{
+ if (tmp_fp != 0)
+ fclose(tmp_fp);
+ if (to_remove != 0) {
+#if HAVE_REMOVE
+ remove(to_remove);
+#else
+ unlink(to_remove);
+#endif
+ }
+}
+
+static void failed(const char *msg)
+{
+ perror(msg);
+ cleanup();
+ exit(EXIT_FAILURE);
+}
+
+static void usage(void)
+{
+ static const char *const tbl[] = {
+ "Options:",
+ " -1 format translation output one capability per line",
+ " -C translate entries to termcap source form",
+ " -I translate entries to terminfo source form",
+ " -L translate entries to full terminfo source form",
+ " -N disable smart defaults for source translation",
+ " -R restrict translation to given terminfo/termcap version",
+ " -T remove size-restrictions on compiled description",
+ " -c check only, validate input without compiling or translating",
+ " -f format complex strings for readability",
+ " -G format %{number} to %'char'",
+ " -g format %'char' to %{number}",
+ " -e<names> translate/compile only entries named by comma-separated list",
+ " -o<dir> set output directory for compiled entry writes",
+ " -r force resolution of all use entries in source translation",
+ " -s print summary statistics",
+ " -v[n] set verbosity level",
+ " -w[n] set format width for translation output",
+#if NCURSES_XNAMES
+ " -x treat unknown capabilities as user-defined",
+#endif
+ "",
+ "Parameters:",
+ " <file> file to translate or compile"
+ };
+ size_t j;
+
+ printf("Usage: %s %s\n", _nc_progname, usage_string);
+ for (j = 0; j < sizeof(tbl)/sizeof(tbl[0]); j++)
+ puts(tbl[j]);
+ exit(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++ = ch;
+ if (ch == '\\') {
+ *d++ = *t++;
+ } 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++ = (int)value;
+ *d++ = S_QUOTE;
+ t = (v + 1);
+ }
+ }
+ }
+ *d = 0;
+ if (strlen(result) < strlen(s))
+ strcpy(s, result);
+ }
+ }
+
+ _nc_set_type(_nc_first_name(ep->tterm.term_names));
+ _nc_curr_line = 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 */
+{
+#ifndef 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 char namebuf[132], suffix[132], *sp;
+
+ if (!in_name)
+ {
+ if (c == '<')
+ {
+ in_name = TRUE;
+ sp = namebuf;
+ }
+ else
+ putchar(c);
+ }
+ else if (c == '\n' || c == '@')
+ {
+ *sp++ = '\0';
+ (void) putchar('<');
+ (void) fputs(namebuf, stdout);
+ putchar(c);
+ in_name = FALSE;
+ }
+ else if (c != '>')
+ *sp++ = c;
+ else /* ah! candidate name! */
+ {
+ char *up;
+ NCURSES_CONST char *tp;
+
+ *sp++ = '\0';
+ in_name = FALSE;
+
+ suffix[0] = '\0';
+ if ((up = strchr(namebuf, '#')) != 0
+ || (up = strchr(namebuf, '=')) != 0
+ || ((up = strchr(namebuf, '@')) != 0 && up[1] == '>'))
+ {
+ (void) strcpy(suffix, up);
+ *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('>');
+ }
+
+ }
+}
+
+/* Returns a string, stripped of leading/trailing whitespace */
+static char *stripped(char *src)
+{
+ while (isspace(*src))
+ src++;
+ if (*src != '\0') {
+ char *dst = strcpy(malloc(strlen(src)+1), src);
+ size_t len = strlen(dst);
+ while (--len != 0 && isspace(dst[len]))
+ dst[len] = '\0';
+ return dst;
+ }
+ return 0;
+}
+
+/* Parse the "-e" option-value into a list of names */
+static const char **make_namelist(char *src)
+{
+ const char **dst = 0;
+
+ char *s, *base;
+ unsigned pass, n, nn;
+ char buffer[BUFSIZ];
+
+ if (src == 0) {
+ /* EMPTY */;
+ } else if (strchr(src, '/') != 0) { /* a filename */
+ FILE *fp = fopen(src, "r");
+ if (fp == 0)
+ failed(src);
+
+ 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;
+ nn++;
+ }
+ }
+ if (pass == 1) {
+ dst = (const char **)calloc(nn+1, sizeof(*dst));
+ 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)
+ dst = (const char **)calloc(nn+1, sizeof(*dst));
+ }
+ }
+ if (showsummary) {
+ fprintf(log_fp, "Entries that will be compiled:\n");
+ for (n = 0; dst[n] != 0; n++)
+ fprintf(log_fp, "%d:%s\n", n+1, dst[n]);
+ }
+ return dst;
+}
+
+static bool matches(const char **needle, const char *haystack)
+/* does entry in needle list match |-separated field in haystack? */
+{
+ bool code = FALSE;
+ size_t n;
+
+ if (needle != 0)
+ {
+ for (n = 0; needle[n] != 0; n++)
+ {
+ if (_nc_name_match(haystack, needle[n], "|"))
+ {
+ code = TRUE;
+ break;
+ }
+ }
+ }
+ else
+ code = TRUE;
+ return(code);
+}
+
+int main (int argc, char *argv[])
+{
+char my_tmpname[PATH_MAX];
+int v_opt = -1, debug_level;
+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;
+bool formatted = FALSE; /* reformat complex strings? */
+int numbers = 0; /* format "%'char'" to/from "%{number}" */
+bool infodump = FALSE; /* running as captoinfo? */
+bool capdump = FALSE; /* running as infotocap? */
+bool forceresolve = FALSE; /* force resolution */
+bool limited = TRUE;
+char *tversion = (char *)NULL;
+const char *source_file = "terminfo";
+const char **namelst = 0;
+char *outdir = (char *)NULL;
+bool check_only = FALSE;
+
+ log_fp = stderr;
+
+ if ((_nc_progname = strrchr(argv[0], '/')) == NULL)
+ _nc_progname = argv[0];
+ else
+ _nc_progname++;
+
+ infodump = (strcmp(_nc_progname, "captoinfo") == 0);
+ capdump = (strcmp(_nc_progname, "infotocap") == 0);
+#if NCURSES_XNAMES
+ use_extended_names(FALSE);
+#endif
+
+ /*
+ * 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, "0123456789CILNR:TVce:fGgo:rsvwx")) != EOF) {
+ if (isdigit(this_opt)) {
+ switch (last_opt) {
+ case 'v':
+ v_opt = (v_opt * 10) + (this_opt - '0');
+ break;
+ case 'w':
+ width = (width * 10) + (this_opt - '0');
+ break;
+ default:
+ if (this_opt != '1')
+ usage();
+ last_opt = this_opt;
+ width = 0;
+ }
+ continue;
+ }
+ switch (this_opt) {
+ case 'C':
+ capdump = TRUE;
+ outform = F_TERMCAP;
+ sortmode = S_TERMCAP;
+ 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;
+ break;
+ case 'R':
+ tversion = optarg;
+ break;
+ case 'T':
+ limited = FALSE;
+ break;
+ case 'V':
+ puts(NCURSES_VERSION);
+ return EXIT_SUCCESS;
+ 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 'r':
+ forceresolve = TRUE;
+ break;
+ case 's':
+ showsummary = TRUE;
+ break;
+ case 'v':
+ v_opt = 0;
+ break;
+ case 'w':
+ width = 0;
+ break;
+#if NCURSES_XNAMES
+ case 'x':
+ use_extended_names(TRUE);
+ break;
+#endif
+ default:
+ usage();
+ }
+ last_opt = this_opt;
+ }
+
+ debug_level = (v_opt > 0) ? v_opt : (v_opt == 0);
+ _nc_tracing = (1 << debug_level) - 1;
+
+ if (_nc_tracing)
+ {
+ save_check_termtype = _nc_check_termtype;
+ _nc_check_termtype = check_termtype;
+ }
+
+#ifndef 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's 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,
+ "Sorry, -e can't be used without -I or -C\n");
+ cleanup();
+ return 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);
+ return 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 ((source_file = tmpnam(my_tmpname)) != 0
+ && (tmp_fp = fopen(source_file, "w")) != 0) {
+ fprintf(tmp_fp, "%s\n", termcap);
+ fclose(tmp_fp);
+ tmp_fp = fopen(source_file, "r");
+ 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);
+ cleanup();
+ return EXIT_FAILURE;
+ }
+ }
+
+ if (tmp_fp == 0
+ && (tmp_fp = fopen(source_file, "r")) == 0) {
+ fprintf (stderr, "%s: Can't open %s\n", _nc_progname, source_file);
+ return EXIT_FAILURE;
+ }
+
+ if (infodump)
+ dump_init(tversion,
+ smart_defaults
+ ? outform
+ : F_LITERAL,
+ sortmode, width, debug_level, formatted);
+ else if (capdump)
+ dump_init(tversion,
+ outform,
+ sortmode, width, debug_level, FALSE);
+
+ /* parse entries out of the source file */
+ _nc_set_source(source_file);
+#ifndef 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, FALSE,
+ (check_only || infodump || capdump) ? NULLHOOK : immedhook);
+
+ /* do use resolution */
+ if (check_only || (!infodump && !capdump) || forceresolve) {
+ if (!_nc_resolve_uses() && !check_only) {
+ cleanup();
+ return EXIT_FAILURE;
+ }
+ }
+
+ /* length check */
+ if (check_only && (capdump || infodump))
+ {
+ for_entry_list(qp)
+ {
+ if (matches(namelst, qp->tterm.term_names))
+ {
+ int len = fmt_entry(&qp->tterm, NULL, TRUE, infodump, numbers);
+
+ if (len>(infodump?MAX_TERMINFO_LENGTH:MAX_TERMCAP_LENGTH))
+ (void) fprintf(stderr,
+ "warning: resolved %s entry is %d bytes long\n",
+ _nc_first_name(qp->tterm.term_names),
+ len);
+ }
+ }
+ }
+
+ /* write or dump all entries */
+ if (!check_only)
+ {
+ 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))
+ {
+ int 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));
+
+ (void) fseek(tmp_fp, qp->cstart, SEEK_SET);
+ while (j-- )
+ if (infodump)
+ (void) putchar(fgetc(tmp_fp));
+ else
+ put_translate(fgetc(tmp_fp));
+
+ len = dump_entry(&qp->tterm, limited, numbers, NULL);
+ for (j = 0; j < qp->nuses; j++)
+ len += dump_uses((char *)(qp->uses[j].parent), infodump);
+ (void) putchar('\n');
+ if (debug_level != 0 && !limited)
+ printf("# length=%d\n", len);
+ }
+ if (!namelst)
+ {
+ 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((char *)0));
+ else
+ fprintf(log_fp, "No entries written\n");
+ }
+ cleanup();
+ return(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).
+ */
+
+TERMINAL *cur_term; /* tweak to avoid linking lib_cur_term.c */
+
+#undef CUR
+#define CUR tp->
+
+/* other sanity-checks (things that we don't want in the normal
+ * logic that reads a terminfo entry)
+ */
+static void check_termtype(TERMTYPE *tp)
+{
+ bool conflict = FALSE;
+ unsigned j, k;
+ char fkeys[STRCOUNT];
+
+ /*
+ * 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).
+ */
+ memset(fkeys, 0, sizeof(fkeys));
+ for (j = 0; _nc_tinfo_fkeys[j].code; j++) {
+ char *a = tp->Strings[_nc_tinfo_fkeys[j].offset];
+ bool first = TRUE;
+ if (!VALID_STRING(a))
+ continue;
+ for (k = j+1; _nc_tinfo_fkeys[k].code; k++) {
+ char *b = tp->Strings[_nc_tinfo_fkeys[k].offset];
+ if (!VALID_STRING(b)
+ || fkeys[k])
+ continue;
+ if (!strcmp(a,b)) {
+ fkeys[j] = 1;
+ fkeys[k] = 1;
+ if (first) {
+ if (!conflict) {
+ _nc_warning("Conflicting key definitions (using the last)");
+ conflict = TRUE;
+ }
+ fprintf(stderr, "... %s is the same as %s",
+ keyname(_nc_tinfo_fkeys[j].code),
+ keyname(_nc_tinfo_fkeys[k].code));
+ first = FALSE;
+ } else {
+ fprintf(stderr, ", %s",
+ keyname(_nc_tinfo_fkeys[k].code));
+ }
+ }
+ }
+ if (!first)
+ fprintf(stderr, "\n");
+ }
+
+ /*
+ * Quick check for color. We could also check if the ANSI versus
+ * non-ANSI strings are misused.
+ */
+ if ((max_colors > 0) != (max_pairs > 0)
+ || (max_colors > max_pairs))
+ _nc_warning("inconsistent values for max_colors and max_pairs");
+
+ PAIRED(set_foreground, set_background)
+ PAIRED(set_a_foreground, set_a_background)
+
+ /*
+ * 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)
+
+ /*
+ * 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)
+
+ /*
+ * Some standard applications (e.g., vi) and some non-curses
+ * applications (e.g., jove) get confused if we have both ich/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) || PRESENT(parm_ich))) {
+ _nc_warning("non-curses applications may be confused by ich/ich1 with smir/rmir");
+ }
+
+ /*
+ * Finally, do the non-verbose checks
+ */
+ if (save_check_termtype != 0)
+ save_check_termtype(tp);
+}
diff --git a/contrib/ncurses/progs/toe.c b/contrib/ncurses/progs/toe.c
new file mode 100644
index 000000000000..f2c5c5ec832d
--- /dev/null
+++ b/contrib/ncurses/progs/toe.c
@@ -0,0 +1,303 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+/*
+ * toe.c --- table of entries report generator
+ *
+ */
+
+#include <progs.priv.h>
+
+#include <sys/stat.h>
+
+#include <dump_entry.h>
+#include <term_entry.h>
+
+MODULE_ID("$Id: toe.c,v 0.19 1998/03/08 01:02:46 tom Exp $")
+
+const char *_nc_progname;
+
+static int typelist(int eargc, char *eargv[], bool,
+ void (*)(const char *, TERMTYPE *));
+static void deschook(const char *, TERMTYPE *);
+
+#if NO_LEAKS
+#undef ExitProgram
+static void ExitProgram(int code) GCC_NORETURN;
+static void ExitProgram(int code)
+{
+ _nc_free_entries(_nc_head);
+ _nc_leaks_dump_entry();
+ _nc_free_and_exit(code);
+}
+#endif
+
+int main (int argc, char *argv[])
+{
+ bool direct_dependencies = FALSE;
+ bool invert_dependencies = FALSE;
+ bool header = FALSE;
+ int i, c, debug_level = 0;
+ int code;
+
+ if ((_nc_progname = strrchr(argv[0], '/')) == NULL)
+ _nc_progname = argv[0];
+ else
+ _nc_progname++;
+
+ while ((c = getopt(argc, argv, "huv:UV")) != EOF)
+ switch (c)
+ {
+ case 'h':
+ header = TRUE;
+ break;
+ case 'u':
+ direct_dependencies = TRUE;
+ break;
+ case 'v':
+ debug_level = atoi(optarg);
+ _nc_tracing = (1 << debug_level) - 1;
+ break;
+ case 'U':
+ invert_dependencies = TRUE;
+ break;
+ case 'V':
+ (void) fputs(NCURSES_VERSION, stdout);
+ putchar('\n');
+ ExitProgram(EXIT_SUCCESS);
+ default:
+ (void) fprintf (stderr, "usage: toe [-huUV] [-v n] [file...]\n");
+ ExitProgram(EXIT_FAILURE);
+ }
+
+ if (direct_dependencies || invert_dependencies)
+ {
+ if (freopen(argv[optind], "r", stdin) == NULL)
+ {
+ (void) fflush(stdout);
+ fprintf(stderr, "%s: can't open %s\n", _nc_progname, argv[optind]);
+ ExitProgram(EXIT_FAILURE);
+ }
+
+ /* parse entries out of the source file */
+ _nc_set_source(argv[optind]);
+ _nc_read_entry_source(stdin, (char *)NULL,
+ FALSE, FALSE,
+ NULLHOOK);
+ }
+
+ /* maybe we want a direct-dependency listing? */
+ if (direct_dependencies)
+ {
+ ENTRY *qp;
+
+ for_entry_list(qp)
+ if (qp->nuses)
+ {
+ int j;
+
+ (void) printf("%s:", _nc_first_name(qp->tterm.term_names));
+ for (j = 0; j < qp->nuses; j++)
+ (void) printf(" %s", (char *)(qp->uses[j].parent));
+ putchar('\n');
+ }
+
+ ExitProgram(EXIT_SUCCESS);
+ }
+
+ /* maybe we want a reverse-dependency listing? */
+ if (invert_dependencies)
+ {
+ ENTRY *qp, *rp;
+ int matchcount;
+
+ for_entry_list(qp)
+ {
+ matchcount = 0;
+ for_entry_list(rp)
+ {
+ if (rp->nuses == 0)
+ continue;
+
+ for (i = 0; i < rp->nuses; i++)
+ if (_nc_name_match(qp->tterm.term_names,(char*)rp->uses[i].parent, "|"))
+ {
+ 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, deschook);
+ } else {
+ char *by_env, *home, *eargv[3];
+ int j;
+
+ j = 0;
+ if ((by_env = getenv("TERMINFO")) != (char *)NULL)
+ eargv[j++] = by_env;
+ else
+ {
+ if ((home = getenv("HOME")) != (char *)NULL)
+ {
+ char personal[PATH_MAX];
+ struct stat sb;
+
+ (void) sprintf(personal, PRIVATE_INFO, home);
+ if (stat(personal, &sb) == 0
+ && (sb.st_mode & S_IFMT) == S_IFDIR)
+ eargv[j++] = personal;
+ }
+ eargv[j++] = TERMINFO;
+ }
+ eargv[j] = (char *)NULL;
+
+ code = typelist(j, eargv, header, deschook);
+ }
+
+ ExitProgram(code);
+}
+
+static void deschook(const char *cn, TERMTYPE *tp)
+/* display a description for the type */
+{
+ const char *desc;
+
+ if ((desc = strrchr(tp->term_names, '|')) == (char *)NULL)
+ desc = "(No description)";
+ else
+ ++desc;
+
+ (void) printf("%-10s\t%s\n", cn, desc);
+}
+
+static int typelist(int eargc, char *eargv[],
+ bool verbosity,
+ void (*hook)(const char *, TERMTYPE *tp))
+/* apply a function to each entry in given terminfo directories */
+{
+ int i;
+
+ for (i = 0; i < eargc; i++)
+ {
+ DIR *termdir;
+ struct dirent *subdir;
+
+ if ((termdir = opendir(eargv[i])) == (DIR *)NULL)
+ {
+ (void) fflush(stdout);
+ (void) fprintf(stderr,
+ "%s: can't open terminfo directory %s\n",
+ _nc_progname, eargv[i]);
+ return(EXIT_FAILURE);
+ }
+ else if (verbosity)
+ (void) printf("#\n#%s:\n#\n", eargv[i]);
+
+ while ((subdir = readdir(termdir)) != NULL)
+ {
+ size_t len = NAMLEN(subdir);
+ char buf[PATH_MAX];
+ char name_1[PATH_MAX];
+ DIR *entrydir;
+ struct dirent *entry;
+
+ strncpy(name_1, subdir->d_name, len)[len] = '\0';
+ if (!strcmp(name_1, ".")
+ || !strcmp(name_1, ".."))
+ continue;
+
+ (void) strcpy(buf, eargv[i]);
+ (void) strcat(buf, "/");
+ (void) strcat(buf, name_1);
+ (void) strcat(buf, "/");
+ chdir(buf);
+ entrydir = opendir(".");
+ while ((entry = readdir(entrydir)) != NULL)
+ {
+ char name_2[PATH_MAX];
+ TERMTYPE lterm;
+ char *cn;
+ int status;
+
+ len = NAMLEN(entry);
+ strncpy(name_2, entry->d_name, len)[len] = '\0';
+ if (!strcmp(name_2, ".")
+ || !strcmp(name_2, ".."))
+ continue;
+
+ status = _nc_read_file_entry(name_2, &lterm);
+ if (status <= 0)
+ {
+ (void) fflush(stdout);
+ (void) fprintf(stderr,
+ "toe: couldn't open terminfo file %s.\n",
+ name_2);
+ return(EXIT_FAILURE);
+ }
+
+ /* 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)(cn, &lterm);
+ }
+ if (lterm.term_names) {
+ free(lterm.term_names);
+ lterm.term_names = NULL;
+ }
+ if (lterm.str_table) {
+ free(lterm.str_table);
+ lterm.str_table = NULL;
+ }
+ }
+ closedir(entrydir);
+ }
+ closedir(termdir);
+ }
+
+ return(EXIT_SUCCESS);
+}
diff --git a/contrib/ncurses/progs/tput.c b/contrib/ncurses/progs/tput.c
new file mode 100644
index 000000000000..7a859f164111
--- /dev/null
+++ b/contrib/ncurses/progs/tput.c
@@ -0,0 +1,312 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * 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 <progs.priv.h>
+#ifndef PURE_TERMINFO
+#include <termsort.c>
+#endif
+
+MODULE_ID("$Id: tput.c,v 1.14 1999/07/31 21:18:29 Goran.Uddeborg Exp $")
+
+#define PUTS(s) fputs(s, stdout)
+#define PUTCHAR(c) putchar(c)
+#define FLUSH fflush(stdout)
+
+static char *prg_name;
+
+static void quit(int status, const char *fmt, ...)
+{
+va_list argp;
+
+ va_start(argp,fmt);
+ vfprintf (stderr, fmt, argp);
+ fprintf(stderr, "\n");
+ va_end(argp);
+ exit(status);
+}
+
+static void usage(void)
+{
+ fprintf(stderr, "usage: %s [-S] [-T term] capname\n", prg_name);
+ exit(EXIT_FAILURE);
+}
+
+static int tput(int argc, char *argv[])
+{
+char *name;
+char *s;
+int i, j, c;
+int reset, status;
+FILE *f;
+
+ reset = 0;
+ name = argv[0];
+ if (strcmp(name, "reset") == 0) {
+ reset = 1;
+ }
+ if (reset || strcmp(name, "init") == 0) {
+ if (init_prog != NULL) {
+ system(init_prog);
+ }
+ FLUSH;
+
+ if (reset && reset_1string != NULL) {
+ PUTS(reset_1string);
+ } else if (init_1string != NULL) {
+ PUTS(init_1string);
+ }
+ FLUSH;
+
+ if (reset && reset_2string != NULL) {
+ PUTS(reset_2string);
+ } else if (init_2string != NULL) {
+ PUTS(init_2string);
+ }
+ FLUSH;
+
+ if (set_lr_margin != NULL) {
+ PUTS(tparm(set_lr_margin, 0, columns - 1));
+ } else if (set_left_margin_parm != NULL
+ && set_right_margin_parm != NULL) {
+ PUTS(tparm(set_left_margin_parm, 0));
+ PUTS(tparm(set_right_margin_parm, columns - 1));
+ } else if (clear_margins != NULL && set_left_margin != NULL
+ && set_right_margin != NULL) {
+ PUTS(clear_margins);
+ if (carriage_return != NULL) {
+ PUTS(carriage_return);
+ } else {
+ PUTCHAR('\r');
+ }
+ PUTS(set_left_margin);
+ if (parm_right_cursor) {
+ PUTS(tparm(parm_right_cursor, columns - 1));
+ } else {
+ for(i = 0; i < columns - 1; i++) {
+ PUTCHAR(' ');
+ }
+ }
+ PUTS(set_right_margin);
+ if (carriage_return != NULL) {
+ PUTS(carriage_return);
+ } else {
+ PUTCHAR('\r');
+ }
+ }
+ FLUSH;
+
+ if (init_tabs != 8) {
+ if (clear_all_tabs != NULL && set_tab != NULL) {
+ for(i = 0; i < columns - 1; i += 8) {
+ if (parm_right_cursor) {
+ PUTS(tparm(parm_right_cursor, 8));
+ } else {
+ for(j = 0; j < 8; j++)
+ PUTCHAR(' ');
+ }
+ PUTS(set_tab);
+ }
+ FLUSH;
+ }
+ }
+
+ if (reset && reset_file != NULL) {
+ f = fopen(reset_file, "r");
+ if (f == NULL) {
+ quit(errno, "Can't open reset_file: '%s'", reset_file);
+ }
+ while((c = fgetc(f)) != EOF) {
+ PUTCHAR(c);
+ }
+ fclose(f);
+ } else if (init_file != NULL) {
+ f = fopen(init_file, "r");
+ if (f == NULL) {
+ quit(errno, "Can't open init_file: '%s'", init_file);
+ }
+ while((c = fgetc(f)) != EOF) {
+ PUTCHAR(c);
+ }
+ fclose(f);
+ }
+ FLUSH;
+
+ if (reset && reset_3string != NULL) {
+ PUTS(reset_3string);
+ } else if (init_2string != NULL) {
+ PUTS(init_2string);
+ }
+ FLUSH;
+ return 0;
+ }
+
+ if (strcmp(name, "longname") == 0) {
+ PUTS(longname());
+ return 0;
+ }
+
+#ifndef PURE_TERMINFO
+ {
+ const struct name_table_entry *np;
+
+ if ((np = _nc_find_entry(name, _nc_get_hash_table(1))) != 0)
+ switch(np->nte_type)
+ {
+ case BOOLEAN:
+ if (bool_from_termcap[np->nte_index])
+ name = boolnames[np->nte_index];
+ break;
+
+ case NUMBER:
+ if (num_from_termcap[np->nte_index])
+ name = numnames[np->nte_index];
+ break;
+
+ case STRING:
+ if (str_from_termcap[np->nte_index])
+ name = strnames[np->nte_index];
+ break;
+ }
+ }
+#endif
+
+ if ((status = tigetflag(name)) != -1)
+ return(status != 0);
+ else if ((status = tigetnum(name)) != CANCELLED_NUMERIC) {
+ (void) printf("%d\n", status);
+ return(0);
+ }
+ else if ((s = tigetstr(name)) == CANCELLED_STRING)
+ quit(4, "%s: unknown terminfo capability '%s'", prg_name, name);
+ else if (s != (char *)NULL) {
+ if (argc > 1) {
+ int k;
+
+ /* 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++)
+ if (isdigit(argv[k][0])) {
+ long val = atol(argv[k]);
+ argv[k] = (char *)val;
+ }
+
+ s = tparm(s,argv[1],argv[2],argv[3],argv[4],
+ argv[5],argv[6],argv[7],argv[8],
+ argv[9]);
+ }
+
+ /* use putp() in order to perform padding */
+ putp(s);
+ return(0);
+ }
+ return(0);
+}
+
+int main(int argc, char **argv)
+{
+char *s, *term;
+int errret, cmdline = 1;
+int c;
+char buf[BUFSIZ];
+int errors = 0;
+
+ prg_name = argv[0];
+ s = strrchr(prg_name, '/');
+ if (s != NULL && *++s != '\0')
+ prg_name = s;
+
+ term = getenv("TERM");
+
+ while ((c = getopt (argc, argv, "ST:")) != EOF)
+ switch (c)
+ {
+ case 'S':
+ cmdline = 0;
+ break;
+ case 'T':
+ use_env(FALSE);
+ term = optarg;
+ break;
+ default:
+ usage();
+ /* NOTREACHED */
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (cmdline && argc == 0) {
+ usage();
+ /* NOTREACHED */
+ }
+
+ if (term == NULL || *term == '\0')
+ quit(2, "No value for $TERM and no -T specified");
+
+ if (setupterm(term, STDOUT_FILENO, &errret) != OK && errret <= 0)
+ quit(3, "unknown terminal \"%s\"", term);
+
+ if (cmdline)
+ return tput(argc, argv);
+
+ while (fgets(buf, sizeof(buf), stdin) != (char *)NULL) {
+ char *argvec[16]; /* command, 9 parms, null, & slop */
+ int argnum = 0;
+ char *cp;
+
+ /* crack the argument list into a dope vector */
+ for (cp = buf; *cp; cp++) {
+ if (isspace(*cp))
+ *cp = '\0';
+ else if (cp == buf || cp[-1] == 0)
+ argvec[argnum++] = cp;
+ }
+ argvec[argnum] = (char *)NULL;
+
+ if (tput(argnum, argvec) != 0)
+ errors++;
+ }
+
+ return errors > 0;
+}
+
diff --git a/contrib/ncurses/progs/tset.c b/contrib/ncurses/progs/tset.c
new file mode 100644
index 000000000000..cef980ad9737
--- /dev/null
+++ b/contrib/ncurses/progs/tset.c
@@ -0,0 +1,1200 @@
+/****************************************************************************
+ * Copyright (c) 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: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
+ * and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ ****************************************************************************/
+
+
+/*
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * 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.
+ */
+
+#define __INTERNAL_CAPS_VISIBLE /* we need to see has_hardware_tabs */
+#include <progs.priv.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <termcap.h>
+#include <fcntl.h>
+
+#if HAVE_GETTTYNAM && HAVE_TTYENT_H
+#include <ttyent.h>
+#endif
+#ifdef NeXT
+char *ttyname(int fd);
+#endif
+
+/* this is just to stifle a missing-prototype warning */
+#ifdef linux
+# include <sys/ioctl.h>
+#endif
+
+#if NEED_PTEM_H
+/* they neglected to define struct winsize in termios.h -- it's only
+ in termio.h */
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+#include <curses.h> /* for bool typedef */
+#include <dump_entry.h>
+
+MODULE_ID("$Id: tset.c,v 0.37 1999/03/14 12:30:02 tom Exp $")
+
+extern char **environ;
+
+#undef CTRL
+#define CTRL(x) ((x) & 0x1f)
+
+const char *_nc_progname = "tset";
+
+static TTY mode, oldmode;
+
+static int terasechar = -1; /* new erase character */
+static int intrchar = -1; /* new interrupt character */
+static int isreset; /* invoked as reset */
+static int tkillchar = -1; /* new kill character */
+static int tlines, tcolumns; /* window size */
+
+#define LOWERCASE(c) ((isalpha(c) && isupper(c)) ? tolower(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);
+}
+
+#if !HAVE_STRDUP
+#define strdup _nc_strdup
+extern char *_nc_strdup(const char *);
+#endif /* not HAVE_STRDUP */
+
+static void
+err(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ (void)fprintf(stderr, "tset: ");
+ (void)vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ (void)fprintf(stderr, "\n");
+ exit(EXIT_FAILURE);
+ /* NOTREACHED */
+}
+
+static void
+failed(const char *msg)
+{
+ char temp[BUFSIZ];
+ perror(strcat(strcpy(temp, "tset: "), msg));
+ exit(EXIT_FAILURE);
+ /* NOTREACHED */
+}
+
+static void
+cat(char *file)
+{
+ register int fd, nr, nw;
+ char buf[BUFSIZ];
+
+ if ((fd = open(file, O_RDONLY, 0)) < 0)
+ failed(file);
+
+ while ((nr = read(fd, buf, sizeof(buf))) > 0)
+ if ((nw = write(STDERR_FILENO, buf, (size_t)nr)) == -1)
+ failed("write to stderr");
+ if (nr != 0)
+ failed(file);
+ (void)close(fd);
+}
+
+static int
+outc(int c)
+{
+ return putc(c, stderr);
+}
+
+/* Prompt the user for a terminal type. */
+static const char *
+askuser(const char *dflt)
+{
+ static char answer[256];
+ char *p;
+
+ /* We can get recalled; if so, don't continue uselessly. */
+ if (feof(stdin) || ferror(stdin)) {
+ (void)fprintf(stderr, "\n");
+ exit(EXIT_FAILURE);
+ }
+ for (;;) {
+ 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) {
+ (void)fprintf(stderr, "\n");
+ exit(EXIT_FAILURE);
+ }
+ 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. */
+ speed_t speed; /* Baud rate to compare against. */
+} MAP;
+
+static MAP *cur, *maplist;
+
+typedef struct speeds {
+ const char *string;
+ int speed;
+} SPEEDS;
+
+static const SPEEDS speeds[] = {
+ { "0", B0 },
+ { "50", B50 },
+ { "75", B75 },
+ { "110", B110 },
+ { "134", B134 },
+ { "134.5", B134 },
+ { "150", B150 },
+ { "200", B200 },
+ { "300", B300 },
+ { "600", B600 },
+ { "1200", B1200 },
+ { "1800", B1800 },
+ { "2400", B2400 },
+ { "4800", B4800 },
+ { "9600", B9600 },
+ { "19200", B19200 },
+ { "38400", B38400 },
+ { "19200", B19200 },
+ { "38400", B38400 },
+#ifdef B19200
+ { "19200", B19200 },
+#else
+#ifdef EXTA
+ { "19200", EXTA },
+#endif
+#endif
+#ifdef B38400
+ { "38400", B38400 },
+#else
+#ifdef EXTB
+ { "38400", EXTB },
+#endif
+#endif
+#ifdef B57600
+ { "57600", B57600 },
+#endif
+#ifdef B115200
+ { "115200", B115200 },
+#endif
+#ifdef B230400
+ { "230400", B230400 },
+#endif
+#ifdef B460800
+ { "460800", B460800 },
+#endif
+ { (char *)0, 0 }
+};
+
+static int
+tbaudrate(char *rate)
+{
+ const SPEEDS *sp;
+ int found = FALSE;
+
+ /* The baudrate number can be preceded by a 'B', which is ignored. */
+ if (*rate == 'B')
+ ++rate;
+
+ for (sp = speeds; sp->string; ++sp) {
+ if (!CaselessCmp(rate, sp->string)) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found)
+ 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 = malloc(sizeof(MAP));
+ if (copy == 0 || mapp == 0)
+ failed("malloc");
+ 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);
+ }
+
+ if (arg == (char *)0) /* Non-optional type. */
+ goto badmopt;
+
+ 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;
+ }
+
+#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 = (ospeed == mapp->speed);
+ break;
+ case GE:
+ match = (ospeed >= mapp->speed);
+ break;
+ case GT:
+ match = (ospeed > mapp->speed);
+ break;
+ case LE:
+ match = (ospeed <= mapp->speed);
+ break;
+ case LT:
+ match = (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(char *userarg)
+{
+ int rval, errret;
+ char *p;
+ const char *ttype;
+#if HAVE_GETTTYNAM
+ struct ttyent *t;
+#else
+ FILE *fp;
+#endif
+ char *ttypath;
+
+ if (userarg) {
+ ttype = userarg;
+ goto found;
+ }
+
+ /* Try the environment. */
+ if ((ttype = getenv("TERM")) != 0)
+ goto map;
+
+ if ((ttypath = ttyname(STDERR_FILENO)) != 0) {
+ if ((p = strrchr(ttypath, '/')) != 0)
+ ++p;
+ else
+ p = 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(*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 */
+ }
+
+ /* 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 && *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], 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 ((rval = setupterm((NCURSES_CONST char *)ttype, STDOUT_FILENO, &errret)) != OK) {
+ if (errret == 0) {
+ (void)fprintf(stderr, "tset: unknown terminal type %s\n",
+ ttype);
+ ttype = 0;
+ }
+ else {
+ (void)fprintf(stderr, "tset: can't initialize terminal type %s (error %d)\n", ttype, errret);
+ ttype = 0;
+ }
+ ttype = askuser(ttype);
+ }
+#if BROKEN_LINKER
+ tgetflag("am"); /* force lib_termcap.o to be linked for 'ospeed' */
+#endif
+ return (ttype);
+}
+
+/**************************************************************************
+ *
+ * Mode-setting logic
+ *
+ **************************************************************************/
+
+/* some BSD systems have these built in, some systems are missing
+ * one or more definitions. The safest solution is to override.
+ */
+#undef CEOF
+#undef CERASE
+#undef CINTR
+#undef CKILL
+#undef CLNEXT
+#undef CRPRNT
+#undef CQUIT
+#undef CSTART
+#undef CSTOP
+#undef CSUSP
+
+/* control-character defaults */
+#define CEOF CTRL('D')
+#define CERASE CTRL('H')
+#define CINTR 127 /* ^? */
+#define CKILL CTRL('U')
+#define CLNEXT CTRL('v')
+#define CRPRNT CTRL('r')
+#define CQUIT CTRL('\\')
+#define CSTART CTRL('Q')
+#define CSTOP CTRL('S')
+#define CSUSP CTRL('Z')
+
+#define CHK(val, dft) ((int)val <= 0 ? dft : val)
+
+static bool set_tabs (void);
+
+/*
+ * Reset the terminal mode bits to a sensible state. Very useful after
+ * a child program dies in raw mode.
+ */
+static void
+reset_mode(void)
+{
+#ifdef TERMIOS
+ tcgetattr(STDERR_FILENO, &mode);
+#else
+ stty(STDERR_FILENO,&mode);
+#endif
+
+#ifdef TERMIOS
+#if defined(VDISCARD) && defined(CDISCARD)
+ mode.c_cc[VDISCARD] = CHK(mode.c_cc[VDISCARD], CDISCARD);
+#endif
+ mode.c_cc[VEOF] = CHK(mode.c_cc[VEOF], CEOF);
+ mode.c_cc[VERASE] = CHK(mode.c_cc[VERASE], CERASE);
+#if defined(VFLUSH) && defined(CFLUSH)
+ mode.c_cc[VFLUSH] = CHK(mode.c_cc[VFLUSH], CFLUSH);
+#endif
+ mode.c_cc[VINTR] = CHK(mode.c_cc[VINTR], CINTR);
+ mode.c_cc[VKILL] = CHK(mode.c_cc[VKILL], CKILL);
+#if defined(VLNEXT) && defined(CLNEXT)
+ mode.c_cc[VLNEXT] = CHK(mode.c_cc[VLNEXT], CLNEXT);
+#endif
+ mode.c_cc[VQUIT] = CHK(mode.c_cc[VQUIT], CQUIT);
+#if defined(VREPRINT) && defined(CRPRNT)
+ mode.c_cc[VREPRINT] = CHK(mode.c_cc[VREPRINT], CRPRNT);
+#endif
+#if defined(VSTART) && defined(CSTART)
+ mode.c_cc[VSTART] = CHK(mode.c_cc[VSTART], CSTART);
+#endif
+#if defined(VSTOP) && defined(CSTOP)
+ mode.c_cc[VSTOP] = CHK(mode.c_cc[VSTOP], CSTOP);
+#endif
+#if defined(VSUSP) && defined(CSUSP)
+ mode.c_cc[VSUSP] = CHK(mode.c_cc[VSUSP], CSUSP);
+#endif
+#if defined(VWERASE) && defined(CWERASE)
+ mode.c_cc[VWERASE] = CHK(mode.c_cc[VWERASE], CWERASE);
+#endif
+
+ mode.c_iflag &= ~(IGNBRK | PARMRK | INPCK | ISTRIP | INLCR | IGNCR
+#ifdef IUCLC
+ | IUCLC
+#endif
+#ifdef IXANY
+ | IXANY
+#endif
+ | IXOFF);
+
+ mode.c_iflag |= (BRKINT | IGNPAR | ICRNL | IXON
+#ifdef IMAXBEL
+ | IMAXBEL
+#endif
+ );
+
+ mode.c_oflag &= ~(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 | CRDLY | TABDLY | BSDLY | VTDLY | FFDLY
+#endif
+ );
+
+ mode.c_oflag |= (OPOST
+#ifdef ONLCR
+ | ONLCR
+#endif
+ );
+
+ mode.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD | CLOCAL);
+ mode.c_cflag |= (CS8 | CREAD);
+ mode.c_lflag &= ~(ECHONL | NOFLSH
+#ifdef TOSTOP
+ | TOSTOP
+#endif
+#ifdef ECHOPTR
+ | ECHOPRT
+#endif
+#ifdef XCASE
+ | XCASE
+#endif
+ );
+
+ mode.c_lflag |= (ISIG | ICANON | ECHO | ECHOE | ECHOK
+#ifdef ECHOCTL
+ | ECHOCTL
+#endif
+#ifdef ECHOKE
+ | ECHOKE
+#endif
+ );
+#endif
+
+#ifdef TERMIOS
+ tcsetattr(STDERR_FILENO, TCSADRAIN, &mode);
+#else
+ stty(STDERR_FILENO, &mode);
+#endif
+}
+
+/*
+ * 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
+ && key_backspace != 0
+ && strlen(key_backspace) == 1)
+ result = key_backspace[0];
+ else
+ result = CERASE;
+
+ return result;
+}
+
+/*
+ * Update the values of the erase, interrupt, and kill characters in 'mode'.
+ *
+ * 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.
+ */
+static void
+set_control_chars(void)
+{
+#ifdef TERMIOS
+ if (mode.c_cc[VERASE] == 0 || terasechar >= 0)
+ mode.c_cc[VERASE] = terasechar >= 0 ? terasechar : default_erase();
+
+ if (mode.c_cc[VINTR] == 0 || intrchar >= 0)
+ mode.c_cc[VINTR] = intrchar >= 0 ? intrchar : CINTR;
+
+ if (mode.c_cc[VKILL] == 0 || tkillchar >= 0)
+ mode.c_cc[VKILL] = tkillchar >= 0 ? tkillchar : CKILL;
+#endif
+}
+
+/*
+ * Set up various conversions in 'mode', including parity, tabs, returns,
+ * echo, and case, according to the termcap entry. If the program we're
+ * running was named with a leading upper-case character, map external
+ * uppercase to internal lowercase.
+ */
+static void
+set_conversions(void)
+{
+#ifdef __OBSOLETE__
+ /*
+ * Conversion logic for some *really* ancient terminal glitches,
+ * not supported in terminfo. Left here for succeeding generations
+ * to marvel at.
+ */
+ if (tgetflag("UC")) {
+#ifdef IUCLC
+ mode.c_iflag |= IUCLC;
+ mode.c_oflag |= OLCUC;
+#endif
+ } else if (tgetflag("LC")) {
+#ifdef IUCLC
+ mode.c_iflag &= ~IUCLC;
+ mode.c_oflag &= ~OLCUC;
+#endif
+ }
+ mode.c_iflag &= ~(PARMRK | INPCK);
+ mode.c_lflag |= ICANON;
+ if (tgetflag("EP")) {
+ mode.c_cflag |= PARENB;
+ mode.c_cflag &= ~PARODD;
+ }
+ if (tgetflag("OP")) {
+ mode.c_cflag |= PARENB;
+ mode.c_cflag |= PARODD;
+ }
+#endif /* __OBSOLETE__ */
+
+#ifdef TERMIOS
+#ifdef ONLCR
+ mode.c_oflag |= ONLCR;
+#endif
+ mode.c_iflag |= ICRNL;
+ mode.c_lflag |= ECHO;
+#ifdef OXTABS
+ mode.c_oflag |= OXTABS;
+#endif /* OXTABS */
+
+ /* test used to be tgetflag("NL") */
+ if (newline != (char *)0 && newline[0] == '\n' && !newline[1]) {
+ /* Newline, not linefeed. */
+#ifdef ONLCR
+ mode.c_oflag &= ~ONLCR;
+#endif
+ mode.c_iflag &= ~ICRNL;
+ }
+#ifdef __OBSOLETE__
+ if (tgetflag("HD")) /* Half duplex. */
+ mode.c_lflag &= ~ECHO;
+#endif /* __OBSOLETE__ */
+#ifdef OXTABS
+ /* test used to be tgetflag("pt") */
+ if (has_hardware_tabs) /* Print tabs. */
+ mode.c_oflag &= ~OXTABS;
+#endif /* OXTABS */
+ mode.c_lflag |= (ECHOE | ECHOK);
+#endif
+}
+
+/* Output startup string. */
+static void
+set_init(void)
+{
+ char *p;
+ bool settle;
+
+#ifdef __OBSOLETE__
+ if (pad_char != (char *)0) /* Get/set pad character. */
+ PC = pad_char[0];
+#endif /* OBSOLETE */
+
+#ifdef TAB3
+ if (oldmode.c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
+ oldmode.c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
+ tcsetattr(STDERR_FILENO, TCSADRAIN, &oldmode);
+ }
+#endif
+ settle = set_tabs();
+
+ if (isreset) {
+ if ((p = reset_1string) != 0) {
+ tputs(p, 0, outc);
+ settle = TRUE;
+ }
+ if ((p = reset_2string) != 0) {
+ tputs(p, 0, outc);
+ settle = TRUE;
+ }
+ /* What about rf, rs3, as per terminfo man page? */
+ /* also might be nice to send rmacs, rmul, rmm */
+ if ((p = reset_file) != 0
+ || (p = init_file) != 0) {
+ cat(p);
+ settle = TRUE;
+ }
+ }
+
+ if (settle) {
+ (void)putc('\r', stderr);
+ (void)fflush(stderr);
+ (void)napms(1000); /* Settle the terminal. */
+ }
+}
+
+/*
+ * 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 patch in case we blow this.
+ * Return TRUE if we set any tab stops, FALSE if not.
+ */
+static bool
+set_tabs()
+{
+ if (set_tab && clear_all_tabs) {
+ int c;
+
+ (void)putc('\r', stderr); /* Force to left margin. */
+ tputs(clear_all_tabs, 0, outc);
+
+ for (c = 8; c < tcolumns; c += 8) {
+ /* Get to the right column. In BSD tset, this
+ * used to try a bunch of half-clever things
+ * with cup and hpa, for an average saving of
+ * somewhat less than two character times per
+ * tab stop, less that .01 sec at 2400cps. We
+ * lost all this cruft because it seemed to be
+ * introducing some odd bugs.
+ * ----------12345678----------- */
+ (void)fputs(" ", stderr);
+ tputs(set_tab, 0, outc);
+ }
+ putc('\r', stderr);
+ return (TRUE);
+ }
+ return (FALSE);
+}
+
+/**************************************************************************
+ *
+ * Main sequence
+ *
+ **************************************************************************/
+
+/*
+ * Tell the user if a control key has been changed from the default value.
+ */
+static void
+report(const char *name, int which, unsigned def)
+{
+#ifdef TERMIOS
+ unsigned older, newer;
+ char *p;
+
+ newer = mode.c_cc[which];
+ older = oldmode.c_cc[which];
+
+ if (older == newer && older == def)
+ return;
+
+ (void)fprintf(stderr, "%s %s ", name, older == newer ? "is" : "set to");
+
+ /*
+ * Check 'delete' before 'backspace', since the key_backspace value
+ * is ambiguous.
+ */
+ 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", newer, newer);
+ } else
+ (void)fprintf(stderr, "%c.\n", newer);
+#endif
+}
+
+/*
+ * 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
+usage(const char* pname)
+{
+ (void)fprintf(stderr,
+"usage: %s [-IQrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]\n", pname);
+ exit(EXIT_FAILURE);
+}
+
+static char arg_to_char(void)
+{
+ return (optarg[0] == '^' && optarg[1] != '\0')
+ ? ((optarg[1] == '?') ? '\177' : CTRL(optarg[1]))
+ : optarg[0];
+}
+
+int
+main(int argc, char **argv)
+{
+#if defined(TIOCGWINSZ) && defined(TIOCSWINSZ)
+ struct winsize win;
+#endif
+ int ch, noinit, noset, quiet, Sflag, sflag, showterm;
+ const char *p;
+ const char *ttype;
+
+#ifdef TERMIOS
+ if (tcgetattr(STDERR_FILENO, &mode) < 0)
+ failed("standard error");
+
+ oldmode = mode;
+ ospeed = cfgetospeed(&mode);
+#else
+ if (gtty(STDERR_FILENO, &mode) < 0)
+ failed("standard error");
+
+ oldmode = mode;
+ ospeed = mode.sg_ospeed;
+#endif
+
+ if ((p = strrchr(*argv, '/')) != 0)
+ ++p;
+ else
+ p = *argv;
+ if (!CaselessCmp(p, "reset")) {
+ isreset = 1;
+ reset_mode();
+ }
+
+ obsolete(argv);
+ noinit = noset = quiet = Sflag = sflag = showterm = 0;
+ while ((ch = getopt(argc, argv, "a:d:e:Ii:k:m:np:qQSrs")) != EOF) {
+ switch (ch) {
+ case 'q': /* display term only */
+ noset = 1;
+ 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 'n': /* OBSOLETE: set new tty driver */
+ 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 'S': /* OBSOLETE: output TERM & TERMCAP */
+ Sflag = 1;
+ break;
+ case 'r': /* display term on stderr */
+ showterm = 1;
+ break;
+ case 's': /* output TERM set command */
+ sflag = 1;
+ break;
+ case '?':
+ default:
+ usage(*argv);
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc > 1)
+ usage(*argv);
+
+ ttype = get_termcap_entry(*argv);
+
+ if (!noset) {
+ tcolumns = columns;
+ tlines = lines;
+
+#if defined(TIOCGWINSZ) && defined(TIOCSWINSZ)
+ /* Set window size */
+ (void)ioctl(STDERR_FILENO, TIOCGWINSZ, &win);
+ if (win.ws_row == 0 && win.ws_col == 0 &&
+ tlines > 0 && tcolumns > 0) {
+ win.ws_row = tlines;
+ win.ws_col = tcolumns;
+ (void)ioctl(STDERR_FILENO, TIOCSWINSZ, &win);
+ }
+#endif
+ set_control_chars();
+ set_conversions();
+
+ if (!noinit)
+ set_init();
+
+ /* Set the modes if they've changed. */
+ if (memcmp(&mode, &oldmode, sizeof(mode)))
+#ifdef TERMIOS
+ tcsetattr(STDERR_FILENO, TCSADRAIN, &mode);
+#else
+ stty(STDERR_FILENO, &mode);
+#endif
+ }
+
+ /* Get the terminal name from the entry. */
+ ttype = _nc_first_name(cur_term->type.term_names);
+
+ 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) {
+ report("Erase", VERASE, CERASE);
+ report("Kill", VKILL, CINTR);
+ report("Interrupt", VINTR, CKILL);
+ }
+ }
+
+ if (Sflag)
+ err("The -S option is not supported under terminfo.");
+
+ if (sflag) {
+ /*
+ * Figure out what shell we're using. A hack, we look for an
+ * environmental variable SHELL ending in "csh".
+ */
+ if ((p = getenv("SHELL")) != 0
+ && !strcmp(p + strlen(p) - 3, "csh"))
+ p = "set noglob;\nsetenv TERM %s;\nunset noglob;\n";
+ else
+ p = "TERM=%s;\n";
+ (void) printf(p, ttype);
+ }
+
+ return EXIT_SUCCESS;
+}
+
+/* tset.c ends here */
diff --git a/contrib/ncurses/shlib-versions b/contrib/ncurses/shlib-versions
new file mode 100644
index 000000000000..313d2c2c931f
--- /dev/null
+++ b/contrib/ncurses/shlib-versions
@@ -0,0 +1,4 @@
+.*-.*-linux.* libform=4
+.*-.*-linux.* libmenu=4
+.*-.*-linux.* libncurses=4
+.*-.*-linux.* libpanel=4
diff --git a/contrib/ncurses/tack/COPYING b/contrib/ncurses/tack/COPYING
new file mode 100644
index 000000000000..60549be514af
--- /dev/null
+++ b/contrib/ncurses/tack/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/contrib/ncurses/tack/HISTORY b/contrib/ncurses/tack/HISTORY
new file mode 100644
index 000000000000..b1de61d1c4af
--- /dev/null
+++ b/contrib/ncurses/tack/HISTORY
@@ -0,0 +1,42 @@
+
+Current history:
+
+1999/05/16 Minor fix to build/link on CLIX
+1999/05/09 Update to build/link on NeXT
+1999/04/17 Update to work with ncurses 5.0 beta1 (TERMTYPE struct)
+1999/02/07 Build with ncurses 4.2 981219 (renamed function)
+1998/01/09 1.00 First release under GPL
+1997/12/24 0.02 First version that requires ncurses
+1997/10/29 0.01 Second beta release to the ncurses mailing list.
+1997/10/06 0.00 First beta release to the ncurses mailing list.
+
+Ancient history: TACK -- the terminfo action checker
+
+ The purpose of this program is to verify the correctness of
+terminfos and to calculate the pads needed for each capability.
+This program is not designed to test curses and therefore uses
+as little of curses as possible.
+
+ This program was originally called TED. In 1991 it was
+released to USENET in comp.sources. TED was originally written to
+test both terminfos and termcaps. The original intent was to
+create a terminfo editor. This code fell quite short of its goal.
+Tests were controled by command line switches and editing was done
+with pen and paper.
+
+ In 1995 Eric S. Raymond got interested in the program and added
+a first cut at making the program menu driven. He also converted
+the code from K&R C to an ANSI/POSIX-conforming C. He re-christened
+the program TAC (Terminfo Action Checker). Eric also wrote a man
+page for TAC.
+
+ In 1997 I decided to dust off the code and make it easier to
+use by the novice. I totally rewrote the menu system and added
+the editing features I originally planned for TED. I also did
+a total rewrite of the code that does the timings. In the process
+of rewriting the code I changed it to be more tightly coupled
+with ncurses. By this time someone had taken the name TAC so
+I re-christened the program TACK.
+
+Daniel Weaver
+<danw@znyx.com>
diff --git a/contrib/ncurses/tack/Makefile.in b/contrib/ncurses/tack/Makefile.in
new file mode 100644
index 000000000000..0c4018fbbc02
--- /dev/null
+++ b/contrib/ncurses/tack/Makefile.in
@@ -0,0 +1,155 @@
+# $Id: Makefile.in,v 1.7 1998/03/28 21:41:21 tom Exp $
+# Makefile for tack
+#
+# 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 = /bin/sh
+THIS = Makefile
+
+CF_MFLAGS = @cf_cv_makeflags@
+@SET_MAKE@
+
+MODEL = ../@DFT_OBJ_SUBDIR@
+INSTALL_PREFIX = @INSTALL_PREFIX@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+
+ticdir = $(datadir)/terminfo
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+
+AWK = @AWK@
+LN_S = @LN_S@
+
+CC = @CC@
+CFLAGS = @CFLAGS@
+
+INCDIR = $(srcdir)/../include
+CPPFLAGS = -DHAVE_CONFIG_H -I../tack -I$(srcdir) @CPPFLAGS@
+
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -pg
+CFLAGS_SHARED = $(CCFLAGS) # @CC_SHARED_OPTS@
+
+CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@)
+
+LD = @LD@
+LINK = $(CC)
+LDFLAGS = @EXTRA_LDFLAGS@ \
+ @PROG_ARGS@ @LDFLAGS@ @LD_MODEL@ @LIBS@ @EXTRA_LIBS@
+
+LDFLAGS_NORMAL = $(LDFLAGS)
+LDFLAGS_DEBUG = $(LDFLAGS) @CC_G_OPT@
+LDFLAGS_PROFILE = $(LDFLAGS) -pg
+LDFLAGS_SHARED = $(LDFLAGS) @CC_SHARED_OPTS@ # @LD_SHARED_OPTS@
+
+LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@)
+
+LINT = @LINT@
+LINT_OPTS = @LINT_OPTS@
+LINT_LIBS = -lncurses @LIBS@
+
+PROGS = tack
+
+# Default library, for linking applications
+DEPS_CURSES = ../lib/libncurses@DFT_DEP_SUFFIX@
+
+################################################################################
+all: $(PROGS)
+
+install: install.tack
+uninstall: uninstall.tack
+
+# this line simplifies the configure-script
+install.libs:
+uninstall.libs:
+
+install.tack: $(PROGS) $(INSTALL_PREFIX)$(bindir)
+ $(INSTALL_PROGRAM) tack $(INSTALL_PREFIX)$(bindir)/tack
+
+uninstall.tack:
+ -@rm -f $(INSTALL_PREFIX)$(bindir)/tack
+
+$(INSTALL_PREFIX)$(bindir) :
+ $(srcdir)/../mkinstalldirs $@
+
+#
+# Rules for building tack
+#
+
+DEPS_TACK = \
+ $(MODEL)/ansi.o \
+ $(MODEL)/charset.o \
+ $(MODEL)/color.o \
+ $(MODEL)/control.o \
+ $(MODEL)/crum.o \
+ $(MODEL)/edit.o \
+ $(MODEL)/fun.o \
+ $(MODEL)/init.o \
+ $(MODEL)/menu.o \
+ $(MODEL)/modes.o \
+ $(MODEL)/output.o \
+ $(MODEL)/pad.o \
+ $(MODEL)/scan.o \
+ $(MODEL)/sync.o \
+ $(MODEL)/sysdep.o \
+ $(MODEL)/tack.o
+
+tack: $(DEPS_TACK) $(DEPS_CURSES)
+ @ECHO_LINK@ $(LINK) $(DEPS_TACK) $(LDFLAGS_DEFAULT) -o $@
+
+#
+# Utility productions start here
+#
+
+tags:
+ ctags *.[ch]
+
+TAGS:
+ etags *.[ch]
+
+clean ::
+ -rm -f tags TAGS do.tic *~
+ -rm -f $(PROGS)
+
+distclean :: clean
+ -rm -f Makefile
+
+mostlyclean :: clean
+
+realclean :: distclean
+
+tack.tar: Makefile.in modules *.[ch] tack.1 HISTORY COPYING
+ tar -cvf tack.tar Makefile.in modules *.[ch] tack.1 HISTORY COPYING
+
+# 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) $(CF_MFLAGS)
+
+$(DEPS_CURSES) :
+ cd ../ncurses; $(MAKE) $(CF_MFLAGS)
+
+lint:
+ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/clear.c $(LINT_LIBS)
+
+###############################################################################
+# The remainder of this file is automatically generated during configuration
+###############################################################################
diff --git a/contrib/ncurses/tack/README b/contrib/ncurses/tack/README
new file mode 100644
index 000000000000..c1b0286b4fc4
--- /dev/null
+++ b/contrib/ncurses/tack/README
@@ -0,0 +1,5 @@
+-- $Id: README,v 1.1 1999/04/18 01:41:31 tom Exp $
+
+The 'tack' program is distributed with ncurses, but is not an integral
+part of ncurses (the two are licensed differently, and the tack directory
+may be removed without causing ncurses to configure or build properly).
diff --git a/contrib/ncurses/tack/ansi.c b/contrib/ncurses/tack/ansi.c
new file mode 100644
index 000000000000..a514a9c1d0fb
--- /dev/null
+++ b/contrib/ncurses/tack/ansi.c
@@ -0,0 +1,889 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: ansi.c,v 1.2 1999/08/21 23:11:57 tom Exp $")
+
+/*
+ * Standalone tests for ANSI terminals. Three entry points:
+ * test_ansi_graphics(), test_ansi_reports() and test_ansi_sgr().
+ */
+
+/*****************************************************************************
+ *
+ * Test ANSI status reports
+ *
+ *****************************************************************************/
+
+/* ASCII control characters */
+#define A_DC1 0x11 /* Control Q */
+#define A_DC3 0x13 /* Control S */
+#define A_ESC 0x1b
+#define A_DCS 0x90
+#define A_CSI 0x9b
+#define A_ST 0x9c
+
+#define MAX_MODES 256
+
+static char default_bank[] = "\033(B\017";
+static int private_use, ape, terminal_class, got_escape;
+static short ansi_value[256];
+static char ansi_buf[512], pack_buf[512];
+static char *ach, *pch;
+
+struct ansi_reports {
+ int lvl, final;
+ const char *text;
+ const char *request;
+};
+
+static struct ansi_reports report_list[] = {
+ {0, 'c', "(DA) Primary device attributes", "\033[0c"},
+ {1, 0, "(DSR) Terminal status", "\033[5n"},
+ {1, 'R', "(DSR) Cursor position", "\033[6n"},
+ {62, 0, "(DA) Secondary device attributes", "\033[>0c"},
+ {62, 0, "(DSR) Printer status", "\033[?15n"},
+ {62, 0, "(DSR) Function key definition", "\033[?25n"},
+ {62, 0, "(DSR) Keyboard language", "\033[?26n"},
+ {63, 0, "(DECRQSS) Data destination", "\033P$q$}\033\\"},
+ {63, 0, "(DECRQSS) Status line type", "\033P$q$~\033\\"},
+ {63, 0, "(DECRQSS) Erase attribute", "\033P$q\"q\033\\"},
+ {63, 0, "(DECRQSS) Personality", "\033P$q\"p\033\\"},
+ {63, 0, "(DECRQSS) Top and bottom margins", "\033P$qr\033\\"},
+ {63, 0, "(DECRQSS) Character attributes", "\033P$qm\033\\"},
+ {63, 0, "(DECRQSS) Illegal request", "\033P$q@\033\\"},
+ {63, 0, "(DECRQUPSS) User pref suplemental set", "\033[&u"},
+ {63, 0, "(DECRQPSR) Cursor information", "\033[1$w"},
+ {63, 0, "(DECRQPSR) Tab stop information", "\033[2$w"},
+ {64, 0, "(DA) Tertiary device attributes", "\033[=0c"},
+ {64, 0, "(DSR) Extended cursor position", "\033[?6n"},
+ {64, 0, "(DSR) Macro space", "\033[?62n"},
+ {64, 0, "(DSR) Memory checksum", "\033[?63n"},
+ {64, 0, "(DSR) Data integrity", "\033[?75n"},
+ {64, 0, "(DSR) Multiple session status", "\033[?85n"},
+ {64, 0, "(DECRQSS) Attribute change extent", "\033P$q*x\033\\"},
+ {64, 0, "(DECRQSS) Columns per page", "\033P$q$|\033\\"},
+ {64, 0, "(DECRQSS) Lines per page", "\033P$qt\033\\"},
+ {64, 0, "(DECRQSS) Lines per screen", "\033P$q*|\033\\"},
+ {64, 0, "(DECRQSS) Left and right margins", "\033P$qs\033\\"},
+ {64, 0, "(DECRQSS) Local functions", "\033P$q+q\033\\"},
+ {64, 0, "(DECRQSS) Local function key control", "\033P$q=}\033\\"},
+ {64, 0, "(DECRQSS) Select modifier key reporting", "\033P$q+r\033\\"},
+ {64, 0, "(DECRQDE) Window report", "\033[\"v"},
+ {0, 0, 0, 0}
+};
+
+struct request_control {
+ const char *text;
+ const char *expect;
+ const char *request;
+ const char *set_mode;
+ const char *reset_mode;
+};
+
+/* Request control function selection or setting */
+static const struct request_control rqss[] = {
+ {"Data sent to screen", "0", "$}", "\033[0$}", 0},
+ {"Data sent to disabled status line", "0", "$}", 0, 0},
+ {"\033[0$~\033[1$}", "\033[0$}", 0, 0, 0},
+ {"Data sent to enabled status line", "1", "$}", 0, 0},
+ {"\033[2$~\033[1$}", "\033[0$}", 0, 0, 0},
+ {"Disbale status line", "0", "$~", "\033[0$~", 0},
+ {"Top status line", "1", "$~", "\033[1$~", 0},
+ {"Bottom status line", "2", "$~", "\033[2$~", 0},
+ {"Eraseable character", "0", "\"q", "\033[0\"q", 0},
+ {"Noneraseable character", "1", "\"q", "\033[1\"q", "\033[0\"q"},
+ {"Top and bottom margins", "3;10", "r", "\0337\033[3;10r", 0},
+ {"\033[r\0338", 0, 0, 0, 0},
+ {"Top and bottom margins", "default", "r", "\0337\033[r", "\0338"},
+ {"Character attributes, dim, bold", "1", "m", "\033[2;1m", "\033[m"},
+ {"Character attributes, bold, dim", "2", "m", "\033[1;2m", "\033[m"},
+ {"Character attributes, under, rev", "4;7", "m", "\033[4;7m", "\033[m"},
+ {"Character attributes, color", "35;42", "m", "\033[35;42m", "\033[m"},
+ {"All character attributes", "", "m", "\033[1;2;3;4;5;6;7;8;9m", 0},
+ {"\033[m", 0, 0, 0, 0},
+ {0, 0, 0, 0, 0}
+};
+
+/*
+** pack_ansi()
+**
+** read and pack an ANSI character
+*/
+static int
+pack_ansi(void)
+{
+ int ch;
+
+ if (*pch)
+ return *pch++;
+
+ while (1) {
+ ch = getchp(char_mask);
+ if (ch == EOF)
+ return EOF;
+ if (ch == A_DC1 || ch == A_DC3)
+ continue;
+ *ach++ = ch;
+ *ach = '\0';
+ if (got_escape && ch >= ' ') {
+ got_escape = 0;
+ if (ch < '@' || ch > '_') {
+ *pch++ = A_ESC;
+ *pch = ch;
+ pch[1] = '\0';
+ return A_ESC;
+ }
+ ch += 0x40;
+ break;
+ } else if (ch == A_ESC) {
+ got_escape = 1;
+ } else {
+ break;
+ }
+ }
+ *pch++ = ch;
+ *pch = '\0';
+ return ch;
+}
+
+
+/*
+** read_ansi()
+**
+** read an ANSI status report from terminal
+*/
+static void
+read_ansi(void)
+{
+ int ch;
+
+ fflush(stdout);
+ ach = ansi_buf;
+ pch = pack_buf;
+ ansi_buf[0] = pack_buf[0] = '\0';
+ got_escape = 0;
+ ch = pack_ansi();
+ if (ch == A_ESC)
+ do {
+ ch = pack_ansi();
+ if (ch == EOF)
+ return;
+ } while (ch < '0' || ch > '~');
+ else
+ if (ch == A_CSI)
+ do {
+ ch = pack_ansi();
+ if (ch == EOF)
+ return;
+ } while (ch < '@' || ch > '~');
+ else
+ if (ch == A_DCS)
+ do {
+ ch = pack_ansi();
+ if (ch == EOF)
+ return;
+ } while (ch != A_ST);
+ return;
+}
+
+/*
+** valid_mode(expected)
+**
+** read a terminal mode status report and parse the result
+** Return TRUE if we got the expected terminating character.
+*/
+static int
+valid_mode(int expected)
+{
+ char *s;
+ int ch, terminator;
+
+ read_ansi();
+
+ ape = 0;
+ ch = pack_buf[0] & 0xff;
+ ansi_value[0] = 0;
+ if (ch != A_CSI && ch != A_DCS)
+ return FALSE;
+
+ s = pack_buf + 1;
+ private_use = 0;
+ if ((*s >= '<') & (*s <= '?')) {
+ private_use = *s++;
+ }
+ terminator = 0;
+ for (; (ch = *s); s++) {
+ if (ch >= '0' && ch <= '9')
+ ansi_value[ape] = ansi_value[ape] * 10 + ch - '0';
+ else if (ch == ';' || ch == ':')
+ ansi_value[++ape] = 0;
+ else if (ch >= '<' && ch <= '?')
+ private_use = ch;
+ else if (ch >= ' ')
+ terminator = (terminator << 8) | ch;
+ else
+ break;
+ }
+ return terminator == expected;
+}
+
+/*
+** read_reports()
+**
+** read all the reports in the ANSI report structure
+*/
+static int
+read_reports(void)
+{
+ int i, j, k, tc, vcr, lc;
+ char *s;
+
+ lc = 5;
+ terminal_class = tc = 0;
+ for (i = 0; report_list[i].text; i++, lc++) {
+ if (terminal_class < report_list[i].lvl &&
+ tc < report_list[i].lvl) {
+ put_crlf();
+ menu_prompt();
+ ptext(" <return> to continue > ");
+ j = wait_here();
+ if (j != 'c' && j != 'C')
+ return j;
+ tc = report_list[i].lvl;
+ } else if (lc + 2 >= lines) {
+ put_crlf();
+ ptext("Hit any key to continue ");
+ (void) wait_here();
+ lc = 1;
+ }
+ sprintf(temp, "%s (%s) ", report_list[i].text,
+ expand_command(report_list[i].request));
+ ptext(temp);
+ for (j = strlen(temp); j < 49; j++)
+ putchp(' ');
+ tc_putp(report_list[i].request);
+ vcr = 0;
+ if (report_list[i].final == 0) {
+ read_ansi();
+ } else if (valid_mode(report_list[i].final))
+ switch (report_list[i].final) {
+ case 'c':
+ terminal_class = ansi_value[0];
+ break;
+ case 'R':
+ vcr = TRUE;
+ break;
+ }
+ j = pack_buf[0] & 0xff;
+ if (j == A_CSI || j == A_DCS) {
+ s = expand(ansi_buf);
+ if (char_count + expand_chars >= columns) {
+ put_str("\r\n ");
+ lc++;
+ }
+ put_str(s);
+ }
+ put_crlf();
+ if (vcr) { /* find out how big the screen is */
+ tc_putp(report_list[i].request);
+ if (!valid_mode('R'))
+ continue;
+ j = ansi_value[0];
+ k = ansi_value[1];
+ tc_putp("\033[255B\033[255C\033[6n");
+ if (!valid_mode('R'))
+ continue;
+ sprintf(temp, "\033[%d;%dH", j, k);
+ tc_putp(temp);
+ ptext("(DSR) Screen size (CSI 6 n)");
+ for (j = char_count; j < 50; j++)
+ putchp(' ');
+ sprintf(temp, "%d x %d", ansi_value[1], ansi_value[0]);
+ ptextln(temp);
+
+ }
+ }
+ menu_prompt();
+ ptext(" r->repeat test, <return> to continue > ");
+ return wait_here();
+}
+
+/*
+** request_cfss()
+**
+** Request Control function selection or settings
+*/
+static int
+request_cfss(void)
+{
+ int i, j, k, l, ch;
+ char *s;
+
+ put_clear();
+ ptextln("Request Expected Received");
+ put_crlf();
+ for (i = 0; rqss[i].text; i++) {
+ ptext(rqss[i].text);
+ j = strlen(rqss[i].text) + strlen(rqss[i].expect);
+ putchp(' ');
+ for (j++; j < 40; j++)
+ putchp(' ');
+ ptext(rqss[i].expect);
+ putchp(' ');
+ tc_putp(rqss[i].set_mode);
+ sprintf(temp, "\033P$q%s\033\\", rqss[i].request);
+ tc_putp(temp);
+ read_ansi();
+ tc_putp(rqss[i].reset_mode);
+ putchp(' ');
+ for (j = 0; ansi_buf[j]; j++) {
+ if (ansi_buf[j] == 'r') {
+ for (k = j++; (ch = (ansi_buf[k] & 0xff)); k++)
+ if (ch == A_ESC) {
+ break;
+ } else if (ch == A_ST) {
+ break;
+ }
+ ansi_buf[k] = '\0';
+ s = expand(&ansi_buf[j]);
+ if (char_count + expand_chars >= columns)
+ put_str("\r\n ");
+ put_str(s);
+ }
+ }
+ put_crlf();
+ }
+ /* calculate the valid attributes */
+ ptext("Valid attributes: 0");
+ j = 0;
+ for (i = 1; i < 20; i++) {
+ sprintf(temp, "\033[0;%dm\033P$qm\033\\", i);
+ tc_putp(temp);
+ (void) valid_mode('m');
+ if (ape > 0) {
+ j = i;
+ sprintf(temp, "\033[0m; %d", i);
+ tc_putp(temp);
+ }
+ }
+ put_crlf();
+ /* calculate how many parameters can be sent */
+ ptext("Max number of parameters: ");
+ sprintf(temp, "%dm\033P$qm\033\\", j);
+ l = -1;
+ if (j > 0)
+ for (l = 1; l < 33; l++) {
+ tc_putp("\033[0");
+ for (ch = 1; ch <= l; ch++)
+ put_this(';');
+ tc_putp(temp);
+ (void) valid_mode('m');
+ if (ape == 0)
+ break;
+ }
+ tc_putp("\033[m");
+ if (l >= 0) {
+ sprintf(temp, "%d", l);
+ ptext(temp);
+ } else
+ ptext("unknown");
+ put_crlf();
+ return wait_here();
+}
+
+/*
+** mode_display(puc, mode, initial, set, reset)
+**
+** print the mode display entry
+*/
+static void
+mode_display(const char *p, int n, int c, char s, char r)
+{
+ int k;
+
+ sprintf(temp, "%s%d (%c, %c, %c)", p, n, c, s, r);
+ k = strlen(temp);
+ if (char_count + k >= columns)
+ put_crlf();
+ for (; k < 14; k++)
+ putchp(' ');
+ put_str(temp);
+}
+
+/*
+** terminal_state()
+**
+** test DECRQM status reports
+*/
+static void
+terminal_state(void)
+{
+ static const char *puc[] = {"", "<", "=", ">", "?", 0};
+
+ int i, j, k, l, modes_found;
+ char *s;
+ char buf[256], tms[256];
+ int mode_puc[MAX_MODES], mode_number[MAX_MODES];
+ char set_value[MAX_MODES], reset_value[MAX_MODES];
+ char current_value[MAX_MODES];
+
+ ptext("Testing terminal mode status. (CSI 0 $ p)");
+ tc_putp("\033[0$p");
+ modes_found = 0;
+ tms[0] = '\0';
+ if (valid_mode(('$' << 8) | 'y')) {
+ for (i = 0; puc[i]; i++) {
+ put_crlf();
+ if (i) {
+ sprintf(temp, "Private use: %c", puc[i][0]);
+ } else {
+ strcpy(temp, "Standard modes:");
+ }
+ k = strlen(temp);
+ ptext(temp);
+ for (j = 0; j < (int) sizeof(buf); buf[j++] = ' ')
+ ;
+ for (j = l = 0; j < 255 && j - l < 50; j++) {
+ sprintf(temp, "\033[%s%d$p", puc[i], j);
+ tc_putp(temp);
+ if (!valid_mode(('$' << 8) | 'y')) {
+ /* not valid, save terminating value */
+ s = expand(ansi_buf);
+ sprintf(tms, "%s%s%d %s ", tms,
+ puc[i], j, s);
+ break;
+ }
+ if (private_use != puc[i][0])
+ break;
+ if (ansi_value[0] != j)
+ break;
+ if (ansi_value[1]) {
+ l = j;
+ if (k > 70) {
+ buf[k] = '\0';
+ put_crlf();
+ ptextln(buf);
+ for (k = 0; k < (int) sizeof(buf);) {
+ buf[k++] = ' ';
+ }
+ k = 0;
+ }
+ sprintf(temp, " %d", j);
+ ptext(temp);
+ k += strlen(temp);
+ buf[k - 1] = ansi_value[1] + '0';
+ if (modes_found >= MAX_MODES)
+ continue;
+ current_value[modes_found] =
+ ansi_value[1] + '0';
+ /* some modes never return */
+ if ((i == 0 && j == 13) /* control execution */
+ || (puc[i][0] == '?' && j == 2)) /* VT52 */
+ set_value[modes_found] =
+ reset_value[modes_found] = '-';
+ else
+ set_value[modes_found] =
+ reset_value[modes_found] = ' ';
+ mode_puc[modes_found] = i;
+ mode_number[modes_found++] = j;
+ }
+ }
+ buf[k] = '\0';
+ if (buf[k - 1] != ' ') {
+ put_crlf();
+ ptext(buf);
+ }
+ }
+
+ if ((i = modes_found) != 0) {
+ put_crlf();
+ put_crlf();
+ if (tms[0]) {
+ ptextln(tms);
+ }
+ ptext("Hit 'Y' to test mode set/reset states: ");
+ i = wait_here();
+ }
+ if (i == 'y' || i == 'Y')
+ while (1) {
+#ifdef STATUSFIX
+ FILE *fp;
+
+#ifdef TEDANSI
+ fp = fopen("ted.ansi", "w");
+#else
+ fp = fopen("/dev/console", "w");
+#endif
+#endif
+ for (i = j = 0; j < modes_found; j = ++i >> 1) {
+ if (set_value[j] == '-')
+ continue;
+ k = (current_value[j] ^ i) & 1;
+ sprintf(temp, "\033[%s%d%c\033[%s%d$p",
+ puc[mode_puc[j]], mode_number[j],
+ k ? 'l' : 'h',
+ puc[mode_puc[j]], mode_number[j]);
+#ifdef STATUSFIX
+ if (fp) {
+ fprintf(fp, "%s\n", expand(temp));
+ fflush(fp);
+ }
+#endif
+ tc_putp(temp);
+ if (!valid_mode(('$' << 8) | 'y'))
+ continue;
+ if (k) {
+ reset_value[j] = ansi_value[1] + '0';
+ } else {
+ set_value[j] = ansi_value[1] + '0';
+ }
+ }
+ put_str("\033[30l"); /* added for GORT bug
+ (WY-185) */
+#ifdef STATUSFIX
+ if (fp)
+ fclose(fp);
+#endif
+ tty_set();
+ /* print the results */
+ put_clear();
+ putln("mode (initial, set, reset)");
+ for (j = 0; j < modes_found; j++) {
+ mode_display(puc[mode_puc[j]], mode_number[j],
+ current_value[j], set_value[j], reset_value[j]);
+ }
+ ptext("\n\nHit 'R' to repeat test. 'S' to sort results: ");
+ i = wait_here();
+ if (i == 's' || i == 'S') { /* print the same stuff,
+ sorted by
+ current_value */
+ put_crlf();
+ for (i = '1'; i <= '4'; i++) {
+ for (j = 0; j < modes_found; j++) {
+ if (current_value[j] == i)
+ mode_display(puc[mode_puc[j]],
+ mode_number[j], current_value[j],
+ set_value[j], reset_value[j]);
+ }
+ }
+ ptext("\n\nHit 'R' to repeat test: ");
+ i = wait_here();
+ }
+ if (i != 'r' && i != 'R')
+ break;
+ tty_raw(1, char_mask);
+ }
+ } else {
+ tty_set();
+ }
+}
+
+
+/*
+** ansi_report_help()
+**
+** Display the informational data for the ANSI report test.
+*/
+static void
+ansi_report_help(void)
+{
+ ptext("Begin ANSI status report testing. ");
+ ptext(" Parity bit set will be displayed in reverse video. ");
+ ptext(" If the terminal hangs, hit any alphabetic key. ");
+ ptextln(" Use c to continue testing. Use any other letter to quit.");
+ put_crlf();
+}
+
+/*
+** test_ansi_reports()
+**
+** Test the ANSI status report functions
+*/
+void
+tools_status(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ int i;
+
+ put_clear();
+ ansi_report_help();
+ tty_raw(1, char_mask);
+
+ do {
+ i = read_reports();
+ if (i != 'r' && i != 'R') {
+ *ch = i;
+ return;
+ }
+ } while (i);
+
+ if (terminal_class >= 63) {
+ do {
+ i = request_cfss();
+ } while (i == 'r' || i == 'R');
+ *ch = i;
+ terminal_state();
+ } else {
+ tty_set();
+ }
+}
+
+
+/*
+** display_sgr()
+**
+** Test a range of ANSI sgr attributes
+** puc -> Private Use Character
+*/
+static void
+display_sgr(int puc)
+{
+ int k;
+
+ temp[0] = puc;
+ temp[1] = '\0';
+ for (k = 0; k < 80; k++) {
+ if (char_count + 8 > 80)
+ put_crlf();
+ else if (char_count + 8 > columns)
+ put_crlf();
+ else if (k > 0)
+ printf(" ");
+ printf("\033[%s%dmMode %2d\033[0m", temp, k, k);
+ char_count += 8;
+ if (puc == '\0') {
+ if (k == 19)
+ printf("\033[10m");
+ if (k == 39)
+ printf("\033[37m");
+ if (k == 49)
+ printf("\033[40m");
+ }
+ }
+ put_crlf();
+ if (puc == '<')
+ printf("\033[<1m");
+ else if (puc)
+ printf("\033[%s0m", temp);
+ set_attr(0);
+}
+
+/*
+** print_sgr20(on, off)
+**
+** print the sgr line for sgr20()
+*/
+static void
+print_sgr20(int on, int off)
+{
+ if (char_count > columns - 13) {
+ put_crlf();
+ } else if (char_count) {
+ put_str(" ");
+ }
+ char_count += 11;
+ printf("%d/%d \033[%dmon\033[%dm off\033[0m", on, off, on, off);
+}
+
+/*
+** sgr20(void)
+**
+** display the enter/exit attributes 1-9 and 20-29
+*/
+static void
+sgr20(void)
+{
+ int k;
+
+ put_crlf();
+ ptextln("Test enter/exit attributes 1-9 and 21-29.");
+ for (k = 1; k < 10; k++) {
+ print_sgr20(k, k + 20);
+ }
+ print_sgr20(1, 22); /* bold */
+ print_sgr20(2, 22); /* dim */
+ print_sgr20(8, 22); /* blank */
+ printf("\033[0m");
+ set_attr(0);
+}
+
+/*
+** tools_sgr(testlist, state, ch)
+**
+** Run the ANSI graphics rendition mode tool
+** Return the last character typed.
+*/
+void
+tools_sgr(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ int k;
+
+ put_clear();
+ for (k = 0;;) {
+ display_sgr(k);
+ put_crlf();
+ menu_prompt();
+ ptext("/sgr Enter =><?r [<cr>] > ");
+ k = wait_here();
+ if ((k == 'r') || (k == 'R')) {
+ k = 0;
+ } else if ((k < '<') || (k > '?')) {
+ break;
+ }
+ }
+ sgr20();
+
+ put_newlines(2);
+ *ch = REQUEST_PROMPT;
+}
+
+/*****************************************************************************
+ *
+ * Test ANSI graphics
+ *
+ *****************************************************************************/
+/*
+** select_bank(bank)
+**
+** select a graphics character set for ANSI terminals
+*/
+static void
+select_bank(char *bank)
+{
+ tc_putp(bank);
+ switch (bank[1] & 3) {
+ case 0:
+ putchp('O' & 0x1f); /* control O */
+ break;
+ case 1:
+ putchp('N' & 0x1f); /* control N */
+ tc_putp("\033~");
+ break;
+ case 2:
+ tc_putp("\033n\033}");
+ break;
+ case 3:
+ tc_putp("\033o\033|");
+ break;
+ }
+}
+
+/*
+** show_characters(bank, bias)
+**
+** print the ANSI graphics characters
+*/
+static void
+show_characters(char *bank, int bias)
+{
+ int i;
+
+ sprintf(temp, "G%d GL ", bank[1] & 3);
+ ptext(temp);
+ select_bank(bank);
+ for (i = ' '; i < 0x80; i++) {
+ if (char_count >= columns ||
+ (i != ' ' && (i & 31) == 0))
+ put_str("\n ");
+ putchp(i + bias);
+ }
+ select_bank(default_bank);
+ put_str(" DEL <");
+ select_bank(bank);
+ putchp(0x7f + bias);
+ select_bank(default_bank);
+ putchp('>');
+ put_crlf();
+ put_crlf();
+}
+
+
+/* ANSI graphics test
+ 94 96 character sets
+ G0 ( ,
+ G1 ) -
+ G2 * .
+ G3 + /
+
+Standard Definitions
+ A UK
+ B US ASCII
+
+Dec extended definitions
+ 0 Special graphics
+
+ */
+
+/*
+** tools_charset(testlist, state, ch)
+**
+** Run the ANSI alt-charset mode tool
+*/
+void
+tools_charset(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *chp GCC_UNUSED)
+{
+ int j, ch;
+ char bank[32];
+
+ put_clear();
+ ptext("Enter the bank ()*+,-./ followed by the character set");
+ ptext(" 0123456789:;<=>? for private use, and");
+ ptextln(" @A...Z[\\]^_`a...z{|}~ for standard sets.");
+ strcpy(bank, "\033)0");
+ for (; bank[0];) {
+ put_crlf();
+ show_characters(bank, 0);
+
+ /* G0 will not print in GR */
+ if (bank[1] & 3) {
+ show_characters(bank, 0x80);
+ }
+ ptext("bank+set> ");
+ for (j = 1; (ch = getchp(char_mask)); j++) {
+ if (ch == EOF)
+ break;
+ putchp(ch);
+ if (j == 1 && ch > '/')
+ j++;
+ bank[j] = ch;
+ if (ch < ' ' || ch > '/')
+ break;
+ if (j + 1 >= (int) sizeof(bank))
+ break;
+ }
+ if (j == 1)
+ break;
+ if (bank[j] < '0' || bank[j] > '~')
+ break;
+ bank[j + 1] = '\0';
+ }
+ put_crlf();
+}
diff --git a/contrib/ncurses/tack/charset.c b/contrib/ncurses/tack/charset.c
new file mode 100644
index 000000000000..c31b78b56863
--- /dev/null
+++ b/contrib/ncurses/tack/charset.c
@@ -0,0 +1,709 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: charset.c,v 1.2 1999/05/09 18:30:49 tom Exp $")
+
+/*
+ Menu definitions for alternate character set and SGR tests.
+*/
+
+static void charset_bel(struct test_list *t, int *state, int *ch);
+static void charset_flash(struct test_list *t, int *state, int *ch);
+static void charset_civis(struct test_list *t, int *state, int *ch);
+static void charset_cvvis(struct test_list *t, int *state, int *ch);
+static void charset_cnorm(struct test_list *t, int *state, int *ch);
+static void charset_hs(struct test_list *t, int *state, int *ch);
+static void charset_status(struct test_list *t, int *state, int *ch);
+static void charset_dsl(struct test_list *t, int *state, int *ch);
+static void charset_enacs(struct test_list *t, int *state, int *ch);
+static void charset_smacs(struct test_list *t, int *state, int *ch);
+static void charset_attributes(struct test_list *t, int *state, int *ch);
+static void charset_sgr(struct test_list *t, int *state, int *ch);
+
+const struct test_list acs_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {MENU_NEXT, 3, "bel", 0, 0, charset_bel, 0},
+ {MENU_NEXT, 3, "flash", 0, 0, charset_flash, 0},
+ {MENU_NEXT, 3, "civis", 0, 0, charset_civis, 0},
+ {MENU_NEXT, 3, "cvvis", 0, 0, charset_cvvis, 0},
+ {MENU_NEXT, 3, "cnorm", 0, 0, charset_cnorm, 0},
+ {MENU_NEXT, 3, "hs", 0, 0, charset_hs, 0},
+ {MENU_NEXT, 3, "tsl) (fsl) (wsl", "hs", 0, charset_status, 0},
+ {MENU_NEXT, 3, "dsl", "hs", 0, charset_dsl, 0},
+ {MENU_NEXT, 0, "acsc) (enacs) (smacs) (rmacs", 0, 0, charset_enacs, 0},
+ {MENU_NEXT, 0, "smacs) (rmacs", 0, 0, charset_smacs, 0},
+ {MENU_NEXT, 11, 0, 0, 0, charset_attributes, 0},
+ {MENU_NEXT, 11, "sgr) (sgr0", "ma", 0, charset_sgr, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+const struct mode_list alt_modes[] = {
+ {"normal", "(sgr0)", "(sgr0)", 1},
+ {"standout", "(smso)", "(rmso)", 2},
+ {"underline", "(smul)", "(rmul)", 4},
+ {"reverse", "(rev)", "(sgr0)", 8},
+ {"blink", "(blink)", "(sgr0)", 16},
+ {"dim", "(dim)", "(sgr0)", 32},
+ {"bold", "(bold)", "(sgr0)", 64},
+ {"invis", "(invis)", "(sgr0)", 128},
+ {"protect", "(prot)", "(sgr0)", 256},
+ {"altcharset", "(smacs)", "(rmacs)", 512}
+};
+
+/* On many terminals the underline attribute is the last scan line.
+ This is OK unless the following line is reverse video.
+ Then the underline attribute does not show up. The following map
+ will reorder the display so that the underline attribute will
+ show up. */
+const int mode_map[10] = {0, 1, 3, 4, 5, 6, 7, 8, 9, 2};
+
+struct graphics_pair {
+ unsigned char c;
+ const char *name;
+};
+
+static struct graphics_pair glyph[] = {
+ {'+', "arrow pointing right"},
+ {',', "arrow pointing left"},
+ {'.', "arrow pointing down"},
+ {'0', "solid square block"},
+ {'i', "lantern symbol"},
+ {'-', "arrow pointing up"},
+ {'`', "diamond"},
+ {'a', "checker board (stipple)"},
+ {'f', "degree symbol"},
+ {'g', "plus/minus"},
+ {'h', "board of squares"},
+ {'j', "lower right corner"},
+ {'k', "upper right corner"},
+ {'l', "upper left corner"},
+ {'m', "lower left corner"},
+ {'n', "plus"},
+ {'o', "scan line 1"},
+ {'p', "scan line 3"},
+ {'q', "horizontal line"},
+ {'r', "scan line 7"},
+ {'s', "scan line 9"},
+ {'t', "left tee (|-)"},
+ {'u', "right tee (-|)"},
+ {'v', "bottom tee(_|_)"},
+ {'w', "top tee (T)"},
+ {'x', "vertical line"},
+ {'y', "less/equal"},
+ {'z', "greater/equal"},
+ {'{', "Pi"},
+ {'|', "not equal"},
+ {'}', "UK pound sign"},
+ {'~', "bullet"},
+ {'\0', "\0"}
+};
+
+/*
+** charset_hs(test_list, status, ch)
+**
+** (hs) test Has status line
+*/
+static void
+charset_hs(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (has_status_line != 1) {
+ ptext("(hs) Has-status line is not defined. ");
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** charset_status(test_list, status, ch)
+**
+** (tsl) (fsl) (wsl) test Status line
+*/
+static void
+charset_status(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, max;
+ char *s;
+ static char m[] = "*** status line *** 123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789.";
+
+ if (has_status_line != 1) {
+ return;
+ }
+ put_clear();
+ max = width_status_line == -1 ? columns : width_status_line;
+ sprintf(temp, "Terminal has status line of %d characters", max);
+ ptextln(temp);
+
+ put_str("This line s");
+ s = tparm(to_status_line, 0);
+ tc_putp(s);
+ for (i = 0; i < max; i++)
+ putchp(m[i]);
+ tc_putp(from_status_line);
+ putln("hould not be broken.");
+ ptextln("If the previous line is not a complete sentence then (tsl) to-status-line, (fsl) from-status-line, or (wsl) width-of-status-line is incorrect." );
+ generic_done_message(t, state, ch);
+}
+
+/*
+** charset_dsl(test_list, status, ch)
+**
+** (dsl) test Disable status line
+*/
+static void
+charset_dsl(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (has_status_line != 1) {
+ return;
+ }
+ if (dis_status_line) {
+ ptextln("Disable status line (dsl)");
+ tc_putp(dis_status_line);
+ ptext("If you can still see the status line then (dsl) disable-status-line has failed. ");
+ } else {
+ ptext("(dsl) Disable-status-line is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+
+void
+eat_cookie(void)
+{ /* put a blank if this is not a magic cookie
+ terminal */
+ if (magic_cookie_glitch < 1)
+ putchp(' ');
+}
+
+
+void
+put_mode(char *s)
+{ /* send the attribute string (with or without
+ % execution) */
+ tc_putp(tparm(s)); /* allow % execution */
+}
+
+
+void
+set_attr(int a)
+{ /* set the attribute from the bits in a */
+ int i, b[32];
+
+ if (magic_cookie_glitch > 0) {
+ char_count += magic_cookie_glitch;
+ }
+ if (a == 0 && exit_attribute_mode) {
+ put_mode(exit_attribute_mode);
+ return;
+ }
+ for (i = 0; i < 31; i++) {
+ b[i] = (a >> i) & 1;
+ }
+ tc_putp(tparm(set_attributes, b[1], b[2], b[3], b[4], b[5],
+ b[6], b[7], b[8], b[9]));
+}
+
+/*
+** charset_sgr(test_list, status, ch)
+**
+** (sgr) test Set Graphics Rendition
+*/
+static void
+charset_sgr(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!set_attributes) {
+ ptext("(sgr) Set-graphics-rendition is not defined. ");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ if (!exit_attribute_mode) {
+ ptextln("(sgr0) Set-graphics-rendition-zero is not defined.");
+ /* go ahead and test anyway */
+ }
+ ptext("Test video attributes (sgr)");
+
+ for (i = 0; i < (int) (sizeof(alt_modes) / sizeof(struct mode_list));
+ i++) {
+ put_crlf();
+ sprintf(temp, "%d %-20s", i, alt_modes[i].name);
+ put_str(temp);
+ set_attr(alt_modes[i].number);
+ sprintf(temp, "%s", alt_modes[i].name);
+ put_str(temp);
+ set_attr(0);
+ }
+
+ putln("\n\nDouble mode test");
+ for (i = 0; i <= 9; i++) {
+ sprintf(temp, " %2d ", mode_map[i]);
+ put_str(temp);
+ }
+ for (i = 0; i <= 9; i++) {
+ put_crlf();
+ sprintf(temp, "%d", mode_map[i]);
+ put_str(temp);
+ for (j = 0; j <= 9; j++) {
+ eat_cookie();
+ set_attr((1 << mode_map[i]) | (1 << mode_map[j]));
+ put_str("Aa");
+ set_attr(0);
+ if (j < 9)
+ eat_cookie();
+ }
+ }
+ put_crlf();
+
+ if (max_attributes >= 0) {
+ sprintf(temp, "(ma) Maximum attributes %d ", max_attributes);
+ ptext(temp);
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** test_one_attr(mode-number, begin-string, end-string)
+**
+** Display one attribute line.
+*/
+static void
+test_one_attr(
+ int n,
+ char *begin_mode,
+ char *end_mode)
+{
+ int i;
+
+ sprintf(temp, "%-10s %s ", alt_modes[n].name, alt_modes[n].begin_mode);
+ ptext(temp);
+ for (; char_count < 19;) {
+ putchp(' ');
+ }
+ if (begin_mode) {
+ putchp('.');
+ put_mode(begin_mode);
+ put_str(alt_modes[n].name);
+ for (i = strlen(alt_modes[n].name); i < 13; i++) {
+ putchp(' ');
+ }
+ if (end_mode) {
+ put_mode(end_mode);
+ sprintf(temp, ". %s", alt_modes[n].end_mode);
+ } else {
+ set_attr(0);
+ strcpy(temp, ". (sgr)");
+ }
+ ptextln(temp);
+ } else {
+ for (i = 0; i < magic_cookie_glitch; i++)
+ putchp('*');
+ put_str("*** missing ***");
+ for (i = 0; i < magic_cookie_glitch; i++)
+ putchp('*');
+ put_crlf();
+ }
+}
+
+/*
+** charset_attributes(test_list, status, ch)
+**
+** Test SGR
+*/
+static void
+charset_attributes(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ putln("Test video attributes");
+ test_one_attr(1, enter_standout_mode, exit_standout_mode);
+ test_one_attr(2, enter_underline_mode, exit_underline_mode);
+ test_one_attr(9, enter_alt_charset_mode, exit_alt_charset_mode);
+ if (!exit_attribute_mode && !set_attributes) {
+ ptextln("(sgr0) exit attribute mode is not defined.");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ test_one_attr(3, enter_reverse_mode, exit_attribute_mode);
+ test_one_attr(4, enter_blink_mode, exit_attribute_mode);
+ test_one_attr(5, enter_dim_mode, exit_attribute_mode);
+ test_one_attr(6, enter_bold_mode, exit_attribute_mode);
+ test_one_attr(7, enter_secure_mode, exit_attribute_mode);
+ test_one_attr(8, enter_protected_mode, exit_attribute_mode);
+ generic_done_message(t, state, ch);
+}
+
+#define GLYPHS 256
+
+/*
+** charset_smacs(test_list, status, ch)
+**
+** display all posible acs characters
+** (smacs) (rmacs)
+*/
+static void
+charset_smacs(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, c;
+
+ if (enter_alt_charset_mode) {
+ put_clear();
+ ptextln("The following characters are available. (smacs) (rmacs)");
+ for (i = ' '; i <= '`'; i += 32) {
+ put_crlf();
+ put_mode(exit_alt_charset_mode);
+ for (c = 0; c < 32; c++) {
+ putchp(c + i);
+ }
+ put_crlf();
+ put_mode(enter_alt_charset_mode);
+ for (c = 0; c < 32; c++) {
+ putchp(c + i);
+ }
+ put_mode(exit_alt_charset_mode);
+ put_crlf();
+ }
+ put_mode(exit_alt_charset_mode);
+ put_crlf();
+ generic_done_message(t, state, ch);
+ }
+}
+
+
+static void
+test_acs(
+ int attr)
+{ /* alternate character set */
+ int i, j;
+ char valid_glyph[GLYPHS];
+ char acs_table[GLYPHS];
+ static unsigned char vt100[] = "`afgjklmnopqrstuvwxyz{|}~";
+
+ line_count = 0;
+ for (i = 0; i < GLYPHS; i++) {
+ valid_glyph[i] = FALSE;
+ acs_table[i] = i;
+ }
+ if (acs_chars) {
+ sprintf(temp, "Alternate character set map: %s",
+ expand(acs_chars));
+ putln(temp);
+ for (i = 0; acs_chars[i]; i += 2) {
+ if (acs_chars[i + 1] == 0) {
+ break;
+ }
+ for (j = 0;; j++) {
+ if (glyph[j].c == (unsigned char) acs_chars[i]) {
+ acs_table[glyph[j].c] = acs_chars[i + 1];
+ valid_glyph[glyph[j].c] = TRUE;
+ break;
+ }
+ if (glyph[j].name[0] == '\0') {
+ if (isgraph(acs_chars[i])) {
+ sprintf(temp, " %c",
+ acs_chars[i]);
+ } else {
+ sprintf(temp, " 0x%02x",
+ (acs_chars[i] & 0xff));
+ }
+ strcpy(&temp[5], " *** has no mapping ***");
+ putln(temp);
+ break;
+ }
+ }
+ }
+ } else {
+ ptextln("acs_chars not defined (acsc)");
+ /* enable the VT-100 graphics characters (default) */
+ for (i = 0; vt100[i]; i++) {
+ valid_glyph[vt100[i]] = TRUE;
+ }
+ }
+ if (attr) {
+ set_attr(attr);
+ }
+ _nc_init_acs(); /* puts 'ena_acs' and incidentally links acs_map[] */
+ for (i = 0; glyph[i].name[0]; i++) {
+ if (valid_glyph[glyph[i].c]) {
+ put_mode(enter_alt_charset_mode);
+ put_this(acs_table[glyph[i].c]);
+ char_count++;
+ put_mode(exit_alt_charset_mode);
+ if (magic_cookie_glitch >= 1) {
+ sprintf(temp, " %-30.30s", glyph[i].name);
+ put_str(temp);
+ if (char_count + 33 >= columns)
+ put_crlf();
+ } else {
+ sprintf(temp, " %-24.24s", glyph[i].name);
+ put_str(temp);
+ if (char_count + 26 >= columns)
+ put_crlf();
+ }
+ if (line_count >= lines) {
+ (void) wait_here();
+ put_clear();
+ }
+ }
+ }
+ if (char_count > 1) {
+ put_crlf();
+ }
+#ifdef ACS_ULCORNER
+ maybe_wait(5);
+ put_mode(enter_alt_charset_mode);
+ put_this(ACS_ULCORNER);
+ put_this(ACS_TTEE);
+ put_this(ACS_URCORNER);
+ put_this(ACS_ULCORNER);
+ put_this(ACS_HLINE);
+ put_this(ACS_URCORNER);
+ char_count += 6;
+ put_mode(exit_alt_charset_mode);
+ put_crlf();
+ put_mode(enter_alt_charset_mode);
+ put_this(ACS_LTEE);
+ put_this(ACS_PLUS);
+ put_this(ACS_RTEE);
+ put_this(ACS_VLINE);
+ if (magic_cookie_glitch >= 1)
+ put_this(' ');
+ else {
+ put_mode(exit_alt_charset_mode);
+ put_this(' ');
+ put_mode(enter_alt_charset_mode);
+ }
+ put_this(ACS_VLINE);
+ char_count += 6;
+ put_mode(exit_alt_charset_mode);
+ put_str(" Here are 2 boxes");
+ put_crlf();
+ put_mode(enter_alt_charset_mode);
+ put_this(ACS_LLCORNER);
+ put_this(ACS_BTEE);
+ put_this(ACS_LRCORNER);
+ put_this(ACS_LLCORNER);
+ put_this(ACS_HLINE);
+ put_this(ACS_LRCORNER);
+ char_count += 6;
+ put_mode(exit_alt_charset_mode);
+ put_crlf();
+#endif
+}
+
+/*
+** charset_bel(test_list, status, ch)
+**
+** (bel) test Bell
+*/
+static void
+charset_bel(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (bell) {
+ ptextln("Testing bell (bel)");
+ tc_putp(bell);
+ ptext("If you did not hear the Bell then (bel) has failed. ");
+ } else {
+ ptext("(bel) Bell is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** charset_flash(test_list, status, ch)
+**
+** (flash) test Visual bell
+*/
+static void
+charset_flash(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (flash_screen) {
+ ptextln("Testing visual bell (flash)");
+ tc_putp(flash_screen);
+ ptext("If you did not see the screen flash then (flash) has failed. ");
+ } else {
+ ptext("(flash) Flash is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** charset_civis(test_list, status, ch)
+**
+** (civis) test Cursor invisible
+*/
+static void
+charset_civis(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (cursor_normal) {
+ if (cursor_invisible) {
+ ptext("(civis) Turn off the cursor. ");
+ tc_putp(cursor_invisible);
+ ptext("If you can still see the cursor then (civis) has failed. ");
+ } else {
+ ptext("(civis) Cursor-invisible is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+ tc_putp(cursor_normal);
+ }
+}
+
+/*
+** charset_cvvis(test_list, status, ch)
+**
+** (cvvis) test Cursor very visible
+*/
+static void
+charset_cvvis(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (cursor_normal) {
+ if (cursor_visible) {
+ ptext("(cvvis) Make cursor very visible. ");
+ tc_putp(cursor_visible);
+ ptext("If the cursor is not very visible then (cvvis) has failed. ");
+ } else {
+ ptext("(cvvis) Cursor-very-visible is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+ tc_putp(cursor_normal);
+ }
+}
+
+/*
+** charset_cnorm(test_list, status, ch)
+**
+** (cnorm) test Cursor normal
+*/
+static void
+charset_cnorm(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (cursor_normal) {
+ ptext("(cnorm) Normal cursor. ");
+ tc_putp(cursor_normal);
+ ptext("If the cursor is not normal then (cnorm) has failed. ");
+ } else {
+ ptext("(cnorm) Cursor-normal is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** charset_enacs(test_list, status, ch)
+**
+** test Alternate character set mode and alternate characters
+** (acsc) (enacs) (smacs) (rmacs)
+*/
+static void
+charset_enacs(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int c, i;
+
+ if (enter_alt_charset_mode || acs_chars) {
+ c = 0;
+ while (1) {
+ put_clear();
+ /*
+ for terminals that use separate fonts for
+ attributes (such as X windows) the line
+ drawing characters must be checked for
+ each font.
+ */
+ if (c >= '0' && c <= '9') {
+ test_acs(alt_modes[c - '0'].number);
+ set_attr(0);
+ } else {
+ test_acs(0);
+ }
+
+ while (1) {
+ ptextln("[r] to repeat, [012345789] to test with attributes on, [?] for a list of attributes, anything else to go to next test. ");
+ generic_done_message(t, state, ch);
+ if (*ch != '?') {
+ break;
+ }
+ for (i = 0; i <= 9; i++) {
+ sprintf(temp, " %d %s %s", i, alt_modes[i].begin_mode,
+ alt_modes[i].name);
+ ptextln(temp);
+ }
+ }
+ if (*ch >= '0' && *ch <= '9') {
+ c = *ch;
+ } else
+ if (*ch != 'r') {
+ break;
+ }
+ }
+ } else {
+ ptext("(smacs) Enter-alt-char-set-mode and (acsc) Alternate-char-set are not defined. ");
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** charset_can_test()
+**
+** Initialize the can_test data base
+*/
+void
+charset_can_test(void)
+{
+ int i;
+
+ for (i = 0; i < 9; i++) {
+ can_test(alt_modes[i].begin_mode, FLAG_CAN_TEST);
+ can_test(alt_modes[i].end_mode, FLAG_CAN_TEST);
+ }
+}
diff --git a/contrib/ncurses/tack/color.c b/contrib/ncurses/tack/color.c
new file mode 100644
index 000000000000..710538aef48c
--- /dev/null
+++ b/contrib/ncurses/tack/color.c
@@ -0,0 +1,767 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: color.c,v 1.1 1999/04/18 01:24:45 tom Exp $")
+
+/*
+ * Color terminal tests. Has only one entry point: test_color().
+ */
+
+static void color_check(struct test_list *, int *, int *);
+static void color_setf(struct test_list *, int *, int *);
+static void color_matrix(struct test_list *, int *, int *);
+static void color_ncv(struct test_list *, int *, int *);
+static void color_ccc(struct test_list *, int *, int *);
+static void color_bce(struct test_list *, int *, int *);
+
+struct test_list color_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {MENU_NEXT, 2, "colors) (pairs", 0, 0, color_check, 0},
+ {MENU_NEXT, 12, "setf) (setb) (scp", 0, 0, color_setf, 0},
+ {MENU_NEXT, 24, "op", 0, 0, color_matrix, 0},
+ {MENU_NEXT, 16, "ncv", 0, 0, color_ncv, 0},
+ {MENU_NEXT, 0, "bce", 0, 0, color_bce, 0},
+ {MENU_NEXT | MENU_CLEAR, 0, "ccc) (initc) (initp", "hls op oc", 0, color_ccc, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+#ifndef COLOR_BLACK
+#define COLOR_BLACK 0
+#define COLOR_BLUE 1
+#define COLOR_GREEN 2
+#define COLOR_CYAN 3
+#define COLOR_RED 4
+#define COLOR_MAGENTA 5
+#define COLOR_YELLOW 6
+#define COLOR_WHITE 7
+#endif
+
+struct color_table {
+ const char *name;
+ int index;
+ int r, g, b;
+ int h, l, s;
+};
+
+static struct color_table def_colors[8] = {
+ {"black ", COLOR_BLACK, 0, 0, 0, 0, 0, 0},
+ {"blue ", COLOR_BLUE, 0, 0, 1000, 330, 50, 100},
+ {"green ", COLOR_GREEN, 0, 1000, 0, 240, 50, 100},
+ {"cyan ", COLOR_CYAN, 0, 1000, 1000, 300, 50, 100},
+ {"red ", COLOR_RED, 1000, 0, 0, 120, 50, 100},
+ {"magenta", COLOR_MAGENTA, 1000, 0, 1000, 60, 50, 100},
+ {"yellow ", COLOR_YELLOW, 1000, 1000, 0, 180, 50, 100},
+ {"white ", COLOR_WHITE, 1000, 1000, 1000, 0, 100, 0}
+};
+
+#define MAX_PAIR 256
+static int fg_color[MAX_PAIR] = {COLOR_BLACK, COLOR_BLUE, COLOR_GREEN,
+COLOR_CYAN, COLOR_RED, COLOR_MAGENTA, COLOR_YELLOW, COLOR_WHITE};
+static int bg_color[MAX_PAIR] = {COLOR_BLACK, COLOR_BLACK, COLOR_BLACK,
+COLOR_BLACK, COLOR_BLACK, COLOR_BLACK, COLOR_BLACK, COLOR_BLACK};
+static int pairs_used = 8;
+static int a_bright_color, bright_value;
+static int cookie_monster, color_step, colors_per_line;
+static int R, G, B;
+
+static int
+color_trans(int c)
+{ /* translate or load the color */
+ int i;
+
+ for (i = 0; i < pairs_used; i++) {
+ if (fg_color[i] == c) {
+ return i;
+ }
+ }
+ if (!can_change) {
+ return 0;
+ }
+ if (pairs_used > max_colors || pairs_used >= MAX_PAIR) {
+ pairs_used = 0;
+ ptextln("Ran out of colors");
+ }
+ fg_color[pairs_used] = c;
+ bg_color[pairs_used] = c;
+ if (hue_lightness_saturation) {
+ tc_putp(tparm(initialize_color, pairs_used,
+ def_colors[c].h, def_colors[c].l, def_colors[c].s));
+ } else {
+ tc_putp(tparm(initialize_color, pairs_used,
+ def_colors[c].r, def_colors[c].g, def_colors[c].b));
+ }
+ return pairs_used++;
+}
+
+static void
+new_color(
+ int fg,
+ int bg,
+ int hungry)
+{ /* change the color to fg and bg. */
+ int i;
+
+ if (hungry) {
+ eat_cookie();
+ }
+ if (set_a_foreground) {
+ /* set ANSI color (setaf) (setab) */
+ tc_putp(tparm(set_a_foreground, fg));
+ tc_putp(tparm(set_a_background, bg));
+ } else if (set_foreground) {
+ /* make sure black is zero */
+ (void) color_trans(COLOR_BLACK);
+ tc_putp(tparm(set_foreground, color_trans(fg)));
+ tc_putp(tparm(set_background, color_trans(bg)));
+ } else { /* set color pair */
+ for (i = 0; i < pairs_used; i++) {
+ if (fg_color[i] == fg && bg_color[i] == bg) {
+ tc_putp(tparm(set_color_pair, i));
+ if (hungry) {
+ eat_cookie();
+ }
+ return;
+ }
+ }
+ if (!can_change) {
+ /* try to set just the foreground */
+ for (i = pairs_used - 1; i; i--) {
+ if (fg_color[i] == fg)
+ break;
+ }
+ tc_putp(tparm(set_color_pair, i));
+ if (hungry) {
+ eat_cookie();
+ }
+ return;
+ }
+ if (pairs_used > max_pairs || pairs_used >= MAX_PAIR) {
+ pairs_used = 0;
+ ptextln("Ran out of color pairs");
+ }
+ fg_color[pairs_used] = fg;
+ bg_color[pairs_used] = bg;
+ if (hue_lightness_saturation) {
+ tc_putp(tparm(initialize_pair, pairs_used,
+ def_colors[fg].h, def_colors[fg].l, def_colors[fg].s,
+ def_colors[bg].h, def_colors[bg].l, def_colors[bg].s));
+ } else {
+ tc_putp(tparm(initialize_pair, pairs_used,
+ def_colors[fg].r, def_colors[fg].g, def_colors[fg].b,
+ def_colors[bg].r, def_colors[bg].g, def_colors[bg].b));
+ }
+ tc_putp(tparm(set_color_pair, pairs_used));
+ pairs_used++;
+ }
+ if (hungry) {
+ eat_cookie();
+ }
+}
+
+
+static void
+set_color_step(void)
+{ /* set the color_step for the (ccc) display */
+ int i;
+
+ for (i = 2; i < 1000; i++) {
+ if ((i * i * i) >= max_colors) {
+ break;
+ }
+ }
+ color_step = 1000 / (i - 1);
+}
+
+
+static void
+rgb_2_hls(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;
+}
+
+
+static void
+send_color(int p, int r, int g, int b)
+{ /* send the initialize_color (initc) command */
+ int h, l, s;
+
+ if (hue_lightness_saturation) {
+ rgb_2_hls(r, g, b, &h, &l, &s);
+ tc_putp(tparm(initialize_color, p, h, l, s));
+ } else {
+ tc_putp(tparm(initialize_color, p, r, g, b));
+ }
+}
+
+
+static void
+send_pair(int p, int fr, int fg, int fb, int br, int bg, int bb)
+{ /* send the initialize_pair (initp) command */
+ int fh, fl, fs, bh, bl, bs;
+
+ if (hue_lightness_saturation) {
+ rgb_2_hls(fr, fg, fb, &fh, &fl, &fs);
+ rgb_2_hls(br, bg, bb, &bh, &bl, &bs);
+ tc_putp(tparm(initialize_pair, p, fh, fl, fs, bh, bl, bs));
+ } else {
+ tc_putp(tparm(initialize_pair, p, fr, fg, fb, bb, bg, bb));
+ }
+}
+
+
+static int
+load_palette(int n)
+{ /* load the color palette */
+ int rgb;
+
+ for (;;) {
+ if (pairs_used >= n) {
+ return FALSE;
+ }
+ if (set_a_foreground || set_foreground) {
+ if (pairs_used >= max_colors) {
+ return FALSE;
+ }
+ send_color(pairs_used, R, G, B);
+ rgb = R + G + B;
+ if (rgb > bright_value) {
+ bright_value = rgb;
+ a_bright_color = pairs_used;
+ }
+ } else {
+ if (pairs_used >= max_pairs) {
+ return FALSE;
+ }
+ if (pairs_used == 0) {
+ send_pair(pairs_used, 1000, 1000, 1000, R, G, B);
+ } else {
+ send_pair(pairs_used, R, G, B, R, G, B);
+ }
+ }
+ pairs_used++;
+ if ((B += color_step) > 1000) {
+ B = 0;
+ if ((G += color_step) > 1000) {
+ G = 0;
+ if ((R += color_step) > 1000) {
+ return TRUE;
+ }
+ }
+ }
+ }
+}
+
+
+static int
+rainbow(int n)
+{ /* print the programable color display */
+ int i, c, d, palette_full, initial_pair;
+ static const struct {
+ const char *name;
+ char ch;
+ } splat[] = {
+ {"Bg normal", ' '},
+ {"Fg normal", ' '},
+ {0, 0}
+ };
+
+ if ((set_a_foreground || set_foreground)
+ ? pairs_used >= max_colors
+ : pairs_used >= max_pairs) {
+ ptext("New palette: ");
+ (void) wait_here();
+ initial_pair = pairs_used = 1;
+ bright_value = 0;
+ } else if (line_count + 3 >= lines) {
+ ptext("Go: ");
+ (void) wait_here();
+ put_clear();
+ initial_pair = pairs_used = 1;
+ bright_value = 0;
+ n++;
+ } else {
+ initial_pair = pairs_used;
+ n += initial_pair;
+ }
+ palette_full = load_palette(n);
+ for (d = 0; splat[d].name; d++) {
+ c = splat[d].ch;
+ if (d == 1) {
+ put_mode(enter_reverse_mode);
+ }
+ for (i = initial_pair; i < n; i++) {
+ if (i >= pairs_used) {
+ break;
+ }
+ if (set_a_foreground) {
+ if (i >= max_colors) {
+ break;
+ }
+ tc_putp(tparm(set_a_foreground, i));
+ tc_putp(tparm(set_a_background, i));
+ } else if (set_foreground) {
+ if (i >= max_colors) {
+ break;
+ }
+ tc_putp(tparm(set_foreground, i));
+ tc_putp(tparm(set_background, i));
+ } else {
+ if (i >= max_pairs) {
+ break;
+ }
+ tc_putp(tparm(set_color_pair, i));
+ }
+ putchp(c);
+ }
+ if (d == 1) {
+ put_mode(exit_attribute_mode);
+ }
+ if (set_a_foreground) {
+ tc_putp(tparm(set_a_foreground, a_bright_color));
+ tc_putp(tparm(set_a_background, 0));
+ } else if (set_foreground) {
+ tc_putp(tparm(set_foreground, a_bright_color));
+ tc_putp(tparm(set_background, 0));
+ } else {
+ tc_putp(tparm(set_color_pair, 0));
+ }
+ put_str(" ");
+ put_str(splat[d].name);
+ put_crlf();
+ }
+ return palette_full;
+}
+
+
+static void
+ncv_display(int m)
+{ /* print the no_color_video (ncv) test line */
+ putchp('0' + m);
+ putchp(' ');
+ eat_cookie();
+ set_attr(1 << m);
+ sprintf(temp, "%-11s", alt_modes[m].name);
+ put_str(temp);
+
+ new_color(COLOR_BLUE, COLOR_BLACK, TRUE);
+ put_str("blue");
+
+ new_color(COLOR_BLACK, COLOR_GREEN, TRUE);
+ put_str("green");
+
+ new_color(COLOR_WHITE, COLOR_BLACK, TRUE);
+ put_str(alt_modes[m].name);
+ eat_cookie();
+ set_attr(0);
+ put_crlf();
+}
+
+
+static void
+dump_colors(void)
+{ /* display the colors in some esthetic
+ pattern */
+ static int xmap[8] = {0, 3, 4, 7, 1, 2, 5, 6};
+ int i, j, k, xi, xj, width, p, cs;
+ int found_one;
+
+ cs = color_step <= 125 ? 125 : color_step;
+ width = (1000 / cs) + 1;
+ for (xi = 0; xi < 16; xi++) {
+ i = (xi & 8) ? xi ^ 15 : xi;
+ R = i * cs;
+ if (R <= 1000) {
+ found_one = FALSE;
+ for (xj = 0; xj < 32; xj++) {
+ j = ((xj & 8) ? xj ^ 15 : xj) & 7;
+ k = xmap[((xi >> 1) & 4) + (xj >> 3)];
+ G = j * cs;
+ B = k * cs;
+ if (G <= 1000 && B <= 1000) {
+ p = (k * width + j) * width + i;
+ if (set_a_background) {
+ if (p >= max_colors) {
+ continue;
+ }
+ send_color(p, R, G, B);
+ tc_putp(tparm(set_a_background, p));
+ } else if (set_background) {
+ if (p >= max_colors) {
+ continue;
+ }
+ send_color(p, R, G, B);
+ tc_putp(tparm(set_background, p));
+ } else {
+ if (p >= max_pairs) {
+ continue;
+ }
+ send_pair(p, R, G, B, R, G, B);
+ tc_putp(tparm(set_color_pair, p));
+ }
+ found_one = TRUE;
+ putchp(' ');
+ putchp(' ');
+ }
+ }
+ if (found_one) {
+ put_crlf();
+ }
+ }
+ }
+}
+
+/*
+** color_check(test_list, status, ch)
+**
+** test (colors) and (pairs)
+*/
+static void
+color_check(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (max_colors <= 0 && max_pairs <= 0) {
+ ptext("This is not a color terminal; (colors) and (pairs) are missing. ");
+ *state |= MENU_STOP;
+ } else {
+ sprintf(temp, "This terminal can display %d colors and %d color pairs. (colors) (pairs)",
+ max_colors, max_pairs);
+ ptextln(temp);
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** color_setf(test_list, status, ch)
+**
+** test (setf) (setb) and (scp)
+*/
+static void
+color_setf(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (max_colors <= 0 && max_pairs <= 0) {
+ ptext("This is not a color terminal; (colors) and (pairs) are missing. ");
+ generic_done_message(t, state, ch);
+ *state |= MENU_STOP;
+ return;
+ }
+ if ((set_a_foreground == NULL || set_a_background == NULL)
+ && (set_foreground == NULL || set_background == NULL)
+ && set_color_pair == NULL) {
+ ptextln("Both set foreground (setaf/setf) and set color pair (scp) are not present.");
+ if (!set_a_background || !set_background) {
+ ptextln("(setab/setb) set background not present");
+ }
+ ptext("These must be defined for color testing. ");
+ generic_done_message(t, state, ch);
+ *state |= MENU_STOP;
+ return;
+ }
+ /* initialize the color palette */
+ pairs_used = max_colors >= 8 ? 8 : max_colors;
+ if (can_change) {
+ tc_putp(orig_colors);
+ }
+ tc_putp(tparm(orig_pair));
+ new_color(COLOR_WHITE, COLOR_BLACK, FALSE);
+
+ ptextln("(setf) (setb) (scp) The following colors are predefined:");
+ ptextln("\n Foreground Background");
+ put_crlf();
+ j = max_colors > 8 ? 8 : max_colors;
+ /*
+ the black on white test is the same as the white on black test.
+ */
+ for (i = 1; i < j; i++) {
+ putchp('0' + def_colors[i].index);
+ putchp(' ');
+ sprintf(temp, " %s ", def_colors[i].name);
+
+ new_color(def_colors[i].index, COLOR_BLACK, TRUE);
+ put_str(temp);
+
+ new_color(COLOR_BLACK, COLOR_BLACK, TRUE);
+ put_str(" ");
+
+ new_color(COLOR_BLACK, def_colors[i].index, TRUE);
+ put_str(temp);
+
+ new_color(COLOR_WHITE, COLOR_BLACK, FALSE);
+ put_crlf();
+ }
+ put_crlf();
+ generic_done_message(t, state, ch);
+}
+
+/*
+** color_matrix(test_list, status, ch)
+**
+** test (pairs) (op)
+*/
+static void
+color_matrix(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j, matrix_size, matrix_area, brightness;
+
+ matrix_size = max_colors > 8 ? 8 : max_colors;
+
+ sprintf(temp, "(pairs) There are %d color pairs.", max_pairs);
+ ptextln(temp);
+
+ for ( ; matrix_size; matrix_size--) {
+ if (matrix_size * matrix_size <= max_pairs) {
+ break;
+ }
+ }
+ matrix_area = matrix_size * matrix_size;
+ for (brightness = 0; brightness < 2; brightness++) {
+ put_crlf();
+ sprintf(temp,
+ "%dx%d matrix of foreground/background colors, bright *o%s*",
+ matrix_size, matrix_size, brightness ? "n" : "ff");
+ put_str(temp);
+
+ put_str("\n ");
+ for (i = 0; i < matrix_size; i++) {
+ (void) sprintf(temp, "%-8s", def_colors[i].name);
+ put_str(temp);
+ }
+ for (j = 0; j < matrix_area; j++) {
+ if (j % matrix_size == 0) {
+ tc_putp(tparm(orig_pair));
+ put_crlf();
+ if (brightness) {
+ tc_putp(exit_standout_mode);
+ }
+ (void) sprintf(temp, "%-8s", def_colors[j / matrix_size].name);
+ put_str(temp);
+ if (brightness) {
+ put_mode(enter_bold_mode);
+ }
+ }
+ new_color(def_colors[j % matrix_size].index,
+ def_colors[j / matrix_size].index,
+ FALSE);
+ put_str(" Hello ");
+ }
+ tc_putp(tparm(orig_pair));
+ if (brightness) {
+ tc_putp(exit_standout_mode);
+ }
+ put_crlf();
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** color_ncv(test_list, status, ch)
+**
+** test (ncv)
+*/
+static void
+color_ncv(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (no_color_video == -1) {
+ /* I have no idea what this means */
+ return;
+ }
+ sprintf(temp, "According to no_color_video (ncv) which is %d, the following attributes should work correctly with color.", no_color_video);
+ ptextln(temp);
+ put_crlf();
+ set_attr(0);
+ ncv_display(0);
+ for (i = 1; i <= 9; i++) {
+ if (((no_color_video >> (mode_map[i] - 1)) & 1) == 0) {
+ ncv_display(mode_map[i]);
+ }
+ }
+ if (no_color_video & 0x3ff) {
+ ptextln("\nThe following attributes should not work correctly with color. (ncv)\n");
+ for (i = 1; i <= 9; i++) {
+ if ((no_color_video >> (mode_map[i] - 1)) & 1) {
+ ncv_display(mode_map[i]);
+ }
+ }
+ }
+ tc_putp(orig_pair);
+ put_crlf();
+ generic_done_message(t, state, ch);
+}
+
+/*
+** color_bce(test_list, status, ch)
+**
+** test (bce) background color erase
+*/
+static void
+color_bce(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ new_color(COLOR_BLACK, COLOR_WHITE, FALSE);
+ put_clear();
+ put_newlines(2);
+ new_color(COLOR_WHITE, COLOR_BLACK, FALSE);
+ ptextln("If the two lines above are black then back_color_erase (bce) should be false.");
+ sprintf(temp, "(bce) is %s in the data base.", back_color_erase ? "true" : "false");
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+}
+
+/*
+** color_ccc(test_list, status, ch)
+**
+** test (ccc) color palette test (oc) (op) (initc) (initp)
+*/
+static void
+color_ccc(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!can_change) {
+ ptextln("Terminal can not change colors (ccc)");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ tc_putp(orig_colors);
+ pairs_used = 0;
+ new_color(COLOR_WHITE, COLOR_BLACK, FALSE);
+ sprintf(temp, "Reloading colors (init%c) using %s method",
+ set_foreground ? 'c' : 'p',
+ hue_lightness_saturation ? "HLS" : "RGB");
+ ptextln(temp);
+ put_crlf();
+ j = max_colors > 7 ? 7 : max_colors;
+ /* redisplay the above test with reinitialized colors */
+ /* If these colors don't look right to you... */
+ for (i = 0; i < j; i++) {
+ sprintf(temp, " %s ", def_colors[i ^ 7].name);
+
+ new_color(i ^ 7, COLOR_BLACK, TRUE);
+ put_str(temp);
+
+ new_color(COLOR_BLACK, COLOR_BLACK, TRUE);
+ put_str(" ");
+
+ new_color(COLOR_BLACK, i ^ 7, TRUE);
+ put_str(temp);
+
+ new_color(COLOR_WHITE, COLOR_BLACK, FALSE);
+ put_crlf();
+ }
+ generic_done_message(t, state, ch);
+ if (*ch != 0 && *ch != 'n') {
+ tc_putp(orig_colors);
+ tc_putp(tparm(orig_pair));
+ return;
+ }
+
+ pairs_used = 0;
+ cookie_monster = 0;
+ if (magic_cookie_glitch > 0) {
+ cookie_monster =
+ ((set_a_foreground || set_foreground)
+ ? magic_cookie_glitch : 0) +
+ ((set_a_background || set_background)
+ ? magic_cookie_glitch : 0) +
+ (set_color_pair ? magic_cookie_glitch : 0);
+ }
+ set_color_step();
+ colors_per_line = max_colors > max_pairs
+ ? max_pairs : max_colors;
+ j = (columns - 14) / (cookie_monster + 1);
+ if (colors_per_line > j) {
+ colors_per_line = (j / i) * i;
+ }
+ sprintf(temp, "RGB color step %d, cookies %d", color_step,
+ cookie_monster);
+ ptextln(temp);
+
+ R = G = B = 0;
+ pairs_used = 0;
+ for (;;) {
+ if (rainbow(colors_per_line)) {
+ break;
+ }
+ }
+ generic_done_message(t, state, ch);
+ if (*ch != 0 && *ch != 'n') {
+ tc_putp(orig_colors);
+ tc_putp(tparm(orig_pair));
+ return;
+ }
+ dump_colors();
+ tc_putp(orig_colors);
+ tc_putp(tparm(orig_pair));
+ generic_done_message(t, state, ch);
+}
diff --git a/contrib/ncurses/tack/control.c b/contrib/ncurses/tack/control.c
new file mode 100644
index 000000000000..4c2158e4dda3
--- /dev/null
+++ b/contrib/ncurses/tack/control.c
@@ -0,0 +1,657 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+MODULE_ID("$Id: control.c,v 1.2 1999/06/16 00:45:59 tom Exp $")
+
+/* terminfo test program control subroutines */
+
+#if HAVE_GETTIMEOFDAY
+#define MY_TIMER struct timeval
+#else
+#define MY_TIMER time_t
+#endif
+
+/* globals */
+int test_complete; /* counts number of tests completed */
+
+char txt_longer_test_time[80]; /* +) use longer time */
+char txt_shorter_test_time[80]; /* -) use shorter time */
+int pad_test_duration = 1; /* number of seconds for a pad test */
+int auto_pad_mode; /* run the time tests */
+int no_alarm_event; /* TRUE if the alarm has not gone off yet */
+int usec_run_time; /* length of last test in microseconds */
+MY_TIMER stop_watch[MAX_TIMERS]; /* Hold the start timers */
+
+char txt_longer_augment[80]; /* >) use bigger augment */
+char txt_shorter_augment[80]; /* <) use smaller augment */
+
+/* caps under test data base */
+int tt_delay_max; /* max number of milliseconds we can delay */
+int tt_delay_used; /* number of milliseconds consumed in delay */
+const char *tt_cap[TT_MAX]; /* value of string */
+int tt_affected[TT_MAX]; /* lines or columns effected (repitition factor) */
+int tt_count[TT_MAX]; /* Number of times sent */
+int tt_delay[TT_MAX]; /* Number of milliseconds delay */
+int ttp; /* number of entries used */
+
+/* Saved value of the above data base */
+const char *tx_cap[TT_MAX]; /* value of string */
+int tx_affected[TT_MAX]; /* lines or columns effected (repitition factor) */
+int tx_count[TT_MAX]; /* Number of times sent */
+int tx_index[TT_MAX]; /* String index */
+int tx_delay[TT_MAX]; /* Number of milliseconds delay */
+int txp; /* number of entries used */
+int tx_characters; /* printing characters sent by test */
+int tx_cps; /* characters per second */
+struct test_list *tx_source; /* The test that generated this data */
+
+extern struct test_menu pad_menu; /* Pad menu structure */
+extern struct test_list pad_test_list[];
+
+#define RESULT_BLOCK 1024
+static int blocks; /* number of result blocks available */
+static struct test_results *results; /* pointer to next available */
+struct test_results *pads[STRCOUNT]; /* save pad results here */
+
+/*
+** event_start(number)
+**
+** Begin the stopwatch at the current time-of-day.
+*/
+void
+event_start(int n)
+{
+#if HAVE_GETTIMEOFDAY
+ (void) gettimeofday(&stop_watch[n], (struct timezone *)0);
+#else
+ stop_watch[n] = time((time_t *)0);
+#endif
+}
+
+/*
+** event_time(number)
+**
+** Return the number of milliseconds since this stop watch began.
+*/
+long
+event_time(int n)
+{
+#if HAVE_GETTIMEOFDAY
+ MY_TIMER current_time;
+
+ (void) gettimeofday(&current_time, (struct timezone *)0);
+ return ((current_time.tv_sec - stop_watch[n].tv_sec) * 1000000)
+ + current_time.tv_usec - stop_watch[n].tv_usec;
+#else
+ return (time((time_t *)0) - stop_watch[n]) * 1000;
+#endif
+}
+
+/*****************************************************************************
+ *
+ * Execution control for string capability tests
+ *
+ *****************************************************************************/
+
+/*
+** get_next_block()
+**
+** Get a results block for pad test data.
+*/
+static struct test_results *
+get_next_block(void)
+{
+ if (blocks <= 0) {
+ results = (struct test_results *)
+ malloc(sizeof(struct test_results) * RESULT_BLOCK);
+ if (!results) {
+ ptextln("Malloc failed");
+ return (struct test_results *) 0;
+ }
+ blocks = RESULT_BLOCK;
+ }
+ blocks--;
+ return results++;
+}
+
+/*
+** set_augment_txt()
+**
+** Initialize the augment menu selections
+*/
+void
+set_augment_txt(void)
+{
+ sprintf(txt_longer_augment,
+ ">) Change lines/characters effected to %d", augment << 1);
+ sprintf(txt_shorter_augment,
+ "<) Change lines/characters effected to %d", augment >> 1);
+}
+
+void
+control_init(void)
+{
+ sprintf(txt_longer_test_time, "+) Change test time to %d seconds",
+ pad_test_duration + 1);
+ sprintf(txt_shorter_test_time, "-) Change test time to %d seconds",
+ pad_test_duration - 1);
+ set_augment_txt();
+}
+
+/*
+** msec_cost(cap, affected-count)
+**
+** Return the number of milliseconds delay needed by the cap.
+*/
+int
+msec_cost(
+ const char *const cap,
+ int affcnt)
+{
+ int dec, value, total, star, ch;
+ const char *cp;
+
+ if (!cap) {
+ return 0;
+ }
+ total = 0;
+ for (cp = cap; *cp; cp++) {
+ if (*cp == '$' && cp[1] == '<') {
+ star = 1;
+ value = dec = 0;
+ for (cp += 2; (ch = *cp); cp++) {
+ if (ch >= '0' && ch <= '9') {
+ value = value * 10 + (ch - '0');
+ dec *= 10;
+ } else
+ if (ch == '.') {
+ dec = 1;
+ } else
+ if (ch == '*') {
+ star = affcnt;
+ } else
+ if (ch == '>') {
+ break;
+ }
+ }
+ if (dec > 1) {
+ total += (value * star) / dec;
+ } else {
+ total += (value * star);
+ }
+ }
+ }
+ return total;
+}
+
+/*
+** liberated(cap)
+**
+** Return the cap without padding
+*/
+char *
+liberated(char *cap)
+{
+ static char cb[1024];
+ char *ts, *ls;
+
+ cb[0] = '\0';
+ ls = NULL;
+ if (cap) {
+ for (ts = cb; (*ts = *cap); ++cap) {
+ if (*cap == '$' && cap[1] == '<') {
+ ls = ts;
+ }
+ ++ts;
+ if (*cap == '>') {
+ if (ls) {
+ ts = ls;
+ ls = NULL;
+ }
+ }
+ }
+ }
+ return cb;
+}
+
+/*
+** page_loop()
+**
+** send CR/LF or go home and bump letter
+*/
+void
+page_loop(void)
+{
+ if (line_count + 2 >= lines) {
+ NEXT_LETTER;
+ go_home();
+ } else {
+ put_crlf();
+ }
+}
+
+/*
+** skip_pad_test(test-list-entry, state, ch, text)
+**
+** Print the start test line. Handle start up commands.
+** Return TRUE if a return is requested.
+*/
+int
+skip_pad_test(
+ struct test_list *test,
+ int *state,
+ int *ch,
+ const char *text)
+{
+ char rep_text[16];
+
+ while(1) {
+ if (text) {
+ ptext(text);
+ }
+ if ((test->flags & MENU_LC_MASK)) {
+ sprintf(rep_text, " *%d", augment);
+ ptext(rep_text);
+ }
+ ptext(" [n] > ");
+ *ch = wait_here();
+ if (*ch == 's') {
+ /* Skip is converted to next */
+ *ch = 'n';
+ return TRUE;
+ }
+ if (*ch == 'q') {
+ /* Quit is converted to help */
+ *ch = '?';
+ return TRUE;
+ }
+ if (*ch == '\r' || *ch == '\n' || *ch == 'n' || *ch == 'r') {
+ /* this is the only response that allows the test to run */
+ *ch = 0;
+ }
+ if (subtest_menu(pad_test_list, state, ch)) {
+ continue;
+ }
+ return (*ch != 0);
+ }
+}
+
+/*
+** pad_done_message(test_list)
+**
+** Print the Done message and request input.
+*/
+void
+pad_done_message(
+ struct test_list *test,
+ int *state,
+ int *ch)
+{
+ int default_action = 0;
+ char done_message[128];
+ char rep_text[16];
+
+ while (1) {
+ if ((test->flags & MENU_LC_MASK)) {
+ sprintf(rep_text, "*%d", augment);
+ } else {
+ rep_text[0] = '\0';
+ }
+ if (test->caps_done) {
+ sprintf(done_message, "(%s)%s Done ", test->caps_done,
+ rep_text);
+ ptext(done_message);
+ } else {
+ if (rep_text[0]) {
+ ptext(rep_text);
+ ptext(" ");
+ }
+ ptext("Done ");
+ }
+ if (debug_level & 2) {
+ dump_test_stats(test, state, ch);
+ } else {
+ *ch = wait_here();
+ }
+ if (*ch == '\r' || *ch == '\n') {
+ *ch = default_action;
+ return;
+ }
+ if (*ch == 's' || *ch == 'n') {
+ *ch = 0;
+ return;
+ }
+ if (strchr(pad_repeat_test, *ch)) {
+ /* default action is now repeat */
+ default_action = 'r';
+ }
+ if (subtest_menu(pad_test_list, state, ch)) {
+ continue;
+ }
+ return;
+ }
+}
+
+/*
+** sliding_scale(dividend, factor, divisor)
+**
+** Return (dividend * factor) / divisor
+*/
+int
+sliding_scale(
+ int dividend,
+ int factor,
+ int divisor)
+{
+ double d = dividend;
+
+ if (divisor) {
+ d = (d * (double) factor) / (double) divisor;
+ return (int) (d + 0.5);
+ }
+ return 0;
+}
+
+/*
+** pad_test_startup()
+**
+** Do the stuff needed to begin a test.
+*/
+void
+pad_test_startup(
+ int do_clear)
+{
+ if (do_clear) {
+ put_clear();
+ }
+ repeats = augment;
+ raw_characters_sent = 0;
+ test_complete = ttp = char_count = tt_delay_used = 0;
+ letter = letters[letter_number = 0];
+ if (pad_test_duration <= 0) {
+ pad_test_duration = 1;
+ }
+ tt_delay_max = pad_test_duration * 1000;
+ set_alarm_clock(pad_test_duration);
+ event_start(TIME_TEST);
+}
+
+/*
+** still_testing()
+**
+** This function is called to see if the test loop should be terminated.
+*/
+int
+still_testing(void)
+{
+ fflush(stdout);
+ test_complete++;
+ return EXIT_CONDITION;
+}
+
+/*
+** pad_test_shutdown()
+**
+** Do the stuff needed to end a test.
+*/
+void
+pad_test_shutdown(
+ struct test_list *t,
+ int crlf)
+{
+ int i;
+ int counts; /* total counts */
+ int ss; /* Save string index */
+ int cpo; /* characters per operation */
+ int delta; /* difference in characters */
+ int bogus; /* Time is inaccurate */
+ struct test_results *r; /* Results of current test */
+ int ss_index[TT_MAX]; /* String index */
+
+ if (tty_can_sync == SYNC_TESTED) {
+ bogus = tty_sync_error();
+ } else {
+ bogus = 1;
+ }
+ usec_run_time = event_time(TIME_TEST);
+ tx_source = t;
+ tx_characters = raw_characters_sent;
+ tx_cps = sliding_scale(tx_characters, 1000000, usec_run_time);
+
+ /* save the data base */
+ for (txp = ss = counts = 0; txp < ttp; txp++) {
+ tx_cap[txp] = tt_cap[txp];
+ tx_count[txp] = tt_count[txp];
+ tx_delay[txp] = tt_delay[txp];
+ tx_affected[txp] = tt_affected[txp];
+ tx_index[txp] = get_string_cap_byvalue(tt_cap[txp]);
+ if (tx_index[txp] >= 0) {
+ if (cap_match(t->caps_done, strnames[tx_index[txp]])) {
+ ss_index[ss++] = txp;
+ counts += tx_count[txp];
+ }
+ }
+ }
+
+ if (crlf) {
+ put_crlf();
+ }
+ if (counts == 0 || tty_cps == 0 || bogus) {
+ /* nothing to do */
+ return;
+ }
+ /* calculate the suggested pad times */
+ delta = usec_run_time - sliding_scale(tx_characters, 1000000, tty_cps);
+ if (delta < 0) {
+ /* probably should bump tx_characters */
+ delta = 0;
+ }
+ cpo = delta / counts;
+ for (i = 0; i < ss; i++) {
+ if (!(r = get_next_block())) {
+ return;
+ }
+ r->next = pads[tx_index[ss_index[i]]];
+ pads[tx_index[ss_index[i]]] = r;
+ r->test = t;
+ r->reps = tx_affected[ss_index[i]];
+ r->delay = cpo;
+ }
+}
+
+/*
+** show_cap_results(index)
+**
+** Display the previous results
+*/
+static void
+show_cap_results(
+ int x)
+{
+ struct test_results *r; /* a result */
+ int delay;
+
+ if ((r = pads[x])) {
+ sprintf(temp, "(%s)", strnames[x]);
+ ptext(temp);
+ while (r) {
+ sprintf(temp, "$<%d>", r->delay / 1000);
+ put_columns(temp, strlen(temp), 10);
+ r = r->next;
+ }
+ r = pads[x];
+ while (r) {
+ if (r->reps > 1) {
+ delay = r->delay / (r->reps * 100);
+ sprintf(temp, "$<%d.%d*>", delay / 10, delay % 10);
+ put_columns(temp, strlen(temp), 10);
+ }
+ r = r->next;
+ }
+ put_crlf();
+ }
+}
+
+/*
+** dump_test_stats(test_list, status, ch)
+**
+** Dump the statistics about the last test
+*/
+void
+dump_test_stats(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+ char tbuf[32];
+ int x[32];
+
+ put_crlf();
+ if (tx_source && tx_source->caps_done) {
+ cap_index(tx_source->caps_done, x);
+ if (x[0] >= 0) {
+ sprintf(temp, "Caps summary for (%s)",
+ tx_source->caps_done);
+ ptextln(temp);
+ for (i = 0; x[i] >= 0; i++) {
+ show_cap_results(x[i]);
+ }
+ put_crlf();
+ }
+ }
+ sprintf(tbuf, "%011u", usec_run_time);
+ sprintf(temp, "Test time: %d.%s, characters per second %d, characters %d",
+ usec_run_time / 1000000, &tbuf[5], tx_cps, tx_characters);
+ ptextln(temp);
+ for (i = 0; i < txp; i++) {
+ if ((j = get_string_cap_byvalue(tx_cap[i])) >= 0) {
+ sprintf(tbuf, "(%s)", strnames[j]);
+ } else {
+ strcpy(tbuf, "(?)");
+ }
+ sprintf(temp, "%8d %3d $<%3d> %8s %s",
+ tx_count[i], tx_affected[i], tx_delay[i],
+ tbuf, expand(tx_cap[i]));
+ putln(temp);
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** longer_test_time(test_list, status, ch)
+**
+** Extend the number of seconds for each test.
+*/
+void
+longer_test_time(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ pad_test_duration += 1;
+ sprintf(txt_longer_test_time, "+) Change test time to %d seconds",
+ pad_test_duration + 1);
+ sprintf(txt_shorter_test_time, "-) Change test time to %d seconds",
+ pad_test_duration - 1);
+ sprintf(temp, "Tests will run for %d seconds", pad_test_duration);
+ ptext(temp);
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** shorter_test_time(test_list, status, ch)
+**
+** Shorten the number of seconds for each test.
+*/
+void
+shorter_test_time(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ if (pad_test_duration > 1) {
+ pad_test_duration -= 1;
+ sprintf(txt_longer_test_time, "+) Change test time to %d seconds",
+ pad_test_duration + 1);
+ sprintf(txt_shorter_test_time, "-) Change test time to %d seconds",
+ pad_test_duration - 1);
+ }
+ sprintf(temp, "Tests will run for %d second%s", pad_test_duration,
+ pad_test_duration > 1 ? "s" : "");
+ ptext(temp);
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** longer_augment(test_list, status, ch)
+**
+** Lengthen the number of lines/characters effected
+*/
+void
+longer_augment(
+ struct test_list *t,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ augment <<= 1;
+ set_augment_txt();
+ if (augment_test) {
+ t = augment_test;
+ }
+ sprintf(temp, "The pad tests will effect %d %s.", augment,
+ ((t->flags & MENU_LC_MASK) == MENU_lines) ?
+ "lines" : "characters");
+ ptextln(temp);
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** shorter_augment(test_list, status, ch)
+**
+** Shorten the number of lines/characters effected
+*/
+void
+shorter_augment(
+ struct test_list *t,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ if (augment > 1) {
+ /* don't let the augment go to zero */
+ augment >>= 1;
+ }
+ set_augment_txt();
+ if (augment_test) {
+ t = augment_test;
+ }
+ sprintf(temp, "The pad tests will effect %d %s.", augment,
+ ((t->flags & MENU_LC_MASK) == MENU_lines) ?
+ "lines" : "characters");
+ ptextln(temp);
+ *ch = REQUEST_PROMPT;
+}
diff --git a/contrib/ncurses/tack/crum.c b/contrib/ncurses/tack/crum.c
new file mode 100644
index 000000000000..94183635b2ec
--- /dev/null
+++ b/contrib/ncurses/tack/crum.c
@@ -0,0 +1,426 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: crum.c,v 1.2 1999/08/21 23:09:08 tom Exp $")
+
+/*
+ * Test cursor movement.
+ */
+
+static void crum_clear(struct test_list *t, int *state, int *ch);
+static void crum_home(struct test_list *t, int *state, int *ch);
+static void crum_ll(struct test_list *t, int *state, int *ch);
+static void crum_move(struct test_list *t, int *state, int *ch);
+static void crum_os(struct test_list *t, int *state, int *ch);
+
+static char crum_text[5][80];
+
+struct test_list crum_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {MENU_NEXT, 0, "clear", 0, 0, crum_clear, 0},
+ {MENU_NEXT, 0, "home", 0, 0, crum_home, 0},
+ {MENU_NEXT, 0, "ll", 0, 0, crum_ll, 0},
+ {MENU_NEXT, 0, crum_text[0], "home cuu1", 0, crum_move, 0},
+ {MENU_NEXT + 1, 0, crum_text[1], "cub1 cud1 cuf1 cuu1", 0, crum_move, 0},
+ {MENU_NEXT + 2, 0, crum_text[2], "cub cud cuf cuu", 0, crum_move, 0},
+ {MENU_NEXT + 3, 0, crum_text[3], "vpa hpa", 0, crum_move, 0},
+ {MENU_NEXT + 4, 0, crum_text[4], "cup", 0, crum_move, 0},
+ {MENU_NEXT, 0, "cup", "os", 0, crum_os, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+/*
+** move_to(from-row, from-column, to-row, to-column, selection)
+**
+** move the cursor from (rf, cf) to (rt, ct) using sel
+*/
+static void
+move_to(
+ int rf,
+ int cf,
+ int rt,
+ int ct,
+ int sel)
+{
+ char *s;
+
+ if (sel & 16) { /* use (cup) */
+ s = tparm(cursor_address, rt, ct);
+ tputs(s, lines, tc_putch);
+ return;
+ }
+ if (sel & 8) { /* use (hpa) (vpa) */
+ if (column_address) {
+ s = tparm(column_address, ct);
+ tputs(s, 1, tc_putch);
+ cf = ct;
+ }
+ if (row_address) {
+ s = tparm(row_address, rt);
+ tputs(s, 1, tc_putch);
+ rf = rt;
+ }
+ }
+ if (sel & 4) { /* paramiterized relative cursor movement */
+ if (parm_right_cursor)
+ if (cf < ct) {
+ s = tparm(parm_right_cursor, ct - cf);
+ tputs(s, ct - cf, tc_putch);
+ cf = ct;
+ }
+ if (parm_left_cursor)
+ if (cf > ct) {
+ s = tparm(parm_left_cursor, cf - ct);
+ tputs(s, cf - ct, tc_putch);
+ cf = ct;
+ }
+ if (parm_down_cursor)
+ if (rf < rt) {
+ s = tparm(parm_down_cursor, rt - rf);
+ tputs(s, rt - rf, tc_putch);
+ rf = rt;
+ }
+ if (parm_up_cursor)
+ if (rf > rt) {
+ s = tparm(parm_up_cursor, rf - rt);
+ tputs(s, rf - rt, tc_putch);
+ rf = rt;
+ }
+ }
+ if (sel & 2) {
+ if (cursor_left)
+ while (cf > ct) {
+ tc_putp(cursor_left);
+ cf--;
+ }
+ /*
+ do vertical motion next. Just in case cursor_down has a
+ side effect of changing the column. This could happen if
+ the tty handler translates NL to CRNL.
+ */
+ if (cursor_down)
+ while (rf < rt) {
+ tc_putp(cursor_down);
+ rf++;
+ }
+ if (cursor_up)
+ while (rf > rt) {
+ tc_putp(cursor_up);
+ rf--;
+ }
+ if (cursor_right)
+ while (cf < ct) {
+ tc_putp(cursor_right);
+ cf++;
+ }
+ }
+ /* last chance */
+ if (rf > rt) {
+ if (can_go_home) { /* a bit drastic but ... */
+ go_home();
+ cf = 0;
+ rf = 0;
+ } else if (cursor_up) {
+ while (rf > rt) {
+ tc_putp(cursor_up);
+ rf--;
+ }
+ }
+ }
+ if (ct == 0 && rt > rf) {
+ put_crlf();
+ cf = 0;
+ rf++;
+ }
+ if (ct == 0 && cf != 0) {
+ put_cr();
+ cf = 0;
+ }
+ while (rf < rt) {
+ put_lf();
+ rf++;
+ }
+ while (cf > ct) {
+ put_str("\b");
+ cf--;
+ }
+ if (cursor_right) {
+ while (cf < ct) {
+ tc_putp(cursor_right);
+ cf++;
+ }
+ } else {
+ /* go ahead and trash my display */
+ while (cf < ct) {
+ putchp(' ');
+ cf++;
+ }
+ }
+}
+
+/*
+** display_it(selection, text)
+**
+** print the display using sel
+*/
+static void
+display_it(
+ int sel,
+ char *txt)
+{
+ int i, done_line;
+
+ put_clear();
+ go_home();
+ put_newlines(2);
+ ptextln(" The top line should be alternating <'s and >'s");
+ ptextln(" The left side should be alternating A's and V's");
+ ptext(" Testing ");
+ ptext(txt);
+ put_cr();
+
+ /* horizontal */
+ move_to(done_line = line_count, 0, 0, 2, sel);
+ for (i = 4; i < columns - 2; i += 2) {
+ putchp('>');
+ move_to(0, i - 1, 0, i, sel);
+ }
+ putchp('>');
+ i -= 2;
+ move_to(0, i + 1, 0, i - 1, sel);
+ for (; i > 2; i -= 2) {
+ putchp('<');
+ move_to(0, i, 0, i - 3, sel);
+ }
+ putchp('<');
+
+ /* vertical */
+ move_to(0, 2, 0, 0, sel);
+ for (i = 2; i < lines - 1; i += 2) {
+ putchp('V');
+ move_to(i - 2, 1, i, 0, sel);
+ }
+ putchp('V');
+ i -= 2;
+ move_to(i, 1, i + 1, 0, sel);
+ for (; i > 0; i -= 2) {
+ putchp('A');
+ move_to(i + 1, 1, i - 1, 0, sel);
+ }
+ putchp('A');
+ move_to(i + 1, 1, 0, 0, sel); /* go home first */
+ move_to(0, 0, done_line + 1, 3, sel);
+ put_str(txt);
+ put_str(" Done. ");
+}
+
+/*
+** crum_clear(test_list, status, ch)
+**
+** (clear) test Clear screen
+*/
+static void
+crum_clear(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (clear_screen) {
+ for (i = lines; i > 1; i--) {
+ putln("garbage");
+ }
+ put_clear();
+ ptextln("This line should start in the home position.");
+ ptext("The rest of the screen should be clear. ");
+ } else {
+ ptextln("(clear) Clear screen is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** crum_home(test_list, status, ch)
+**
+** (home) test Home cursor
+*/
+static void
+crum_home(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (cursor_home) {
+ put_clear();
+ put_newlines(lines / 2);
+ go_home();
+ put_crlf();
+ ptext("The bottom line should have text.");
+ go_home();
+ put_newlines(lines - 1);
+ ptext("This line is on the bottom.");
+ go_home();
+ ptextln("This line starts in the home position.");
+ put_crlf();
+ } else {
+ ptextln("(home) Home cursor is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** crum_ll(test_list, status, ch)
+**
+** (ll) test Last line
+*/
+static void
+crum_ll(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ /*
+ (ll) may be simulated with (cup). Don't complain if (cup) is present.
+ */
+ if (cursor_to_ll) {
+ put_clear();
+ put_str("This line could be anywhere.");
+ tc_putp(cursor_to_ll);
+ ptext("This line should be on the bottom");
+ go_home();
+ put_crlf();
+ } else
+ if (cursor_address) {
+ return;
+ } else {
+ ptextln("(ll) Move to last line is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** crum_move(test_list, status, ch)
+**
+** (*) test all cursor move commands
+*/
+static void
+crum_move(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ char buf[80];
+ int n;
+
+ switch (n = (t->flags & 15)) {
+ case 0:
+ sprintf(buf, " (cr) (nel) (cub1)%s",
+ cursor_home ? " (home)" : (cursor_up ? " (cuu1)" : ""));
+ break;
+ case 1:
+ sprintf(buf, "%s%s%s%s", cursor_left ? " (cub1)" : "",
+ cursor_down ? " (cud1)" : "", cursor_right ? " (cuf1)" : "",
+ cursor_up ? " (cuu1)" : "");
+ if (buf[0] == '\0') {
+ ptext(" (cub1) (cud1) (cuf1) (cuu1) not defined.");
+ }
+ break;
+ case 2:
+ sprintf(buf, "%s%s%s%s", parm_left_cursor ? " (cub)" : "",
+ parm_down_cursor ? " (cud)" : "",
+ parm_right_cursor ? " (cuf)" : "",
+ parm_up_cursor ? " (cuu)" : "");
+ if (buf[0] == '\0') {
+ ptext(" (cub) (cud) (cuf) (cuu) not defined.");
+ }
+ break;
+ case 3:
+ sprintf(buf, "%s%s", row_address ? " (vpa)" : "",
+ column_address ? " (hpa)" : "");
+ if (buf[0] == '\0') {
+ ptext(" (vpa) (hpa) not defined.");
+ }
+ break;
+ case 4:
+ if (!cursor_address) {
+ ptext(" (cup) not defined. ");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ strcpy(buf, " (cup)");
+ break;
+ }
+ if (buf[0] == '\0') {
+ put_str(" Done. ");
+ } else {
+ can_test(buf, FLAG_TESTED);
+ strcpy(crum_text[n], &buf[2]);
+ crum_text[n][strlen(buf) - 3] = '\0';
+
+ display_it(1 << n, buf);
+ }
+ *ch = wait_here();
+ if (*ch != 'r') {
+ put_clear();
+ }
+}
+
+/*
+** crum_os(test_list, status, ch)
+**
+** (cup) test Cursor position on overstrike terminals
+*/
+static void
+crum_os(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (cursor_address && over_strike) {
+ put_clear();
+ for (i = 0; i < columns - 2; i++) {
+ tc_putch('|');
+ }
+ for (i = 1; i < lines - 2; i++) {
+ put_crlf();
+ tc_putch('_');
+ }
+ for (i = 0; i < columns - 2; i++) {
+ tputs(tparm(cursor_address, 0, i), lines, tc_putch);
+ tc_putch('+');
+ }
+ for (i = 0; i < lines - 2; i++) {
+ tputs(tparm(cursor_address, i, 0), lines, tc_putch);
+ tc_putch(']');
+ tc_putch('_');
+ }
+ go_home();
+ put_newlines(3);
+ ptext(" All the characters should look the same. ");
+ generic_done_message(t, state, ch);
+ put_clear();
+ }
+}
diff --git a/contrib/ncurses/tack/edit.c b/contrib/ncurses/tack/edit.c
new file mode 100644
index 000000000000..5685d9253fe6
--- /dev/null
+++ b/contrib/ncurses/tack/edit.c
@@ -0,0 +1,977 @@
+/*
+** Copyright (C) 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+#include <time.h>
+#include <tic.h>
+
+MODULE_ID("$Id: edit.c,v 1.3 1999/06/16 00:43:43 tom Exp $")
+
+/*
+ * Terminfo edit features
+ */
+static void show_info(struct test_list *, int *, int *);
+static void show_value(struct test_list *, int *, int *);
+static void show_untested(struct test_list *, int *, int *);
+static void show_changed(struct test_list *, int *, int *);
+
+#define SHOW_VALUE 1
+#define SHOW_EDIT 2
+#define SHOW_DELETE 3
+
+struct test_list edit_test_list[] = {
+ {MENU_CLEAR, 0, 0, 0, "i) display current terminfo", show_info, 0},
+ {0, 0, 0, 0, "w) write the current terminfo to a file", save_info, 0},
+ {SHOW_VALUE, 3, 0, 0, "v) show value of a selected cap", show_value, 0},
+ {SHOW_EDIT, 4, 0, 0, "e) edit value of a selected cap", show_value, 0},
+ {SHOW_DELETE, 3, 0, 0, "d) delete string", show_value, 0},
+ {0, 3, 0, 0, "m) show caps that have been modified", show_changed, 0},
+ {MENU_CLEAR + FLAG_CAN_TEST, 0, 0, 0, "c) show caps that can be tested", show_report, 0},
+ {MENU_CLEAR + FLAG_TESTED, 0, 0, 0, "t) show caps that have been tested", show_report, 0},
+ {MENU_CLEAR + FLAG_FUNCTION_KEY, 0, 0, 0, "f) show a list of function keys", show_report, 0},
+ {MENU_CLEAR, 0, 0, 0, "u) show caps defined that can not be tested", show_untested, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+static char change_pad_text[MAX_CHANGES][80];
+struct test_list change_pad_list[MAX_CHANGES] = {
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+static void build_change_menu(struct test_menu *);
+static void change_one_entry(struct test_list *, int *, int *);
+
+struct test_menu change_pad_menu = {
+ 0, 'q', 0,
+ "Select cap name", "change", 0,
+ build_change_menu, change_pad_list, 0, 0, 0
+};
+
+extern struct test_results *pads[STRCOUNT]; /* save pad results here */
+
+static TERMTYPE original_term; /* terminal type description */
+
+static char flag_boolean[BOOLCOUNT]; /* flags for booleans */
+static char flag_numerics[NUMCOUNT]; /* flags for numerics */
+static char flag_strings[STRCOUNT]; /* flags for strings */
+static int xon_index; /* Subscript for (xon) */
+int xon_shadow;
+
+static int start_display; /* the display has just started */
+static int display_lines; /* number of lines displayed */
+
+/*
+** send_info_string(str)
+**
+** Return the terminfo string prefixed by the correct seperator
+*/
+static void
+send_info_string(
+ const char *str,
+ int *ch)
+{
+ int len;
+
+ if (display_lines == -1) {
+ return;
+ }
+ len = strlen(str);
+ if (len + char_count + 3 >= columns) {
+ if (start_display == 0) {
+ put_str(",");
+ }
+ put_crlf();
+ if (++display_lines > lines) {
+ ptext("-- more -- ");
+ *ch = wait_here();
+ if (*ch == 'q') {
+ display_lines = -1;
+ return;
+ }
+ display_lines = 0;
+ }
+ if (len >= columns) {
+ /* if the terminal does not (am) then this loses */
+ if (columns) {
+ display_lines += ((strlen(str) + 3) / columns) + 1;
+ }
+ put_str(" ");
+ put_str(str);
+ start_display = 0;
+ return;
+ }
+ ptext(" ");
+ } else
+ if (start_display == 0) {
+ ptext(", ");
+ } else {
+ ptext(" ");
+ }
+ ptext(str);
+ start_display = 0;
+}
+
+/*
+** show_info(test_list, status, ch)
+**
+** Display the current terminfo
+*/
+static void
+show_info(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ int i;
+ char buf[1024];
+
+ display_lines = 1;
+ start_display = 1;
+ for (i = 0; i < BOOLCOUNT; i++) {
+ if ((i == xon_index) ? xon_shadow : CUR Booleans[i]) {
+ send_info_string(boolnames[i], ch);
+ }
+ }
+ for (i = 0; i < NUMCOUNT; i++) {
+ if (CUR Numbers[i] >= 0) {
+ sprintf(buf, "%s#%d", numnames[i], CUR Numbers[i]);
+ send_info_string(buf, ch);
+ }
+ }
+ for (i = 0; i < STRCOUNT; i++) {
+ if (CUR Strings[i]) {
+ sprintf(buf, "%s=%s", strnames[i],
+ print_expand(CUR Strings[i]));
+ send_info_string(buf, ch);
+ }
+ }
+ put_newlines(2);
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** save_info_string(str, fp)
+**
+** Write the terminfo string prefixed by the correct seperator
+*/
+static void
+save_info_string(
+ const char *str,
+ FILE *fp)
+{
+ int len;
+
+ len = strlen(str);
+ if (len + display_lines >= 77) {
+ if (display_lines > 0) {
+ (void) fprintf(fp, "\n\t");
+ }
+ display_lines = 8;
+ } else
+ if (display_lines > 0) {
+ (void) fprintf(fp, " ");
+ display_lines++;
+ } else {
+ (void) fprintf(fp, "\t");
+ display_lines = 8;
+ }
+ (void) fprintf(fp, "%s,", str);
+ display_lines += len + 1;
+}
+
+/*
+** save_info(test_list, status, ch)
+**
+** Write the current terminfo to a file
+*/
+void
+save_info(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+ FILE *fp;
+ time_t now;
+ char buf[1024];
+
+ if ((fp = fopen(tty_basename, "w")) == (FILE *) NULL) {
+ (void) sprintf(temp, "can't open: %s", tty_basename);
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+ return;
+ }
+ time(&now);
+ /* Note: ctime() returns a newline at the end of the string */
+ (void) fprintf(fp, "# Terminfo created by TACK for TERM=%s on %s",
+ tty_basename, ctime(&now));
+ (void) fprintf(fp, "%s|%s,\n", tty_basename, longname());
+
+ display_lines = 0;
+ for (i = 0; i < BOOLCOUNT; i++) {
+ if (i == xon_index ? xon_shadow : CUR Booleans[i]) {
+ save_info_string(boolnames[i], fp);
+ }
+ }
+ for (i = 0; i < NUMCOUNT; i++) {
+ if (CUR Numbers[i] >= 0) {
+ sprintf(buf, "%s#%d", numnames[i], CUR Numbers[i]);
+ save_info_string(buf, fp);
+ }
+ }
+ for (i = 0; i < STRCOUNT; i++) {
+ if (CUR Strings[i]) {
+ sprintf(buf, "%s=%s", strnames[i],
+ _nc_tic_expand(CUR Strings[i], TRUE, TRUE));
+ save_info_string(buf, fp);
+ }
+ }
+ (void) fprintf(fp, "\n");
+ (void) fclose(fp);
+ sprintf(temp, "Terminfo saved as file: %s", tty_basename);
+ ptextln(temp);
+}
+
+/*
+** show_value(test_list, status, ch)
+**
+** Display the value of a selected cap
+*/
+static void
+show_value(
+ struct test_list *t,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ struct name_table_entry const *nt;
+ char *s;
+ int n, op, b;
+ char buf[1024];
+ char tmp[1024];
+
+ ptext("enter name: ");
+ read_string(buf, 80);
+ if (buf[0] == '\0' || buf[1] == '\0') {
+ *ch = buf[0];
+ return;
+ }
+ if (line_count + 2 >= lines) {
+ put_clear();
+ }
+ op = t->flags & 255;
+ if ((nt = _nc_find_entry(buf, _nc_info_hash_table))) {
+ switch (nt->nte_type) {
+ case BOOLEAN:
+ if (op == SHOW_DELETE) {
+ if (nt->nte_index == xon_index) {
+ xon_shadow = 0;
+ } else {
+ CUR Booleans[nt->nte_index] = 0;
+ }
+ return;
+ }
+ b = nt->nte_index == xon_index ? xon_shadow :
+ CUR Booleans[nt->nte_index];
+ sprintf(temp, "boolean %s %s", buf,
+ b ? "True" : "False");
+ break;
+ case STRING:
+ if (op == SHOW_DELETE) {
+ CUR Strings[nt->nte_index] = (char *) 0;
+ return;
+ }
+ if (CUR Strings[nt->nte_index]) {
+ sprintf(temp, "string %s %s", buf,
+ expand(CUR Strings[nt->nte_index]));
+ } else {
+ sprintf(temp, "undefined string %s", buf);
+ }
+ break;
+ case NUMBER:
+ if (op == SHOW_DELETE) {
+ CUR Numbers[nt->nte_index] = -1;
+ return;
+ }
+ sprintf(temp, "numeric %s %d", buf,
+ CUR Numbers[nt->nte_index]);
+ break;
+ default:
+ sprintf(temp, "unknown");
+ break;
+ }
+ ptextln(temp);
+ } else {
+ sprintf(temp, "Cap not found: %s", buf);
+ ptextln(temp);
+ return;
+ }
+ if (op != SHOW_EDIT) {
+ return;
+ }
+ if (nt->nte_type == BOOLEAN) {
+ ptextln("Value flipped");
+ if (nt->nte_index == xon_index) {
+ xon_shadow = !xon_shadow;
+ } else {
+ CUR Booleans[nt->nte_index] = !CUR Booleans[nt->nte_index];
+ }
+ return;
+ }
+ ptextln("Enter new value");
+ read_string(buf, sizeof(buf));
+
+ switch (nt->nte_type) {
+ case STRING:
+ _nc_reset_input((FILE *) 0, buf);
+ _nc_trans_string(tmp);
+ s = (char *)malloc(strlen(tmp) + 1);
+ strcpy(s, tmp);
+ CUR Strings[nt->nte_index] = s;
+ sprintf(temp, "new string value %s", nt->nte_name);
+ ptextln(temp);
+ ptextln(expand(CUR Strings[nt->nte_index]));
+ break;
+ case NUMBER:
+ if (sscanf(buf, "%d", &n) == 1) {
+ CUR Numbers[nt->nte_index] = n;
+ sprintf(temp, "new numeric value %s %d",
+ nt->nte_name, n);
+ ptextln(temp);
+ } else {
+ sprintf(temp, "Illegal number: %s", buf);
+ ptextln(temp);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+/*
+** get_string_cap_byname(name, long_name)
+**
+** Given a cap name, find the value
+** Errors are quietly ignored.
+*/
+char *
+get_string_cap_byname(
+ const char *name,
+ const char **long_name)
+{
+ struct name_table_entry const *nt;
+
+ if ((nt = _nc_find_entry(name, _nc_info_hash_table))) {
+ if (nt->nte_type == STRING) {
+ *long_name = strfnames[nt->nte_index];
+ return (CUR Strings[nt->nte_index]);
+ }
+ }
+ *long_name = "??";
+ return (char *) 0;
+}
+
+/*
+** get_string_cap_byvalue(value)
+**
+** Given a capability string, find its position in the data base.
+** Return the index or -1 if not found.
+*/
+int
+get_string_cap_byvalue(
+ const char *value)
+{
+ int i;
+
+ if (value) {
+ for (i = 0; i < STRCOUNT; i++) {
+ if (CUR Strings[i] == value) {
+ return i;
+ }
+ }
+ /* search for translated strings */
+ for (i = 0; i < TM_last; i++) {
+ if (TM_string[i].value == value) {
+ return TM_string[i].index;
+ }
+ }
+ }
+ return -1;
+}
+
+/*
+** show_changed(test_list, status, ch)
+**
+** Display a list of caps that have been changed.
+*/
+static void
+show_changed(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ int i, header = 1, v;
+ const char *a;
+ const char *b;
+ static char title[] = " old value cap new value";
+ char abuf[1024];
+
+ for (i = 0; i < BOOLCOUNT; i++) {
+ v = (i == xon_index) ? xon_shadow : CUR Booleans[i];
+ if (original_term.Booleans[i] != v) {
+ if (header) {
+ ptextln(title);
+ header = 0;
+ }
+ sprintf(temp, "%30d %6s %d",
+ original_term.Booleans[i], boolnames[i], v);
+ ptextln(temp);
+ }
+ }
+ for (i = 0; i < NUMCOUNT; i++) {
+ if (original_term.Numbers[i] != CUR Numbers[i]) {
+ if (header) {
+ ptextln(title);
+ header = 0;
+ }
+ sprintf(temp, "%30d %6s %d",
+ original_term.Numbers[i], numnames[i],
+ CUR Numbers[i]);
+ ptextln(temp);
+ }
+ }
+ for (i = 0; i < STRCOUNT; i++) {
+ a = original_term.Strings[i] ? original_term.Strings[i] : "";
+ b = CUR Strings[i] ? CUR Strings[i] : "";
+ if (strcmp(a, b)) {
+ if (header) {
+ ptextln(title);
+ header = 0;
+ }
+ strcpy(abuf, _nc_tic_expand(a, TRUE, TRUE));
+ sprintf(temp, "%30s %6s %s", abuf, strnames[i],
+ _nc_tic_expand(b, TRUE, TRUE));
+ putln(temp);
+ }
+ }
+ if (header) {
+ ptextln("No changes");
+ }
+ put_crlf();
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** user_modified()
+**
+** Return TRUE if the user has modified the terminfo
+*/
+int
+user_modified(void)
+{
+ const char *a, *b;
+ int i, v;
+
+ for (i = 0; i < BOOLCOUNT; i++) {
+ v = (i == xon_index) ? xon_shadow : CUR Booleans[i];
+ if (original_term.Booleans[i] != v) {
+ return TRUE;
+ }
+ }
+ for (i = 0; i < NUMCOUNT; i++) {
+ if (original_term.Numbers[i] != CUR Numbers[i]) {
+ return TRUE;
+ }
+ }
+ for (i = 0; i < STRCOUNT; i++) {
+ a = original_term.Strings[i] ? original_term.Strings[i] : "";
+ b = CUR Strings[i] ? CUR Strings[i] : "";
+ if (strcmp(a, b)) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*****************************************************************************
+ *
+ * Maintain the list of capabilities that can be tested
+ *
+ *****************************************************************************/
+
+/*
+** mark_cap(name, flag)
+**
+** Mark the cap data base with the flag provided.
+*/
+static void
+mark_cap(
+ char *name,
+ int flag)
+{
+ struct name_table_entry const *nt;
+
+ if ((nt = _nc_find_entry(name, _nc_info_hash_table))) {
+ switch (nt->nte_type) {
+ case BOOLEAN:
+ flag_boolean[nt->nte_index] |= flag;
+ break;
+ case STRING:
+ flag_strings[nt->nte_index] |= flag;
+ break;
+ case NUMBER:
+ flag_numerics[nt->nte_index] |= flag;
+ break;
+ default:
+ sprintf(temp, "unknown cap type (%s)", name);
+ ptextln(temp);
+ break;
+ }
+ } else {
+ sprintf(temp, "Cap not found: %s", name);
+ ptextln(temp);
+ (void) wait_here();
+ }
+}
+
+/*
+** can_test(name-list, flags)
+**
+** Scan the name list and get the names.
+** Enter each name into the can-test data base.
+** <space> ( and ) may be used as seperators.
+*/
+void
+can_test(
+ const char *s,
+ int flags)
+{
+ int ch, i, j;
+ char name[32];
+
+ if (s) {
+ for (i = j = 0; (name[j] = ch = *s); s++) {
+ if (ch == ' ' || ch == ')' || ch == '(') {
+ if (j) {
+ name[j] = '\0';
+ mark_cap(name, flags);
+ }
+ j = 0;
+ } else {
+ j++;
+ }
+ }
+ if (j) {
+ mark_cap(name, flags);
+ }
+ }
+}
+
+/*
+** cap_index(name-list, index-list)
+**
+** Scan the name list and return a list of indexes.
+** <space> ( and ) may be used as seperators.
+** This list is terminated with -1.
+*/
+void
+cap_index(
+ const char *s,
+ int *inx)
+{
+ struct name_table_entry const *nt;
+ int ch, i, j;
+ char name[32];
+
+ if (s) {
+ for (i = j = 0; ; s++) {
+ name[j] = ch = *s;
+ if (ch == ' ' || ch == ')' || ch == '(' || ch == 0) {
+ if (j) {
+ name[j] = '\0';
+ if ((nt = _nc_find_entry(name,
+ _nc_info_hash_table)) &&
+ (nt->nte_type == STRING)) {
+ *inx++ = nt->nte_index;
+ }
+ }
+ if (ch == 0) {
+ break;
+ }
+ j = 0;
+ } else {
+ j++;
+ }
+ }
+ }
+ *inx = -1;
+}
+
+/*
+** cap_match(name-list, cap)
+**
+** Scan the name list and see if the cap is in the list.
+** Return TRUE if we find an exact match.
+** <space> ( and ) may be used as seperators.
+*/
+int
+cap_match(
+ const char *names,
+ const char *cap)
+{
+ char *s;
+ int c, l, t;
+
+ if (names) {
+ l = strlen(cap);
+ while ((s = strstr(names, cap))) {
+ c = (names == s) ? 0 : *(s - 1);
+ t = s[l];
+ if ((c == 0 || c == ' ' || c == '(') &&
+ (t == 0 || t == ' ' || t == ')')) {
+ return TRUE;
+ }
+ if (t == 0) {
+ break;
+ }
+ names = s + l;
+ }
+ }
+ return FALSE;
+}
+
+/*
+** show_report(test_list, status, ch)
+**
+** Display a list of caps that can be tested
+*/
+void
+show_report(
+ struct test_list *t,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ int i, j, nc, flag;
+ const char *s;
+ const char *nx[BOOLCOUNT + NUMCOUNT + STRCOUNT];
+
+ flag = t->flags & 255;
+ nc = 0;
+ for (i = 0; i < BOOLCOUNT; i++) {
+ if (flag_boolean[i] & flag) {
+ nx[nc++] = boolnames[i];
+ }
+ }
+ for (i = 0; i < NUMCOUNT; i++) {
+ if (flag_numerics[i] & flag) {
+ nx[nc++] = numnames[i];
+ }
+ }
+ for (i = 0; i < STRCOUNT; i++) {
+ if (flag_strings[i] & flag) {
+ nx[nc++] = strnames[i];
+ }
+ }
+ /* sort */
+ for (i = 0; i < nc - 1; i++) {
+ for (j = i + 1; j < nc; j++) {
+ if (strcmp(nx[i], nx[j]) > 0) {
+ s = nx[i];
+ nx[i] = nx[j];
+ nx[j] = s;
+ }
+ }
+ }
+ if (flag & FLAG_FUNCTION_KEY) {
+ ptextln("The following function keys can be tested:");
+ } else
+ if (flag & FLAG_CAN_TEST) {
+ ptextln("The following capabilities can be tested:");
+ } else
+ if (flag & FLAG_TESTED) {
+ ptextln("The following capabilities have been tested:");
+ }
+ put_crlf();
+ for (i = 0; i < nc; i++) {
+ sprintf(temp, "%s ", nx[i]);
+ ptext(temp);
+ }
+ put_newlines(1);
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** show_untested(test_list, status, ch)
+**
+** Display a list of caps that are defined but cannot be tested.
+** Don't bother to sort this list.
+*/
+static void
+show_untested(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ int i;
+
+ ptextln("Caps that are defined but cannot be tested:");
+ for (i = 0; i < BOOLCOUNT; i++) {
+ if (flag_boolean[i] == 0 && CUR Booleans[i]) {
+ sprintf(temp, "%s ", boolnames[i]);
+ ptext(temp);
+ }
+ }
+ for (i = 0; i < NUMCOUNT; i++) {
+ if (flag_numerics[i] == 0 && CUR Numbers[i] >= 0) {
+ sprintf(temp, "%s ", numnames[i]);
+ ptext(temp);
+ }
+ }
+ for (i = 0; i < STRCOUNT; i++) {
+ if (flag_strings[i] == 0 && CUR Strings[i]) {
+ sprintf(temp, "%s ", strnames[i]);
+ ptext(temp);
+ }
+ }
+ put_newlines(1);
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** edit_init()
+**
+** Initialize the function key data base
+*/
+void
+edit_init(void)
+{
+ int i, j, lc;
+ char *lab;
+ struct name_table_entry const *nt;
+ int label_strings[STRCOUNT];
+
+ _nc_copy_termtype(&original_term, &cur_term->type);
+ for (i = 0; i < BOOLCOUNT; i++) {
+ original_term.Booleans[i] = CUR Booleans[i];
+ }
+ for (i = 0; i < NUMCOUNT; i++) {
+ original_term.Numbers[i] = CUR Numbers[i];
+ }
+ /* scan for labels */
+ for (i = lc = 0; i < STRCOUNT; i++) {
+ original_term.Strings[i] = CUR Strings[i];
+ if (strncmp(strnames[i], "lf", 2) == 0) {
+ flag_strings[i] |= FLAG_LABEL;
+ if (CUR Strings[i]) {
+ label_strings[lc++] = i;
+ }
+ }
+ }
+ /* scan for function keys */
+ for (i = 0; i < STRCOUNT; i++) {
+ if ((strnames[i][0] == 'k') && strcmp(strnames[i], "kmous")) {
+ flag_strings[i] |= FLAG_FUNCTION_KEY;
+ lab = (char *) 0;
+ for (j = 0; j < lc; j++) {
+ if (!strcmp(&strnames[i][1],
+ &strnames[label_strings[j]][1])) {
+ lab = CUR Strings[label_strings[j]];
+ break;
+ }
+ }
+ enter_key(strnames[i], CUR Strings[i], lab);
+ }
+ }
+ /* Lookup the translated strings */
+ for (i = 0; i < TM_last; i++) {
+ if ((nt = _nc_find_entry(TM_string[i].name,
+ _nc_info_hash_table)) && (nt->nte_type == STRING)) {
+ TM_string[i].index = nt->nte_index;
+ } else {
+ sprintf(temp, "TM_string lookup failed for: %s",
+ TM_string[i].name);
+ ptextln(temp);
+ }
+ }
+ if ((nt = _nc_find_entry("xon", _nc_info_hash_table)) != 0) {
+ xon_index = nt->nte_index;
+ }
+ xon_shadow = xon_xoff;
+}
+
+/*
+** change_one_entry(test_list, status, ch)
+**
+** Change the padding on the selected cap
+*/
+static void
+change_one_entry(
+ struct test_list *test,
+ int *state,
+ int *chp)
+{
+ struct name_table_entry const *nt;
+ int i, j, x, star, slash, v, dot, ch;
+ const char *s;
+ char *t, *p;
+ const char *current_string;
+ char buf[1024];
+ char pad[1024];
+
+ i = test->flags & 255;
+ if (i == 255) {
+ /* read the cap name from the user */
+ ptext("enter name: ");
+ read_string(pad, 32);
+ if (pad[0] == '\0' || pad[1] == '\0') {
+ *chp = pad[0];
+ return;
+ }
+ if ((nt = _nc_find_entry(pad, _nc_info_hash_table)) &&
+ (nt->nte_type == STRING)) {
+ x = nt->nte_index;
+ current_string = CUR Strings[x];
+ } else {
+ sprintf(temp, "%s is not a string capability", pad);
+ ptext(temp);
+ generic_done_message(test, state, chp);
+ return;
+ }
+ } else {
+ x = tx_index[i];
+ current_string = tx_cap[i];
+ strcpy(pad, strnames[x]);
+ }
+ if (!current_string) {
+ ptextln("That string is not currently defined. Please enter a new value, including the padding delay:");
+ read_string(buf, sizeof(buf));
+ _nc_reset_input((FILE *) 0, buf);
+ _nc_trans_string(pad);
+ t = (char *)malloc(strlen(pad) + 1);
+ strcpy(t, pad);
+ CUR Strings[x] = t;
+ sprintf(temp, "new string value %s", strnames[x]);
+ ptextln(temp);
+ ptextln(expand(t));
+ return;
+ }
+ sprintf(buf, "Current value: (%s) %s", pad, _nc_tic_expand(current_string, TRUE, TRUE));
+ putln(buf);
+ ptextln("Enter new pad. 0 for no pad. CR for no change.");
+ read_string(buf, 32);
+ if (buf[0] == '\0' || (buf[1] == '\0' && isalpha(buf[0]))) {
+ *chp = buf[0];
+ return;
+ }
+ star = slash = FALSE;
+ for (j = v = dot = 0; (ch = buf[j]); j++) {
+ if (ch >= '0' && ch <= '9') {
+ v = ch - '0' + v * 10;
+ if (dot) {
+ dot++;
+ }
+ } else if (ch == '*') {
+ star = TRUE;
+ } else if (ch == '/') {
+ slash = TRUE;
+ } else if (ch == '.') {
+ dot = 1;
+ } else {
+ sprintf(temp, "Illegal character: %c", ch);
+ ptextln(temp);
+ ptext("General format: 99.9*/ ");
+ generic_done_message(test, state, chp);
+ return;
+ }
+ }
+ while (dot > 2) {
+ v /= 10;
+ dot--;
+ }
+ if (dot == 2) {
+ sprintf(pad, "%d.%d%s%s", v / 10, v % 10,
+ star ? "*" : "", slash ? "/" : "");
+ } else {
+ sprintf(pad, "%d%s%s",
+ v, star ? "*" : "", slash ? "/" : "");
+ }
+ s = current_string;
+ t = buf;
+ for (v = 0; (ch = *t = *s++); t++) {
+ if (v == '$' && ch == '<') {
+ while ((ch = *s++) && (ch != '>'));
+ for (p = pad; (*++t = *p++); );
+ *t++ = '>';
+ while ((*t++ = *s++));
+ pad[0] = '\0';
+ break;
+ }
+ v = ch;
+ }
+ if (pad[0]) {
+ sprintf(t, "$<%s>", pad);
+ }
+ if ((t = (char *)malloc(strlen(buf) + 1))) {
+ strcpy(t, buf);
+ CUR Strings[x] = t;
+ if (i != 255) {
+ tx_cap[i] = t;
+ }
+ }
+ generic_done_message(test, state, chp);
+}
+
+/*
+** build_change_menu(menu_list)
+**
+** Build the change pad menu list
+*/
+static void
+build_change_menu(
+ struct test_menu *m)
+{
+ int i, j, k;
+ char *s;
+
+ for (i = j = 0; i < txp; i++) {
+ if ((k = tx_index[i]) >= 0) {
+ s = _nc_tic_expand(tx_cap[i], TRUE, TRUE);
+ s[40] = '\0';
+ sprintf(change_pad_text[j], "%c) (%s) %s",
+ 'a' + j, strnames[k], s);
+ change_pad_list[j].flags = i;
+ change_pad_list[j].lines_needed = 4;
+ change_pad_list[j].menu_entry = change_pad_text[j];
+ change_pad_list[j].test_procedure = change_one_entry;
+ j++;
+ }
+ }
+ strcpy(change_pad_text[j], "z) enter name");
+ change_pad_list[j].flags = 255;
+ change_pad_list[j].lines_needed = 4;
+ change_pad_list[j].menu_entry = change_pad_text[j];
+ change_pad_list[j].test_procedure = change_one_entry;
+ j++;
+ change_pad_list[j].flags = MENU_LAST;
+ if (m->menu_title) {
+ put_crlf();
+ ptextln(m->menu_title);
+ }
+}
diff --git a/contrib/ncurses/tack/fun.c b/contrib/ncurses/tack/fun.c
new file mode 100644
index 000000000000..7ddfbbdf8c42
--- /dev/null
+++ b/contrib/ncurses/tack/fun.c
@@ -0,0 +1,912 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: fun.c,v 1.2 1999/06/16 00:46:12 tom Exp $")
+
+/*
+ * Test the function keys on the terminal. The code for echo tests
+ * lives here too.
+ */
+
+static void funkey_keys(struct test_list *, int *, int *);
+static void funkey_meta(struct test_list *, int *, int *);
+static void funkey_label(struct test_list *, int *, int *);
+static void funkey_prog(struct test_list *, int *, int *);
+static void funkey_local(struct test_list *, int *, int *);
+
+struct test_list funkey_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {MENU_CLEAR + FLAG_FUNCTION_KEY, 0, 0, 0, "f) show a list of function keys", show_report, 0},
+ {MENU_NEXT | MENU_CLEAR, 0, "smkx) (rmkx", 0,
+ "k) test function keys", funkey_keys, 0},
+ {MENU_NEXT, 10, "km", "smm rmm", 0, funkey_meta, 0},
+ {MENU_NEXT, 8, "nlab) (smln) (pln) (rmln", "lw lh", 0, funkey_label, 0},
+ {MENU_NEXT, 2, "pfx", 0, 0, funkey_prog, 0},
+ {MENU_NEXT, 2, "pfloc", 0, 0, funkey_local, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+static void printer_on(struct test_list *, int *, int *);
+static void printer_mc0(struct test_list *, int *, int *);
+
+struct test_list printer_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {MENU_NEXT | MENU_CLEAR, 0, "mc4) (mc5) (mc5i", 0, 0, printer_on, 0},
+ {MENU_NEXT | MENU_CLEAR, 0, "mc0", 0, 0, printer_mc0, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+#define MAX_STRINGS STRCOUNT
+
+/* scan code externals */
+extern int scan_max; /* length of longest scan code */
+extern char **scan_up, **scan_down, **scan_name;
+extern int *scan_tested, *scan_length;
+
+/* local definitions */
+static const char *fk_name[MAX_STRINGS];
+static char *fkval[MAX_STRINGS];
+static char *fk_label[MAX_STRINGS]; /* function key labels (if any) */
+static int fk_tested[MAX_STRINGS];
+static int fkmax = 1; /* length of longest key */
+static int got_labels = 0; /* true if we have some labels */
+static int key_count = 0;
+static int end_state;
+
+/* unknown function keys */
+#define MAX_FK_UNK 50
+static char *fk_unknown[MAX_FK_UNK];
+static int fk_length[MAX_FK_UNK];
+static int funk;
+
+/*
+** keys_tested(first-time, show-help, hex-output)
+**
+** Display a list of the keys not tested.
+*/
+static void
+keys_tested(
+ int first_time,
+ int show_help,
+ int hex_output)
+{
+ int i, l;
+ char outbuf[256];
+
+ put_clear();
+ tty_set();
+ flush_input();
+ if (got_labels) {
+ putln("Function key labels:");
+ for (i = 0; i < key_count; ++i) {
+ if (fk_label[i]) {
+ sprintf(outbuf, "%s %s",
+ fk_name[i] ? fk_name[i] : "??", fk_label[i]);
+ put_columns(outbuf, strlen(outbuf), 16);
+ }
+ }
+ put_newlines(2);
+ }
+ if (funk) {
+ putln("The following keys are not defined:");
+ for (i = 0; i < funk; ++i) {
+ put_columns(fk_unknown[i], fk_length[i], 16);
+ }
+ put_mode(exit_attribute_mode);
+ put_newlines(2);
+ }
+ if (first_time) {
+ putln("The following keys are defined:");
+ } else {
+ putln("The following keys have not been tested:");
+ }
+ if (scan_mode) {
+ for (i = 0; scan_down[i]; i++) {
+ if (!scan_tested[i]) {
+ if (hex_output) {
+ strcpy(outbuf, hex_expand_to(scan_down[i], 3));
+ } else {
+ strcpy(outbuf, expand(scan_down[i]));
+ }
+ l = expand_chars;
+ if (hex_output) {
+ strcat(outbuf, hex_expand_to(scan_up[i], 3));
+ } else {
+ strcat(outbuf, expand(scan_up[i]));
+ }
+ expand_chars += l;
+ l = strlen(scan_name[i]);
+ if (((char_count + 16) & ~15) +
+ ((expand_chars + 7) & ~7) + l >= columns) {
+ put_crlf();
+ } else
+ if (char_count + 24 > columns) {
+ put_crlf();
+ } else if (char_count) {
+ putchp(' ');
+ }
+ put_columns(outbuf, expand_chars, 16);
+ put_columns(scan_name[i], l, 8);
+ }
+ }
+ } else {
+ for (i = 0; i < key_count; i++) {
+ if (!fk_tested[i]) {
+ if (hex_output) {
+ strcpy(outbuf, hex_expand_to(fkval[i], 3));
+ } else {
+ strcpy(outbuf, expand(fkval[i]));
+ }
+ l = strlen(fk_name[i]);
+ if (((char_count + 16) & ~15) +
+ ((expand_chars + 7) & ~7) + l >= columns) {
+ put_crlf();
+ } else
+ if (char_count + 24 > columns) {
+ put_crlf();
+ } else
+ if (char_count) {
+ putchp(' ');
+ }
+ put_columns(outbuf, expand_chars, 16);
+ put_columns(fk_name[i], l, 8);
+ }
+ }
+ }
+ put_newlines(2);
+ if (show_help) {
+ ptextln("Hit any function key. Type 'end' to quit. Type ? to update the display.");
+ put_crlf();
+ }
+}
+
+/*
+** enter_key(name, value, label)
+**
+** Enter a function key into the data base
+*/
+void
+enter_key(
+ const char *name,
+ char *value,
+ char *lab)
+{
+ int j;
+
+ if (value) {
+ j = strlen(value);
+ fkmax = fkmax > j ? fkmax : j;
+ /* do not permit duplicates */
+ for (j = 0; j < key_count; j++) {
+ if (!strcmp(fk_name[j], name)) {
+ return;
+ }
+ }
+ fkval[key_count] = value;
+ fk_tested[key_count] = 0;
+ fk_label[key_count] = lab;
+ fk_name[key_count++] = name;
+ if (lab) {
+ got_labels = TRUE;
+ }
+ }
+}
+
+
+static void
+fresh_line(void)
+{ /* clear the line for a new fumction key line */
+ if (over_strike) {
+ put_crlf();
+ } else {
+ put_cr();
+ if (clr_eol) {
+ tc_putp(clr_eol);
+ } else {
+ put_str(" \r");
+ }
+ }
+}
+
+
+static int
+end_funky(int ch)
+{ /* return true if this is the end */
+ switch (ch) {
+ case 'e':
+ case 'E':
+ end_state = 'e';
+ break;
+ case 'n':
+ case 'N':
+ if (end_state == 'e') {
+ end_state = 'n';
+ } else {
+ end_state = 0;
+ }
+ break;
+ case 'd':
+ case 'D':
+ if (end_state == 'n') {
+ end_state = 'd';
+ } else {
+ end_state = 0;
+ }
+ break;
+ case 'l':
+ case 'L':
+ if (end_state == 'l') {
+ end_state = '?';
+ } else {
+ end_state = 'l';
+ }
+ break;
+ default:
+ end_state = 0;
+ break;
+ }
+ return end_state == 'd';
+}
+
+
+static int
+found_match(char *s, int hx, int cc)
+{ /* return true if this string is a match */
+ int j, f;
+ char outbuf[256];
+
+ if (!*s) {
+ return 0;
+ }
+ if (scan_mode) {
+ for (j = f = 0; scan_down[j]; j++) {
+ if (scan_length[j] == 0) {
+ continue;
+ }
+ if (!strncmp(s, scan_down[j], scan_length[j])) {
+ if (!f) { /* first match */
+ put_cr();
+ if (hx) {
+ put_str(hex_expand_to(s, 10));
+ } else {
+ put_str(expand_to(s, 10));
+ }
+ f = 1;
+ }
+ (void) end_funky(scan_name[j][0]);
+ put_str(" ");
+ put_str(scan_name[j]);
+ scan_tested[j] = 1;
+ s += scan_length[j];
+ if (strncmp(s, scan_up[j], scan_length[j])) {
+ put_str(" scan down");
+ } else {
+ s += scan_length[j];
+ }
+ if (!*s) {
+ break;
+ }
+ j = -1;
+ }
+ if (!strncmp(s, scan_up[j], scan_length[j])) {
+ if (!f) { /* first match */
+ put_cr();
+ if (hx) {
+ put_str(hex_expand_to(s, 10));
+ } else {
+ put_str(expand_to(s, 10));
+ }
+ f = 1;
+ }
+ put_str(" ");
+ put_str(scan_name[j]);
+ put_str(" scan up");
+ s += scan_length[j];
+ if (!*s) {
+ break;
+ }
+ j = -1;
+ }
+ }
+ } else {
+ for (j = f = 0; j < key_count; j++) {
+ if (!strcmp(s, fkval[j])) {
+ if (!f) { /* first match */
+ put_cr();
+ if (hx) {
+ put_str(hex_expand_to(s, 10));
+ } else {
+ put_str(expand_to(s, 10));
+ }
+ f = 1;
+ }
+ sprintf(outbuf, " (%s)", fk_name[j]);
+ put_str(outbuf);
+ if (fk_label[j]) {
+ sprintf(outbuf, " <%s>", fk_label[j]);
+ put_str(outbuf);
+ }
+ fk_tested[j] = 1;
+ }
+ }
+ }
+ if (end_state == '?') {
+ keys_tested(0, 1, hx);
+ tty_raw(cc, char_mask);
+ end_state = 0;
+ }
+ return f;
+}
+
+
+static int
+found_exit(char *keybuf, int hx, int cc)
+{ /* return true if the user wants to exit */
+ int j, k;
+ char *s;
+
+
+ if (scan_mode) {
+ if (*keybuf == '\0') {
+ return TRUE;
+ }
+ } else {
+ /* break is a special case */
+ if (*keybuf == '\0') {
+ fresh_line();
+ tty_set();
+ ptext("Hit X to exit: ");
+ if (wait_here() == 'X') {
+ return TRUE;
+ }
+ keys_tested(0, 1, hx);
+ tty_raw(cc, char_mask);
+ return FALSE;
+ }
+ /* is this the end? */
+ for (k = 0; (j = (keybuf[k] & STRIP_PARITY)); k++) {
+ if (end_funky(j)) {
+ return TRUE;
+ }
+ }
+
+ j = TRUE; /* does he need an updated list? */
+ for (k = 0; keybuf[k]; k++) {
+ j &= (keybuf[k] & STRIP_PARITY) == '?';
+ }
+ if (j || end_state == '?') {
+ keys_tested(0, 1, hx);
+ tty_raw(cc, char_mask);
+ end_state = 0;
+ return FALSE;
+ }
+ }
+
+ put_cr();
+ if (hx) {
+ s = hex_expand_to(keybuf, 10);
+ } else {
+ s = expand_to(keybuf, 10);
+ }
+ sprintf(temp, "%s Unknown", s);
+ put_str(temp);
+ for (j = 0; j < MAX_FK_UNK; j++) {
+ if (j == funk) {
+ fk_length[funk] = expand_chars;
+ if ((fk_unknown[funk] = (char *)malloc(strlen(s) + 1))) {
+ strcpy(fk_unknown[funk++], s);
+ }
+ break;
+ }
+ if (fk_length[j] == expand_chars) {
+ if (!strcmp(fk_unknown[j], s)) {
+ break;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+** funkey_keys(test_list, status, ch)
+**
+** Test function keys
+*/
+static void
+funkey_keys(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ char keybuf[256];
+
+ if (keypad_xmit) {
+ tc_putp(keypad_xmit);
+ }
+ keys_tested(1, 1, hex_out); /* also clears screen */
+ keybuf[0] = '\0';
+ end_state = 0;
+ if (scan_mode) {
+ fkmax = scan_max;
+ }
+ tty_raw(0, char_mask);
+ while (end_state != 'd') {
+ read_key(keybuf, sizeof(keybuf));
+ fresh_line();
+ if (found_match(keybuf, hex_out, 0)) {
+ continue;
+ }
+ if (found_exit(keybuf, hex_out, 0)) {
+ break;
+ }
+ }
+ if (keypad_local) {
+ tc_putp(keypad_local);
+ }
+ keys_tested(0, 0, hex_out);
+ ptext("Function key test ");
+ generic_done_message(t, state, ch);
+}
+
+int
+tty_meta_prep(void)
+{ /* print a warning before the meta key test */
+ if (not_a_tty) {
+ return 0;
+ }
+ if (initial_stty_query(TTY_8_BIT)) {
+ return 0;
+ }
+ ptext("The meta key test must be run with the");
+ ptext(" terminal set for 8 data bits. Two stop bits");
+ ptext(" may also be needed for correct display. I will");
+ ptext(" transmit 8 bit data but if the terminal is set for");
+ ptextln(" 7 bit data, garbage may appear on the screen.");
+ return 1;
+}
+
+/*
+** funkey_meta(test_list, status, ch)
+**
+** Test meta key (km) (smm) (rmm)
+*/
+static void
+funkey_meta(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j, k, len;
+ char outbuf[256];
+
+ if (has_meta_key) {
+ put_crlf();
+ if (char_mask != ALLOW_PARITY) {
+ if (tty_meta_prep()) {
+ ptext("\nHit any key to continue > ");
+ (void) wait_here();
+ put_crlf();
+ }
+ }
+ ptext("Begin meta key test. (km) (smm) (rmm) Hit any key");
+ ptext(" with the meta key. The character will be");
+ ptext(" displayed in hex. If the meta key is working");
+ ptext(" then the most significant bit will be set. Type");
+ ptextln(" 'end' to exit.");
+ tty_raw(1, ALLOW_PARITY);
+ tc_putp(meta_on);
+
+ for (i = j = k = len = 0; i != 'e' || j != 'n' || k != 'd';) {
+ i = j;
+ j = k;
+ k = getchp(ALLOW_PARITY);
+ if (k == EOF) {
+ break;
+ }
+ if ((len += 3) >= columns) {
+ put_crlf();
+ len = 3;
+ }
+ sprintf(outbuf, "%02X ", k);
+ put_str(outbuf);
+ k &= STRIP_PARITY;
+ }
+ tc_putp(meta_off);
+ put_crlf();
+ tty_set();
+ put_crlf();
+ } else {
+ ptext("(km) Has-meta-key is not set. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** funkey_label(test_list, status, ch)
+**
+** Test labels (nlab) (smln) (pln) (rmln) (lw) (lh)
+*/
+static void
+funkey_label(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+ char outbuf[256];
+
+ if (num_labels == -1) {
+ ptextln("Your terminal has no labels. (nlab)");
+ } else {
+ sprintf(temp, "Your terminal has %d labels (nlab) that are %d characters wide (lw) and %d lines high (lh)",
+ num_labels, label_width, label_height);
+ ptext(temp);
+ ptextln(" Testing (smln) (pln) (rmln)");
+ if (label_on) {
+ tc_putp(label_on);
+ }
+ if (label_width <= 0) {
+ label_width = sizeof(outbuf) - 1;
+ }
+ for (i = 1; i <= num_labels; i++) {
+ sprintf(outbuf, "L%d..............................", i);
+ outbuf[label_width] = '\0';
+ tc_putp(tparm(plab_norm, i, outbuf));
+ }
+ if (label_off) {
+ ptext("Hit any key to remove the labels: ");
+ (void) wait_here();
+ tc_putp(label_off);
+ }
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** funkey_prog(test_list, status, ch)
+**
+** Test program function keys (pfx)
+*/
+static void
+funkey_prog(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, fk;
+ char mm[256];
+
+ fk = 1; /* use function key 1 for now */
+ if (pkey_xmit) {
+ /* test program function key */
+ sprintf(temp,
+ "(pfx) Set function key %d to transmit abc\\n", fk);
+ ptextln(temp);
+ tc_putp(tparm(pkey_xmit, fk, "abc\n"));
+ sprintf(temp, "Hit function key %d\n", fk);
+ ptextln(temp);
+ for (i = 0; i < 4; ++i)
+ mm[i] = getchp(STRIP_PARITY);
+ mm[i] = '\0';
+ put_crlf();
+ if (mm[0] != 'a' || mm[1] != 'b' || mm[2] != 'c') {
+ sprintf(temp, "Error string recieved was: %s", expand(mm));
+ ptextln(temp);
+ } else {
+ putln("Thank you\n");
+ }
+ flush_input();
+ if (key_f1) {
+ tc_putp(tparm(pkey_xmit, fk, key_f1));
+ }
+ } else {
+ ptextln("Function key transmit (pfx), not present.");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** funkey_local(test_list, status, ch)
+**
+** Test program local function keys (pfloc)
+*/
+static void
+funkey_local(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int fk;
+
+ fk = 1;
+ if (pkey_local) {
+ /* test local function key */
+ sprintf(temp,
+ "(pfloc) Set function key %d to execute a clear and print \"Done!\"", fk);
+ ptextln(temp);
+ sprintf(temp, "%sDone!", liberated(clear_screen));
+ tc_putp(tparm(pkey_local, fk, temp));
+ sprintf(temp, "Hit function key %d. Then hit return.", fk);
+ ptextln(temp);
+ (void) wait_here();
+ flush_input();
+ if (key_f1 && pkey_xmit) {
+ tc_putp(tparm(pkey_xmit, fk, key_f1));
+ }
+ } else {
+ ptextln("Function key execute local (pfloc), not present.");
+ }
+
+ generic_done_message(t, state, ch);
+}
+
+/*
+** printer_on(test_list, status, ch)
+**
+** Test printer on/off (mc4) (mc5) (mc5i)
+*/
+static void
+printer_on(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (!prtr_on || !prtr_off) {
+ ptextln("Printer on/off missing. (mc5) (mc4)");
+ } else if (prtr_silent) {
+ ptextln("Your printer is silent. (mc5i) is set.");
+ tc_putp(prtr_on);
+ ptextln("This line should be on the printer but not your screen. (mc5)");
+ tc_putp(prtr_off);
+ ptextln("This line should be only on the screen. (mc4)");
+ } else {
+ ptextln("Your printer is not silent. (mc5i) is reset.");
+ tc_putp(prtr_on);
+ ptextln("This line should be on the printer and the screen. (mc5)");
+ tc_putp(prtr_off);
+ ptextln("This line should only be on the screen. (mc4)");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** printer_mc0(test_list, status, ch)
+**
+** Test screen print (mc0)
+*/
+static void
+printer_mc0(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (print_screen) {
+ ptext("I am going to send the contents of the screen to");
+ ptext(" the printer, then wait for a keystroke from you.");
+ ptext(" All of the text that appears on the screen");
+ ptextln(" should be printed. (mc0)");
+ tc_putp(print_screen);
+ } else {
+ ptext("(mc0) Print-screen is not present. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+
+static void
+line_pattern(void)
+{ /* put up a pattern that will help count the
+ number of lines */
+ int i, j;
+
+ put_clear();
+ if (over_strike) {
+ for (i = 0; i < 100; i++) {
+ if (i) {
+ put_crlf();
+ }
+ for (j = i / 10; j; j--) {
+ put_this(' ');
+ }
+ put_this('0' + ((i + 1) % 10));
+ }
+ } else /* I assume it will scroll */ {
+ for (i = 100; i; i--) {
+ sprintf(temp, "\r\n%d", i);
+ put_str(temp);
+ }
+ }
+}
+
+
+static void
+column_pattern(void)
+{ /* put up a pattern that will help count the
+ number of columns */
+ int i, j;
+
+ put_clear();
+ for (i = 0; i < 20; i++) {
+ for (j = 1; j < 10; j++) {
+ put_this('0' + j);
+ }
+ put_this('.');
+ }
+}
+
+/*
+** report_help()
+**
+** Print the help text for the echo tests
+*/
+static void
+report_help(int crx)
+{
+ ptextln("The following commands may also be entered:");
+ ptextln(" clear clear screen.");
+ ptextln(" columns print a test patterm to help count screen width.");
+ ptextln(" lines print a test patterm to help count screen length.");
+ ptextln(" end exit.");
+ ptextln(" echo redisplay last report.");
+ if (crx) {
+ ptextln(" hex redisplay last report in hex.");
+ } else {
+ ptextln(" hex toggle hex display mode.");
+ }
+ ptextln(" help display this list.");
+ ptextln(" high toggle forced high bit (0x80).");
+ ptextln(" scan toggle scan mode.");
+ ptextln(" one echo one character after <cr> or <lf> as is. (report mode)");
+ ptextln(" two echo two characters after <cr> or <lf> as is.");
+ ptextln(" all echo all characters after <cr> or <lf> as is. (echo mode)");
+}
+
+/*
+** tools_report(testlist, state, ch)
+**
+** Run the echo tool and report tool
+*/
+void
+tools_report(
+ struct test_list *t,
+ int *state GCC_UNUSED,
+ int *pch GCC_UNUSED)
+{
+ int i, j, ch, crp, crx, high_bit, save_scan_mode, hex_display;
+ char buf[1024];
+ char txt[8];
+
+ hex_display = hex_out;
+ put_clear();
+ if ((crx = (t->flags & 255)) == 1) {
+ ptext("Characters after a CR or LF will be echoed as");
+ ptextln(" is. All other characters will be expanded.");
+ report_help(crx);
+ } else { /* echo test */
+ ptextln("Begin echo test.");
+ report_help(crx);
+ }
+ txt[sizeof(txt) - 1] = '\0';
+ save_scan_mode = scan_mode;
+ tty_raw(1, char_mask);
+ for (i = crp = high_bit = 0;;) {
+ ch = getchp(char_mask);
+ if (ch == EOF) {
+ break;
+ }
+ if (i >= (int) sizeof(buf) - 1) {
+ i = 0;
+ }
+ buf[i++] = ch;
+ buf[i] = '\0';
+ for (j = 0; j < (int) sizeof(txt) - 1; j++) {
+ txt[j] = txt[j + 1];
+ }
+ txt[sizeof(txt) - 1] = ch & STRIP_PARITY;
+ if (crx == 0) { /* echo test */
+ if (hex_display) {
+ ptext(hex_expand_to(&buf[i - 1], 3));
+ } else {
+ tc_putch(ch | high_bit);
+ }
+ } else /* status report test */
+ if (ch == '\n' || ch == '\r') {
+ put_crlf();
+ crp = 0;
+ } else if (crp++ < crx) {
+ tc_putch(ch | high_bit);
+ } else {
+ put_str(expand(&buf[i - 1]));
+ }
+ if (!strncmp(&txt[sizeof(txt) - 7], "columns", 7)) {
+ column_pattern();
+ buf[i = 0] = '\0';
+ crp = 0;
+ }
+ if (!strncmp(&txt[sizeof(txt) - 5], "lines", 5)) {
+ line_pattern();
+ buf[i = 0] = '\0';
+ crp = 0;
+ }
+ if (!strncmp(&txt[sizeof(txt) - 5], "clear", 5)) {
+ put_clear();
+ buf[i = 0] = '\0';
+ crp = 0;
+ }
+ if (!strncmp(&txt[sizeof(txt) - 4], "high", 4)) {
+ high_bit ^= 0x80;
+ if (high_bit) {
+ ptextln("\nParity bit set");
+ } else {
+ ptextln("\nParity bit reset");
+ }
+ }
+ if (!strncmp(&txt[sizeof(txt) - 4], "help", 4)) {
+ put_crlf();
+ report_help(crx);
+ }
+ if (!strncmp(&txt[sizeof(txt) - 4], "echo", 4)) {
+ /* display the last status report */
+ /* clear bypass condition on Tek terminals */
+ put_crlf();
+ if (i >= 4) {
+ buf[i -= 4] = '\0';
+ }
+ put_str(expand(buf));
+ }
+ if (save_scan_mode &&
+ !strncmp(&txt[sizeof(txt) - 4], "scan", 4)) {
+ /* toggle scan mode */
+ scan_mode = !scan_mode;
+ }
+ if (!strncmp(&txt[sizeof(txt) - 3], "end", 3))
+ break;
+ if (!strncmp(&txt[sizeof(txt) - 3], "hex", 3)) {
+ if (crx) {
+ /* display the last status report in hex */
+ /* clear bypass condition on Tek terminals */
+ put_crlf();
+ if (i >= 3) {
+ buf[i -= 3] = '\0';
+ }
+ put_str(hex_expand_to(buf, 3));
+ } else {
+ hex_display = !hex_display;
+ }
+ }
+ if (!strncmp(&txt[sizeof(txt) - 3], "two", 3))
+ crx = 2;
+ if (!strncmp(&txt[sizeof(txt) - 3], "one", 3))
+ crx = 1;
+ if (!strncmp(&txt[sizeof(txt) - 3], "all", 3))
+ crx = 0;
+ }
+ scan_mode = save_scan_mode;
+ put_crlf();
+ tty_set();
+ if (crx) {
+ ptextln("End of status report test.");
+ } else {
+ ptextln("End of echo test.");
+ }
+}
diff --git a/contrib/ncurses/tack/init.c b/contrib/ncurses/tack/init.c
new file mode 100644
index 000000000000..e19493d6b50a
--- /dev/null
+++ b/contrib/ncurses/tack/init.c
@@ -0,0 +1,300 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+/* initialization and wrapup code */
+
+#include <tack.h>
+
+MODULE_ID("$Id: init.c,v 1.1 1999/04/18 01:05:23 tom Exp $")
+
+#if NCURSES_VERSION_MAJOR >= 5 || NCURSES_VERSION_PATCH >= 981219
+#define _nc_get_curterm(p) _nc_get_tty_mode(p)
+#endif
+
+FILE *debug_fp;
+char temp[1024];
+char tty_basename[64];
+
+void
+put_name(const char *cap, const char *name)
+{ /* send the cap name followed by the cap */
+ if (cap) {
+ ptext(name);
+ tc_putp(cap);
+ }
+}
+
+static void
+report_cap(const char *tag, const char *s)
+{ /* expand the cap or print *** missing *** */
+ int i;
+
+ ptext(tag);
+ for (i = char_count; i < 13; i++) {
+ putchp(' ');
+ }
+ put_str(" = ");
+ if (s) {
+ putln(expand(s));
+ } else {
+ putln("*** missing ***");
+ }
+}
+
+
+void
+reset_init(void)
+{ /* send the reset and init strings */
+ int i;
+
+ ptext("Terminal reset");
+ i = char_count;
+ put_name(reset_1string, " (rs1)");
+ put_name(reset_2string, " (rs2)");
+ /* run the reset file */
+ if (reset_file && reset_file[0]) {
+ FILE *fp;
+ int ch;
+
+ can_test("rf", FLAG_TESTED);
+ if ((fp = fopen(reset_file, "r"))) { /* send the reset file */
+ sprintf(temp, " (rf) %s", reset_file);
+ ptextln(temp);
+ while (1) {
+ ch = getc(fp);
+ if (ch == EOF)
+ break;
+ put_this(ch);
+ }
+ fclose(fp);
+ } else {
+ sprintf(temp, "\nCannot open reset file (rf) %s", reset_file);
+ ptextln(temp);
+ }
+ }
+ put_name(reset_3string, " (rs3)");
+ if (i != char_count) {
+ put_crlf();
+ }
+ ptext(" init");
+ put_name(init_1string, " (is1)");
+ put_name(init_2string, " (is2)");
+ if (set_tab && clear_all_tabs && init_tabs != 8) {
+ put_crlf();
+ tc_putp(clear_all_tabs);
+ for (char_count = 0; char_count < columns; char_count++) {
+ put_this(' ');
+ if ((char_count & 7) == 7) {
+ tc_putp(set_tab);
+ }
+ }
+ put_cr();
+ }
+ /* run the initialization file */
+ if (init_file && init_file[0]) {
+ FILE *fp;
+ int ch;
+
+ can_test("if", FLAG_TESTED);
+ if ((fp = fopen(init_file, "r"))) { /* send the init file */
+ sprintf(temp, " (if) %s", init_file);
+ ptextln(temp);
+ while (1) {
+ ch = getc(fp);
+ if (ch == EOF)
+ break;
+ put_this(ch);
+ }
+ fclose(fp);
+ } else {
+ sprintf(temp, "\nCannot open init file (if) %s", init_file);
+ ptextln(temp);
+ }
+ }
+ if (init_prog) {
+ can_test("iprog", FLAG_TESTED);
+ (void) system(init_prog);
+ }
+ put_name(init_3string, " (is3)");
+
+ fflush(stdout);
+}
+
+/*
+** display_basic()
+**
+** display the basic terminal definitions
+*/
+void
+display_basic(void)
+{
+ put_str("Name: ");
+ putln(ttytype);
+
+ report_cap("\\r ^M (cr)", carriage_return);
+ report_cap("\\n ^J (ind)", scroll_forward);
+ report_cap("\\b ^H (cub1)", cursor_left);
+ report_cap("\\t ^I (ht)", tab);
+/* report_cap("\\f ^L (ff)", form_feed); */
+ if (newline) {
+ /* OK if missing */
+ report_cap(" (nel)", newline);
+ }
+ report_cap(" (clear)", clear_screen);
+ if (!cursor_home && cursor_address) {
+ report_cap("(cup) (home)", tparm(cursor_address, 0, 0));
+ } else {
+ report_cap(" (home)", cursor_home);
+ }
+ report_cap("ENQ (u9)", user9);
+ report_cap("ACK (u8)", user8);
+
+ sprintf(temp, "\nTerminal size: %d x %d. Baud rate: %ld. Frame size: %d.%d", columns, lines, tty_baud_rate, tty_frame_size >> 1, (tty_frame_size & 1) * 5);
+ putln(temp);
+}
+
+/*
+** curses_setup(exec_name)
+**
+** Startup ncurses
+*/
+void
+curses_setup(
+ char *exec_name)
+{
+ int status;
+ static TERMTYPE term;
+ char tty_filename[2048];
+
+ tty_init();
+
+ /**
+ See if the terminal is in the terminfo data base. This call has
+ two useful benefits, 1) it returns the filename of the terminfo entry,
+ and 2) it searches only terminfo's. This allows us to abort before
+ ncurses starts scanning the termcap file.
+ **/
+ if ((status = _nc_read_entry(tty_basename, tty_filename, &term)) == 0) {
+ fprintf(stderr, "Terminal not found: TERM=%s\n", tty_basename);
+ show_usage(exec_name);
+ exit(1);
+ }
+ if (status == -1) {
+ fprintf(stderr, "Terminfo database is inaccessible\n");
+ exit(1);
+ }
+
+ /**
+ This call will load the terminfo data base and set the cur-term
+ variable. Only terminals that actually exist will get here so its
+ OK to ignore errors. This is a good thing since ncurses does not
+ permit (os) or (gn) to be set.
+ **/
+ setupterm(tty_basename, 1, &status);
+
+ /**
+ Get the current terminal definitions. This must be done before
+ getting the baudrate.
+ **/
+ _nc_get_curterm(&cur_term->Nttyb);
+ tty_baud_rate = baudrate();
+ tty_cps = (tty_baud_rate << 1) / tty_frame_size;
+
+ /* set up the defaults */
+ replace_mode = TRUE;
+ scan_mode = 0;
+ char_count = 0;
+ select_delay_type = debug_level = 0;
+ char_mask = (meta_on && meta_on[0] == '\0') ? ALLOW_PARITY : STRIP_PARITY;
+ /* Don't change the XON/XOFF modes yet. */
+ select_xon_xoff = initial_stty_query(TTY_XON_XOFF) ? 1 : needs_xon_xoff;
+
+ fflush(stdout); /* flush any output */
+ tty_set();
+
+ go_home(); /* set can_go_home */
+ put_clear(); /* set can_clear_screen */
+
+ if (send_reset_init) {
+ reset_init();
+ }
+
+ /*
+ I assume that the reset and init strings may not have the correct
+ pads. (Because that part of the test comes much later.) Because
+ of this, I allow the terminal some time to catch up.
+ */
+ fflush(stdout); /* waste some time */
+ sleep(1); /* waste more time */
+ charset_can_test();
+ can_test("lines cols cr nxon rf if iprog rmp", FLAG_CAN_TEST);
+ edit_init(); /* initialize the edit data base */
+
+ if (send_reset_init && enter_ca_mode) {
+ tc_putp(enter_ca_mode);
+ put_clear(); /* just in case we switched pages */
+ }
+ put_crlf();
+ ptext("Using terminfo from: ");
+ ptextln(tty_filename);
+ put_crlf();
+
+ if (tty_can_sync == SYNC_NEEDED) {
+ verify_time();
+ }
+
+ display_basic();
+}
+
+/*
+** bye_kids(exit-condition)
+**
+** Shutdown the terminal, clear the signals, and exit
+*/
+void
+bye_kids(int n)
+{ /* reset the tty and exit */
+ ignoresig();
+ if (send_reset_init) {
+ if (exit_ca_mode) {
+ tc_putp(exit_ca_mode);
+ }
+ if (initial_stty_query(TTY_XON_XOFF)) {
+ if (enter_xon_mode) {
+ tc_putp(enter_xon_mode);
+ }
+ } else if (exit_xon_mode) {
+ tc_putp(exit_xon_mode);
+ }
+ }
+ if (debug_fp) {
+ fclose(debug_fp);
+ }
+ if (log_fp) {
+ fclose(log_fp);
+ }
+ tty_reset();
+ fclose(stdin);
+ fclose(stdout);
+ fclose(stderr);
+ if (not_a_tty)
+ sleep(1);
+ exit(n);
+}
diff --git a/contrib/ncurses/tack/menu.c b/contrib/ncurses/tack/menu.c
new file mode 100644
index 000000000000..a2bcc3809054
--- /dev/null
+++ b/contrib/ncurses/tack/menu.c
@@ -0,0 +1,421 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: menu.c,v 1.1 1998/01/10 00:29:30 tom Exp $")
+
+/*
+ Menu control
+ */
+
+static void test_byname(struct test_menu *, int *, int *);
+
+struct test_list *augment_test;
+char prompt_string[80]; /* menu prompt storage */
+
+/*
+** menu_prompt()
+**
+** Print the menu prompt string.
+*/
+void
+menu_prompt(void)
+{
+ ptext(&prompt_string[1]);
+}
+
+/*
+** menu_test_loop(test-structure, state, control-character)
+**
+** This function implements the repeat test function.
+*/
+static void
+menu_test_loop(
+ struct test_list *test,
+ int *state,
+ int *ch)
+{
+ int nch, p;
+
+ if ((test->flags & MENU_REP_MASK) && (augment_test != test)) {
+ /* set the augment variable (first time only) */
+ p = (test->flags >> 8) & 15;
+ if ((test->flags & MENU_REP_MASK) == MENU_LM1) {
+ augment = lines - 1;
+ } else
+ if ((test->flags & MENU_ONE_MASK) == MENU_ONE) {
+ augment = 1;
+ } else
+ if ((test->flags & MENU_LC_MASK) == MENU_lines) {
+ augment = lines * p / 10;
+ } else
+ if ((test->flags & MENU_LC_MASK) == MENU_columns) {
+ augment = columns * p / 10;
+ } else {
+ augment = 1;
+ }
+ augment_test = test;
+ set_augment_txt();
+ }
+ do {
+ if ((test->flags | *state) & MENU_CLEAR) {
+ put_clear();
+ } else
+ if (line_count + test->lines_needed >= lines) {
+ put_clear();
+ }
+ nch = 0;
+ if (test->test_procedure) {
+ /* The procedure takes precidence so I can pass
+ the menu entry as an argument.
+ */
+ can_test(test->caps_done, FLAG_TESTED);
+ can_test(test->caps_tested, FLAG_TESTED);
+ test->test_procedure(test, state, &nch);
+ } else
+ if (test->sub_menu) {
+ /* nested menu's */
+ menu_display(test->sub_menu, &nch);
+ *state = 0;
+ if (nch == 'q' || nch == 's') {
+ /* Quit and skip are killed here */
+ nch = '?';
+ }
+ } else {
+ break; /* cya */
+ }
+ if (nch == '\r' || nch == '\n' || nch == 'n') {
+ nch = 0;
+ break;
+ }
+ } while (nch == 'r');
+ *ch = nch;
+}
+
+/*
+** menu_display(menu-structure, flags)
+**
+** This function implements menu control.
+*/
+void
+menu_display(
+ struct test_menu *menu,
+ int *last_ch)
+{
+ int test_state = 0, run_standard_tests;
+ int hot_topic, ch = 0, nch = 0;
+ struct test_list *mt;
+ struct test_list *repeat_tests = 0;
+ int repeat_state = 0;
+ int prompt_length;
+
+ prompt_length = strlen(prompt_string);
+ if (menu->ident) {
+ sprintf(&prompt_string[prompt_length], "/%s", menu->ident);
+ }
+ hot_topic = menu->default_action;
+ run_standard_tests = menu->standard_tests ?
+ menu->standard_tests[0] : -1;
+ if (!last_ch) {
+ last_ch = &ch;
+ }
+ while (1) {
+ if (ch == 0) {
+ /* Display the menu */
+ put_crlf();
+ if (menu->menu_function) {
+ /*
+ this function may be used to restrict menu
+ entries. If used it must print the title.
+ */
+ menu->menu_function(menu);
+ } else
+ if (menu->menu_title) {
+ ptextln(menu->menu_title);
+ }
+ for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) {
+ if (mt->menu_entry) {
+ ptext(" ");
+ ptextln(mt->menu_entry);
+ }
+ }
+ if (menu->standard_tests) {
+ ptext(" ");
+ ptextln(menu->standard_tests);
+ ptextln(" r) repeat test");
+ ptextln(" s) skip to next test");
+ }
+ ptextln(" q) quit");
+ ptextln(" ?) help");
+ }
+ if (ch == 0 || ch == REQUEST_PROMPT) {
+ put_crlf();
+ ptext(&prompt_string[1]);
+ if (hot_topic) {
+ ptext(" [");
+ putchp(hot_topic);
+ ptext("]");
+ }
+ ptext(" > ");
+ /* read a character */
+ ch = wait_here();
+ }
+ if (ch == '\r' || ch == '\n') {
+ ch = hot_topic;
+ }
+ if (ch == 'q') {
+ break;
+ }
+ if (ch == '?') {
+ ch = 0;
+ continue;
+ }
+ nch = ch;
+ ch = 0;
+ /* Run one of the standard tests (by request) */
+ for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) {
+ if (mt->menu_entry && (nch == mt->menu_entry[0])) {
+ if (mt->flags & MENU_MENU) {
+ test_byname(menu, &test_state, &nch);
+ } else {
+ menu_test_loop(mt, &test_state, &nch);
+ }
+ ch = nch;
+ if ((mt->flags & MENU_COMPLETE) && ch == 0) {
+ /* top level */
+ hot_topic = 'q';
+ ch = '?';
+ }
+ }
+ }
+ if (menu->standard_tests && nch == 'r') {
+ menu->resume_tests = repeat_tests;
+ test_state = repeat_state;
+ nch = run_standard_tests;
+ }
+ if (nch == run_standard_tests) {
+ if (!(mt = menu->resume_tests)) {
+ mt = menu->tests;
+ }
+ if (mt->flags & MENU_LAST) {
+ mt = menu->tests;
+ }
+ /* Run the standard test suite */
+ for ( ; (mt->flags & MENU_LAST) == 0; ) {
+ if ((mt->flags & MENU_NEXT) == MENU_NEXT) {
+ repeat_tests = mt;
+ repeat_state = test_state;
+ nch = run_standard_tests;
+ menu_test_loop(mt, &test_state, &nch);
+ if (nch != 0 && nch != 'n') {
+ ch = nch;
+ break;
+ }
+ if (test_state & MENU_STOP) {
+ break;
+ }
+ }
+ mt++;
+ }
+ if (ch == 0) {
+ ch = hot_topic;
+ }
+ menu->resume_tests = mt;
+ menu->resume_state = test_state;
+ menu->resume_char = ch;
+
+ if (ch == run_standard_tests) {
+ /* pop up a level */
+ break;
+ }
+ }
+ }
+ *last_ch = ch;
+ prompt_string[prompt_length] = '\0';
+}
+
+/*
+** generic_done_message(test_list)
+**
+** Print the Done message and request input.
+*/
+void
+generic_done_message(
+ struct test_list *test,
+ int *state,
+ int *ch)
+{
+ char done_message[128];
+
+ if (test->caps_done) {
+ sprintf(done_message, "(%s) Done ", test->caps_done);
+ ptext(done_message);
+ } else {
+ ptext("Done ");
+ }
+ *ch = wait_here();
+ if (*ch == '\r' || *ch == '\n' || *ch == 'n') {
+ *ch = 0;
+ }
+ if (*ch == 's') {
+ *state |= MENU_STOP;
+ *ch = 0;
+ }
+}
+
+/*
+** menu_clear_screen(test, state, ch)
+**
+** Just clear the screen.
+*/
+void
+menu_clear_screen(
+ struct test_list *test GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ put_clear();
+}
+
+/*
+** menu_reset_init(test, state, ch)
+**
+** Send the reset and init strings.
+*/
+void
+menu_reset_init(
+ struct test_list *test GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ reset_init();
+ put_crlf();
+}
+
+/*
+** subtest_menu(test, state, ch)
+**
+** Scan the menu looking for something to execute
+** Return TRUE if we found anything.
+*/
+int
+subtest_menu(
+ struct test_list *test,
+ int *state,
+ int *ch)
+{
+ struct test_list *mt;
+
+ if (*ch) {
+ for (mt = test; (mt->flags & MENU_LAST) == 0; mt++) {
+ if (mt->menu_entry && (*ch == mt->menu_entry[0])) {
+ *ch = 0;
+ menu_test_loop(mt, state, ch);
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*
+** menu_can_scan(menu-structure)
+**
+** Recursivly scan the menu tree and find which cap names can be tested.
+*/
+void
+menu_can_scan(
+ const struct test_menu *menu)
+{
+ struct test_list *mt;
+
+ for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) {
+ can_test(mt->caps_done, FLAG_CAN_TEST);
+ can_test(mt->caps_tested, FLAG_CAN_TEST);
+ if (!(mt->test_procedure)) {
+ if (mt->sub_menu) {
+ menu_can_scan(mt->sub_menu);
+ }
+ }
+ }
+}
+
+/*
+** menu_search(menu-structure, cap)
+**
+** Recursivly search the menu tree and execute any tests that use cap.
+*/
+static void
+menu_search(
+ struct test_menu *menu,
+ int *state,
+ int *ch,
+ char *cap)
+{
+ struct test_list *mt;
+ int nch;
+
+ for (mt = menu->tests; (mt->flags & MENU_LAST) == 0; mt++) {
+ nch = 0;
+ if (cap_match(mt->caps_done, cap)
+ || cap_match(mt->caps_tested, cap)) {
+ menu_test_loop(mt, state, &nch);
+ }
+ if (!(mt->test_procedure)) {
+ if (mt->sub_menu) {
+ menu_search(mt->sub_menu, state, &nch, cap);
+ }
+ }
+ if (*state & MENU_STOP) {
+ break;
+ }
+ if (nch != 0 && nch != 'n') {
+ *ch = nch;
+ break;
+ }
+ }
+}
+
+/*
+** test_byname(menu, state, ch)
+**
+** Get a cap name then run all tests that use that cap.
+*/
+static void
+test_byname(
+ struct test_menu *menu,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ int test_state = 0;
+ char cap[32];
+
+ if (tty_can_sync == SYNC_NOT_TESTED) {
+ verify_time();
+ }
+ ptext("enter name: ");
+ read_string(cap, sizeof(cap));
+ if (cap[0]) {
+ menu_search(menu, &test_state, ch, cap);
+ }
+ *ch = '?';
+}
diff --git a/contrib/ncurses/tack/modes.c b/contrib/ncurses/tack/modes.c
new file mode 100644
index 000000000000..f370ba892cc6
--- /dev/null
+++ b/contrib/ncurses/tack/modes.c
@@ -0,0 +1,913 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: modes.c,v 1.1 1998/01/10 00:29:53 tom Exp $")
+
+/*
+ * Tests boolean flags and terminal modes.
+ */
+static void subtest_os(struct test_list *, int *, int *);
+static void subtest_rmam(struct test_list *, int *, int *);
+static void subtest_smam(struct test_list *, int *, int *);
+static void subtest_am(struct test_list *, int *, int *);
+static void subtest_ul(struct test_list *, int *, int *);
+static void subtest_uc(struct test_list *, int *, int *);
+static void subtest_bw(struct test_list *, int *, int *);
+static void subtest_xenl(struct test_list *, int *, int *);
+static void subtest_eo(struct test_list *, int *, int *);
+static void subtest_xmc(struct test_list *, int *, int *);
+static void subtest_xhp(struct test_list *, int *, int *);
+static void subtest_mir(struct test_list *, int *, int *);
+static void subtest_msgr(struct test_list *, int *, int *);
+static void subtest_tbc(struct test_list *, int *, int *);
+static void subtest_xt(struct test_list *, int *, int *);
+static void subtest_hts(struct test_list *, int *, int *);
+static void subtest_cbt(struct test_list *, int *, int *);
+static void subtest_in(struct test_list *, int *, int *);
+static void subtest_dadb(struct test_list *, int *, int *);
+
+struct test_list mode_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {MENU_NEXT, 3, "os", 0, 0, subtest_os, 0},
+ {MENU_NEXT, 1, "rmam", 0, 0, subtest_rmam, 0},
+ {MENU_NEXT, 1, "smam", 0, 0, subtest_smam, 0},
+ {MENU_NEXT, 1, "am", 0, 0, subtest_am, 0},
+ {MENU_NEXT, 3, "ul", 0, 0, subtest_ul, 0},
+ {MENU_NEXT, 3, "uc", 0, 0, subtest_uc, 0},
+ {MENU_NEXT, 3, "bw", 0, 0, subtest_bw, 0},
+ {MENU_NEXT, 4, "xenl", 0, 0, subtest_xenl, 0},
+ {MENU_NEXT, 3, "eo", 0, 0, subtest_eo, 0},
+ {MENU_NEXT, 3, "xmc", 0, 0, subtest_xmc, 0},
+ {MENU_NEXT, 3, "xhp", 0, 0, subtest_xhp, 0},
+ {MENU_NEXT, 6, "mir", 0, 0, subtest_mir, 0},
+ {MENU_NEXT, 6, "msgr", 0, 0, subtest_msgr, 0},
+ {MENU_NEXT | MENU_CLEAR, 0, "tbc", "it", 0, subtest_tbc, 0},
+ {MENU_NEXT | MENU_CLEAR, 0, "hts", "it", 0, subtest_hts, 0},
+ {MENU_NEXT, 4, "xt", "it", 0, subtest_xt, 0},
+ {MENU_NEXT, 1, "cbt", "it", 0, subtest_cbt, 0},
+ {MENU_NEXT, 6, "in", 0, 0, subtest_in, 0},
+ {MENU_NEXT, 1, "da) (db", 0, 0, subtest_dadb, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+/*
+** subtest_os(test_list, status, ch)
+**
+** test over strike mode (os)
+*/
+static void
+subtest_os(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ ptext("(os) should be true, not false.");
+ put_cr();
+ ptextln("(os) should be false.");
+ sprintf(temp, "(os) over-strike is %s in the data base. ",
+ over_strike ? "true" : "false");
+ ptext(temp);
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_rmam(test_list, status, ch)
+**
+** test exit automatic margins mode (rmam)
+*/
+static void
+subtest_rmam(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int j;
+
+ if (!exit_am_mode) {
+ ptext("(rmam) not present. ");
+ } else
+ if (!can_go_home) {
+ ptext("(rmam) not tested, no way to home cursor. ");
+ } else
+ if (over_strike) {
+ put_clear();
+ go_home();
+ tc_putp(exit_am_mode);
+ ptext("\n(rmam) will reset (am)");
+ go_home();
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ ptext("(rmam) will not reset (am)");
+ go_home();
+ put_newlines(2);
+ } else {
+ put_clear();
+ go_home();
+ tc_putp(exit_am_mode);
+ ptext("\n(rmam) will reset (am)");
+ go_home();
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ ptext("(rmam) will not reset (am) ");
+ go_home();
+ put_str(" ");
+ go_home();
+ put_newlines(2);
+ }
+ ptext("Exit-automatic-margins ");
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_smam(test_list, status, ch)
+**
+** test enter automatic margins mode (smam)
+*/
+static void
+subtest_smam(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!enter_am_mode) {
+ ptext("(smam) not present. ");
+ } else
+ if (!can_go_home) {
+ ptext("(smam) not tested, no way to home cursor. ");
+ } else
+ if (over_strike) {
+ put_clear();
+ go_home();
+ tc_putp(enter_am_mode);
+ ptext("\n(smam) will ");
+ i = char_count;
+ ptext("not set (am)");
+ go_home();
+ for (j = -i; j < columns; j++)
+ put_this(' ');
+ put_str("@@@");
+ put_newlines(2);
+ } else {
+ put_clear();
+ go_home();
+ tc_putp(enter_am_mode);
+ ptext("\n(smam) will not set (am)");
+ go_home();
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ ptext("(smam) will set (am) ");
+ go_home();
+ put_str(" ");
+ put_newlines(2);
+ }
+ ptext("Enter-automatic-margins ");
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_am(test_list, status, ch)
+**
+** test automatic margins (am)
+*/
+static void
+subtest_am(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!can_go_home) {
+ ptextln("(am) not tested, no way to home cursor. ");
+ } else
+ if (over_strike) {
+ put_clear();
+ go_home();
+ ptext("\n(am) should ");
+ i = char_count;
+ ptext("not be set");
+ go_home();
+ for (j = -i; j < columns; j++)
+ put_this(' ');
+ put_str("@@@");
+ go_home();
+ put_newlines(2);
+ sprintf(temp, "(am) is %s in the data base",
+ auto_right_margin ? "true" : "false");
+ ptextln(temp);
+ } else {
+ put_clear();
+ go_home();
+ ptext("\n(am) should not be set");
+ go_home();
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ ptext("(am) should be set ");
+ go_home();
+ put_str(" \n\n");
+ sprintf(temp, "(am) is %s in the data base",
+ auto_right_margin ? "true" : "false");
+ ptextln(temp);
+ }
+ ptext("Automatic-right-margin ");
+ generic_done_message(t, state, ch);
+}
+
+/* Note: uprint() sends underscore back-space character, and
+ ucprint() sends character back-space underscore. */
+
+/*
+** uprint(string)
+**
+** underline string for (ul) test
+*/
+static void
+uprint(const char *s)
+{
+ if (s) {
+ while (*s) {
+ put_str("_\b");
+ putchp(*s++);
+ }
+ }
+}
+
+/*
+** ucprint(string)
+**
+** underline string for (uc) test
+*/
+static void
+ucprint(const char *s)
+{
+ if (s) {
+ while (*s) {
+ putchp(*s++);
+ putchp('\b');
+ tc_putp(underline_char);
+ }
+ }
+}
+
+/*
+** subtest_ul(test_list, status, ch)
+**
+** test transparent underline (ul)
+*/
+static void
+subtest_ul(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (!over_strike) {
+ /* (ul) is used only if (os) is reset */
+ put_crlf();
+ sprintf(temp, "This text should %sbe underlined.",
+ transparent_underline ? "" : "not ");
+ uprint(temp);
+ put_crlf();
+ ptextln("If the above line is not underlined the (ul) should be false.");
+ sprintf(temp, "(ul) Transparent-underline is %s in the data base",
+ transparent_underline ? "true" : "false");
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** subtest_uc(test_list, status, ch)
+**
+** test underline character (uc)
+*/
+static void
+subtest_uc(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (!over_strike) {
+ if (underline_char) {
+ ucprint("This text should be underlined.");
+ put_crlf();
+ ptextln("If the above text is not underlined the (uc) has failed.");
+ ptext("Underline-character ");
+ } else {
+ ptext("(uc) underline-character is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** subtest_bw(test_list, status, ch)
+**
+** test auto left margin (bw)
+*/
+static void
+subtest_bw(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (over_strike) {
+ /* test (bw) */
+ ptext("\n(bw) should ");
+ i = char_count;
+ ptextln("not be set.");
+ for (j = i; j < columns; j++)
+ put_str("\b");
+ put_str("@@@");
+ put_crlf();
+ sprintf(temp, "(bw) Auto-left-margin is %s in the data base",
+ auto_left_margin ? "true" : "false");
+ ptextln(temp);
+ } else {
+ /* test (bw) */
+ ptextln("(bw) should not be set.");
+ for (i = 12; i < columns; i++)
+ put_str("\b");
+ if (delete_character) {
+ for (i = 0; i < 4; i++)
+ tc_putp(delete_character);
+ } else {
+ put_str(" ");
+ }
+ put_crlf();
+ sprintf(temp, "(bw) Auto-left-margin is %s in the data base",
+ auto_left_margin ? "true" : "false");
+ ptextln(temp);
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_tbc(test_list, status, ch)
+**
+** test clear tabs (tbc)
+*/
+static void
+subtest_tbc(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int tabat; /* the tab spacing we end up with */
+ int i;
+
+ if (clear_all_tabs && !set_tab) {
+ ptext("(tbc) Clear-all-tabs is defined but (hts) set-tab is not. ");
+ ptext("Once the tabs are cleared there is no way to set them. ");
+ } else
+ if (clear_all_tabs) {
+ tabat = set_tab ? 8 : init_tabs;
+ tc_putp(clear_all_tabs);
+ ptext("Clear tabs (tbc)");
+ go_home();
+ put_crlf();
+ putchp('\t');
+ putchp('T');
+ go_home();
+ put_newlines(2);
+ for (i = 0; i < columns; i++) {
+ if (i == tabat) {
+ putchp('T');
+ } else {
+ putchp('.');
+ }
+ }
+ go_home();
+ ptext("\n\n\nIf the above two lines have T's in the same column then (tbc) has failed. ");
+ } else {
+ ptext("(tbc) Clear-all-tabs is not defined. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_hts(test_list, status, ch)
+**
+** (ht) and set tabs with (hts)
+*/
+static void
+subtest_hts(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int tabat; /* the tab spacing we end up with */
+ int i;
+
+ tabat = init_tabs;
+ if (set_tab) {
+ ptext("Tabs set with (hts)");
+ put_crlf();
+ for (i = 1; i < columns; i++) {
+ if (i % 8 == 1) {
+ tc_putp(set_tab);
+ }
+ putchp(' ');
+ }
+ tabat = 8;
+ } else {
+ sprintf(temp, "(hts) Set-tabs not defined. (it) Initial-tabs at %d", init_tabs);
+ ptext(temp);
+ }
+ go_home();
+ put_newlines(2);
+ if (tabat <= 0) {
+ tabat = 8;
+ }
+ for (i = tabat; i < columns; i += tabat) {
+ putchp('\t');
+ putchp('T');
+ }
+ go_home();
+ put_newlines(3);
+ for (i = 1; i < columns; i++) {
+ putchp('.');
+ }
+ go_home();
+ put_newlines(3);
+ for (i = tabat; i < columns; i += tabat) {
+ putchp('\t');
+ putchp('T');
+ }
+ go_home();
+ put_newlines(4);
+ putchp('.');
+ for (i = 2; i < columns; i++) {
+ if (i % tabat == 1) {
+ putchp('T');
+ } else {
+ putchp('.');
+ }
+ }
+ go_home();
+ put_newlines(5);
+ if (set_tab) {
+ ptextln("If the last two lines are not the same then (hts) has failed.");
+ } else
+ if (init_tabs > 0) {
+ ptextln("If the last two lines are not the same then (it) is wrong.");
+ } else {
+ ptextln("If the last two lines are the same then maybe you do have tabs and (it) should be changed.");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_xt(test_list, status, ch)
+**
+** (xt) glitch
+*/
+static void
+subtest_xt(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int tabat; /* the tab spacing we end up with */
+ int cc;
+
+ tabat = set_tab ? 8 : init_tabs;
+ if (!over_strike && (tabat > 0)) {
+ ptext("(xt) should not ");
+ put_cr();
+ ptext("(xt) should");
+ cc = char_count;
+ while (cc < 16) {
+ putchp('\t');
+ cc = ((cc / tabat) + 1) * tabat;
+ }
+ putln("be set.");
+ sprintf(temp, "(xt) Destructive-tab is %s in the data base.",
+ dest_tabs_magic_smso ? "true" : "false");
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** subtest_cbt(test_list, status, ch)
+**
+** (cbt) back tab
+*/
+static void
+subtest_cbt(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (back_tab) {
+ put_clear();
+ ptext("Back-tab (cbt)");
+ go_home();
+ put_crlf();
+ for (i = 1; i < columns; i++) {
+ putchp(' ');
+ }
+ for (i = 0; i < columns; i += 8) {
+ tc_putp(back_tab);
+ putchp('T');
+ tc_putp(back_tab);
+ }
+ go_home();
+ put_newlines(2);
+ for (i = 1; i < columns; i++) {
+ if (i % 8 == 1) {
+ putchp('T');
+ } else {
+ putchp(' ');
+ }
+ }
+ go_home();
+ put_newlines(3);
+ ptextln("The preceding two lines should be the same.");
+ } else {
+ ptextln("(cbt) Back-tab not present");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_xenl(test_list, status, ch)
+**
+** (xenl) eat newline glitch
+*/
+static void
+subtest_xenl(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j, k;
+
+ if (over_strike) {
+ /* test (xenl) on overstrike terminals */
+ if (!can_go_home || !can_clear_screen) {
+ ptextln("(xenl) Newline-glitch not tested, can't home cursor and clear.");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ put_clear();
+ /*
+ this test must be done in raw mode. Otherwise UNIX will
+ translate CR to CRLF.
+ */
+ if (stty_query(TTY_OUT_TRANS))
+ tty_raw(1, char_mask);
+ ptext("\nreset (xenl). Does ");
+ i = char_count;
+ put_str("not ignore CR, does ");
+ k = char_count;
+ put_str("not ignore LF");
+ go_home();
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ put_cr();
+ for (j = 0; j < i; j++)
+ putchp(' ');
+ put_str("@@@\n@@");
+ go_home();
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ put_lf();
+ for (j = 0; j < k; j++)
+ putchp(' ');
+ put_str("@@@\r@@");
+ tty_set();
+ go_home();
+ put_newlines(4);
+ sprintf(temp, "(xenl) Newline-glitch is %s in the data base",
+ eat_newline_glitch ? "true" : "false");
+ ptextln(temp);
+ } else {
+ /* test (xenl) when (os) is reset */
+ if (!can_go_home) {
+ ptextln("(xenl) Newline-glitch not tested, can't home cursor");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ /* (xenl) test */
+ put_clear();
+ /*
+ this test must be done in raw mode. Otherwise
+ UNIX will translate CR to CRLF.
+ */
+ if (stty_query(TTY_OUT_TRANS))
+ tty_raw(1, char_mask);
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ put_cr();
+ ptext("(xenl) should be set. Does not ignore CR");
+ go_home();
+ put_crlf();
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ put_lf(); /* test (cud1) */
+ ptext("(xenl) should be set. Ignores (cud1)");
+ go_home();
+ put_newlines(3);
+ if (scroll_forward && cursor_down &&
+ strcmp(scroll_forward, cursor_down)) {
+ for (j = 0; j < columns; j++)
+ put_this(' ');
+ put_ind(); /* test (ind) */
+ ptext("(xenl) should be set. Ignores (ind)");
+ go_home();
+ put_newlines(5);
+ }
+ tty_set();
+ ptextln("If you don't see text above telling you to set it, (xenl) should be false");
+ sprintf(temp, "(xenl) Newline-glitch is %s in the data base",
+ eat_newline_glitch ? "true" : "false");
+ ptextln(temp);
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_eo(test_list, status, ch)
+**
+** (eo) erase overstrike
+*/
+static void
+subtest_eo(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (transparent_underline || over_strike || underline_char) {
+ ptext("(eo) should ");
+ if (underline_char) {
+ ucprint("not");
+ } else {
+ uprint("not");
+ }
+ put_cr();
+ ptextln("(eo) should be set");
+ sprintf(temp, "\n(eo) Erase-overstrike is %s in the data base",
+ erase_overstrike ? "true" : "false");
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** subtest_xmc(test_list, status, ch)
+**
+** (xmc) magic cookie glitch
+*/
+static void
+subtest_xmc(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (enter_standout_mode) {
+ sprintf(temp, "\n(xmc) Magic-cookie-glitch is %d in the data base", magic_cookie_glitch);
+ ptextln(temp);
+ j = magic_cookie_glitch * 8;
+ for (i = 0; i < j; i++) {
+ put_str(" ");
+ }
+ ptextln(" These two lines should line up.");
+ if (j > 0) {
+ char_count += j;
+ }
+ for (i = 0; i < 4; i++) {
+ put_mode(enter_standout_mode);
+ putchp(' ');
+ put_mode(exit_standout_mode);
+ putchp(' ');
+ }
+ ptextln("These two lines should line up.");
+ ptext("If they don't line up then (xmc) magic-cookie-glitch should be greater than zero. ");
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** subtest_xhp(test_list, status, ch)
+**
+** (xhp) erase does not clear standout mode
+*/
+static void
+subtest_xhp(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (enter_standout_mode) {
+ put_crlf();
+ put_mode(enter_standout_mode);
+ put_str("Stand out");
+ put_mode(exit_standout_mode);
+ put_cr();
+ ptextln("If any part of this line is standout then (xhp) should be set.");
+ sprintf(temp, "(xhp) Erase-standout-glitch is %s in the data base",
+ ceol_standout_glitch ? "true" : "false");
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** subtest_mir(test_list, status, ch)
+**
+** (mir) move in insert mode
+*/
+static void
+subtest_mir(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+ char *s;
+
+ if (enter_insert_mode && exit_insert_mode && cursor_address) {
+ put_clear();
+ i = line_count;
+ put_str("\nXXX\nXXX\nXXX\nXXX");
+ tc_putp(enter_insert_mode);
+ s = tparm(cursor_address, i + 1, 0);
+ tputs(s, lines, tc_putch);
+ putchp('X');
+ s = tparm(cursor_address, i + 2, 1);
+ tputs(s, lines, tc_putch);
+ putchp('X');
+ s = tparm(cursor_address, i + 3, 2);
+ tputs(s, lines, tc_putch);
+ putchp('X');
+ s = tparm(cursor_address, i + 4, 3);
+ tputs(s, lines, tc_putch);
+ putchp('X');
+ tc_putp(exit_insert_mode);
+ put_newlines(2);
+ ptextln("If you see a 4 by 4 block of X's then (mir) should be true.");
+ sprintf(temp, "(mir) Move-in-insert-mode is %s in the data base",
+ move_insert_mode ? "true" : "false");
+ ptextln(temp);
+ } else {
+ ptext("(mir) Move-in-insert-mode not tested, ");
+ if (!enter_insert_mode) {
+ ptext("(smir) ");
+ }
+ if (!exit_insert_mode) {
+ ptext("(rmir) ");
+ }
+ if (!cursor_address) {
+ ptext("(cup) ");
+ }
+ ptext("not present. ");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_msgr(test_list, status, ch)
+**
+** (msgr) move in sgr mode
+*/
+static void
+subtest_msgr(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (cursor_address &&
+ ((enter_standout_mode && exit_standout_mode) ||
+ (enter_alt_charset_mode && exit_alt_charset_mode))) {
+ put_crlf();
+ i = line_count + 1;
+ tputs(tparm(cursor_address, i, 0), lines, tc_putch);
+ put_mode(enter_alt_charset_mode);
+ put_crlf();
+ /*
+ some versions of the wy-120 can not clear lines or
+ screen when in alt charset mode. If (el) and (ed)
+ are defined then I can test them. If they are not
+ defined then they can not break (msgr)
+ */
+ tc_putp(clr_eos);
+ tc_putp(clr_eol);
+ put_mode(exit_alt_charset_mode);
+ put_mode(enter_standout_mode);
+ putchp('X');
+ tputs(tparm(cursor_address, i + 2, 1), lines, tc_putch);
+ putchp('X');
+ tputs(tparm(cursor_address, i + 3, 2), lines, tc_putch);
+ putchp('X');
+ tputs(tparm(cursor_address, i + 4, 3), lines, tc_putch);
+ putchp('X');
+ put_mode(exit_standout_mode);
+ put_crlf();
+ tc_putp(clr_eos); /* OK if missing */
+ put_crlf();
+ ptextln("If you see a diagonal line of standout X's then (msgr) should be true. If any of the blanks are standout then (msgr) should be false.");
+ sprintf(temp, "(msgr) Move-in-SGR-mode is %s in the data base",
+ move_standout_mode ? "true" : "false");
+ ptextln(temp);
+ } else {
+ ptextln("(smso) (rmso) (smacs) (rmacs) missing; (msgr) Move-in-SGR-mode not tested.");
+ }
+ generic_done_message(t, state, ch);
+}
+
+/*
+** subtest_in(test_list, status, ch)
+**
+** (in) insert null glitch
+*/
+static void
+subtest_in(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (enter_insert_mode && exit_insert_mode) {
+ ptextln("\nTesting (in) with (smir) and (rmir)");
+ putln("\tIf these two lines line up ...");
+ put_str("\tIf these two lines line up ...");
+ put_cr();
+ tc_putp(enter_insert_mode);
+ putchp(' ');
+ tc_putp(exit_insert_mode);
+ ptext("\nthen (in) should be set. ");
+ sprintf(temp,
+ "(in) Insert-null-glitch is %s in the data base.",
+ insert_null_glitch ? "true" : "false");
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+ }
+}
+
+/*
+** subtest_dadb(test_list, status, ch)
+**
+** (da) (db) data above, (db) data below
+*/
+static void
+subtest_dadb(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (can_clear_screen && scroll_reverse && scroll_forward) {
+ put_clear();
+ if (scroll_reverse)
+ ptext("(da) Data-above should be set\r");
+ home_down();
+ if (scroll_forward)
+ ptext("(db) Data-below should be set\r");
+ tc_putp(scroll_forward);
+ go_home();
+ tc_putp(scroll_reverse);
+ tc_putp(scroll_reverse);
+ home_down();
+ tc_putp(scroll_forward);
+ go_home();
+ ptextln("\n\n\n\n\nIf the top line is blank then (da) should be false.");
+ ptextln("If the bottom line is blank then (db) should be false.");
+ sprintf(temp, "\n(da) Data-above is %s, and (db) Data-below is %s, in the data base.",
+ memory_above ? "true" : "false",
+ memory_below ? "true" : "false");
+ ptextln(temp);
+ line_count = lines;
+ } else {
+ ptextln("(da) Data-above, (db) Data-below not tested, scrolls or (clear) is missing.");
+ }
+ generic_done_message(t, state, ch);
+}
diff --git a/contrib/ncurses/tack/modules b/contrib/ncurses/tack/modules
new file mode 100644
index 000000000000..79c2d2265f7b
--- /dev/null
+++ b/contrib/ncurses/tack/modules
@@ -0,0 +1,18 @@
+# $Id: modules,v 1.4 1999/04/18 01:43:32 tom Exp $
+@ base
+ansi progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+charset progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+color progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+control progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+crum progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+edit progs $(srcdir) $(srcdir)/tack.h ../include/term.h $(INCDIR)/tic.h
+fun progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+init progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+menu progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+modes progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+output progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+pad progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+scan progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+sync progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+sysdep progs $(srcdir) $(srcdir)/tack.h ../include/term.h
+tack progs $(srcdir) $(srcdir)/tack.h ../include/term.h
diff --git a/contrib/ncurses/tack/output.c b/contrib/ncurses/tack/output.c
new file mode 100644
index 000000000000..3c419a8b48bc
--- /dev/null
+++ b/contrib/ncurses/tack/output.c
@@ -0,0 +1,818 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+/* screen formatting and I/O utility functions */
+
+#include <tack.h>
+#include <time.h>
+
+MODULE_ID("$Id: output.c,v 1.4 1999/06/16 00:46:53 tom Exp $")
+
+/* globals */
+long char_sent; /* number of characters sent */
+int char_count; /* counts characters */
+int line_count; /* counts line feeds */
+int expand_chars; /* length of expand() string */
+int replace_mode; /* used to output replace mode padding */
+int can_go_home; /* TRUE if we can fashion a home command */
+int can_clear_screen; /* TRUE if we can somehow clear the screen */
+int raw_characters_sent; /* Total output characters */
+int log_count; /* Number of characters on a log line */
+
+/* translate mode default strings */
+#define TM_carriage_return TM_string[0].value
+#define TM_cursor_down TM_string[1].value
+#define TM_scroll_forward TM_string[2].value
+#define TM_newline TM_string[3].value
+#define TM_cursor_left TM_string[4].value
+#define TM_bell TM_string[5].value
+#define TM_form_feed TM_string[6].value
+#define TM_tab TM_string[7].value
+
+struct default_string_list TM_string[TM_last] = {
+ {"cr", "\r", 0},
+ {"cud1", "\n", 0},
+ {"ind", "\n", 0},
+ {"nel", "\r\n", 0},
+ {"cub1", "\b", 0},
+ {"bel", "\007", 0},
+ {"ff", "\f", 0},
+ {"ht", "\t", 0}
+};
+
+static const char *c0[32] = {
+ "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK",
+ "BEL", "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",
+ "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
+ "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"
+};
+
+static const char *c1[32] = {
+ "", "", "", "", "IND", "NEL", "SSA", "ESA",
+ "HTS", "HTJ", "VTS", "PLD", "PLU", "RI", "SS2", "SS3",
+ "DCS", "PU1", "PU2", "STS", "CCH", "MW", "SPA", "EPA",
+ "", "", "", "CSI", "ST", "OSC", "PM", "APC"
+};
+
+int
+getnext(int mask)
+{ /* get the next character without scan mode
+ conversion */
+ int ch;
+ unsigned char buf;
+
+ tc_putp(req_for_input);
+ fflush(stdout);
+ if (nodelay_read)
+ while (1) {
+ ch = read(fileno(stdin), &buf, 1);
+ if (ch == -1)
+ return EOF;
+ if (ch == 1)
+ return buf;
+ }
+ ch = getchar();
+ if (ch == EOF)
+ return EOF;
+ return ch & mask;
+}
+
+
+int
+getchp(int mask)
+{ /* read a character with scan mode conversion */
+ if (scan_mode) {
+ tc_putp(req_for_input);
+ fflush(stdout);
+ return scan_key();
+ } else
+ return getnext(mask);
+}
+
+/*
+** tc_putch(c)
+**
+** Output one character
+*/
+int
+tc_putch(int c)
+{
+ char_sent++;
+ raw_characters_sent++;
+ putchar(c);
+ if ((raw_characters_sent & 31) == 31) {
+ fflush(stdout);
+ }
+ if (log_fp) {
+ /* terminal output logging */
+ c &= 0xff;
+ if (c < 32) {
+ fprintf(log_fp, "<%s>", c0[c]);
+ log_count += 5;
+ } else
+ if (c < 127) {
+ fprintf(log_fp, "%c", c);
+ log_count += 1;
+ } else {
+ fprintf(log_fp, "<%02x>", c);
+ log_count += 4;
+ }
+ if (c == '\n' || log_count >= 80) {
+ fprintf(log_fp, "\n");
+ log_count = 0;
+ }
+ }
+ return (c);
+}
+
+/*
+** tt_tputs(string, reps)
+**
+** Output a string with tputs() translation.
+** Use this function inside timing tests.
+*/
+void
+tt_tputs(const char *string, int reps)
+{
+ int i;
+
+ if (string) {
+ for (i = 0; i < TT_MAX; i++) {
+ if (i >= ttp) {
+ tt_cap[i] = string;
+ tt_affected[i] = reps;
+ tt_count[i] = 1;
+ tt_delay[i] = msec_cost(string, reps);
+ ttp++;
+ break;
+ }
+ if (string == tt_cap[i] && reps == tt_affected[i]) {
+ tt_count[i]++;
+ tt_delay_used += tt_delay[i];
+ break;
+ }
+ }
+ (void) tputs(string, reps, tc_putch);
+ }
+}
+
+/*
+** tt_putp(string)
+**
+** Output a string with tputs() translation.
+** Use this function inside timing tests.
+*/
+void
+tt_putp(const char *string)
+{
+ tt_tputs(string, 1);
+}
+
+/*
+** tt_putparm(string, reps, arg1, arg2, ...)
+**
+** Send tt_tputs(tparm(string, args...), reps)
+** Use this function inside timing tests.
+*/
+void
+tt_putparm(
+ NCURSES_CONST char *string,
+ int reps,
+ int arg1,
+ int arg2)
+{
+ int i;
+
+ if (string) {
+ for (i = 0; i < TT_MAX; i++) {
+ if (i >= ttp) {
+ tt_cap[i] = string;
+ tt_affected[i] = reps;
+ tt_count[i] = 1;
+ tt_delay[i] = msec_cost(string, reps);
+ ttp++;
+ break;
+ }
+ if (string == tt_cap[i] && reps == tt_affected[i]) {
+ tt_count[i]++;
+ tt_delay_used += tt_delay[i];
+ break;
+ }
+ }
+ (void) tputs(tparm((NCURSES_CONST char *)string, arg1, arg2), reps, tc_putch);
+ }
+}
+
+/*
+** tc_putp(string)
+**
+** Output a string with tputs() translation.
+** Use this function instead of putp() so we can track
+** the actual number of characters sent.
+*/
+int
+tc_putp(const char *string)
+{
+ return tputs(string, 1, tc_putch);
+}
+
+
+void
+put_this(int c)
+{ /* output one character (with padding) */
+ tc_putch(c);
+ if (char_padding && replace_mode)
+ tt_putp(char_padding);
+}
+
+
+void
+put_cr(void)
+{
+ if (translate_mode && carriage_return) {
+ tt_putp(carriage_return);
+ } else {
+ tt_putp(TM_carriage_return);
+ }
+ char_count = 0;
+}
+
+
+void
+put_lf(void)
+{ /* send a linefeed (only works in RAW or
+ CBREAK mode) */
+ if (translate_mode && cursor_down) {
+ tt_putp(cursor_down);
+ } else {
+ tt_putp(TM_cursor_down);
+ }
+ line_count++;
+}
+
+
+void
+put_ind(void)
+{ /* scroll forward (only works in RAW or
+ CBREAK mode) */
+ if (translate_mode && scroll_forward) {
+ tt_putp(scroll_forward);
+ } else {
+ tt_putp(TM_scroll_forward);
+ }
+ line_count++;
+}
+
+/*
+** put_crlf()
+**
+** Send (nel) or <cr> <lf>
+*/
+void
+put_crlf(void)
+{
+ if (translate_mode && newline) {
+ tt_putp(newline);
+ } else {
+ tt_putp(TM_newline);
+ }
+ char_count = 0;
+ line_count++;
+}
+
+/*
+** put_new_lines(count)
+**
+** Send a number of newlines. (nel)
+*/
+void
+put_newlines(int n)
+{
+ while (n-- > 0) {
+ put_crlf();
+ }
+}
+
+/*
+** putchp(character)
+**
+** Send one character to the terminal.
+** This function does translation of control characters.
+*/
+void
+putchp(int c)
+{
+ switch (c) {
+ case '\b':
+ if (translate_mode && cursor_left) {
+ tt_putp(cursor_left);
+ } else {
+ tt_putp(TM_cursor_left);
+ }
+ char_count--;
+ break;
+ case 7:
+ if (translate_mode && bell) {
+ tt_putp(bell);
+ } else {
+ tt_putp(TM_bell);
+ }
+ break;
+ case '\f':
+ if (translate_mode && form_feed) {
+ tt_putp(form_feed);
+ } else {
+ tt_putp(TM_form_feed);
+ }
+ char_count = 0;
+ line_count++;
+ break;
+ case '\n':
+ put_crlf();
+ break;
+ case '\r':
+ put_cr();
+ break;
+ case '\t':
+ if (translate_mode && tab) {
+ tt_putp(tab);
+ } else {
+ tt_putp(TM_tab);
+ }
+ char_count = ((char_count / 8) + 1) * 8;
+ break;
+ default:
+ put_this(c);
+ char_count++;
+ break;
+ }
+}
+
+
+void
+put_str(const char *s)
+{ /* send the string to the terminal */
+ for (; *s; putchp(*s++));
+}
+
+
+void
+putln(const char *s)
+{ /* output a string followed by a CR LF */
+ for (; *s; putchp(*s++));
+ put_crlf();
+}
+
+
+void
+put_columns(const char *s, int len, int w)
+{ /* put out s in column format */
+ int l;
+
+ if (char_count + w > columns) {
+ put_crlf();
+ }
+ l = char_count % w;
+ if (l) {
+ while (l < w) {
+ putchp(' ');
+ l++;
+ }
+ }
+ if (char_count && char_count + len >= columns) {
+ put_crlf();
+ }
+ l = char_count;
+ put_str(s);
+ char_count = l + len;
+}
+
+
+/*
+** ptext(string)
+**
+** Output a string but do not assume the terminal will wrap to a
+** new line. Break the line at a word boundry then send a CR LF.
+** This is more estetic on 40 column terminals.
+*/
+void
+ptext(const char *s)
+{
+ const char *t;
+
+ while (*s) {
+ for (t = s + 1; *t > ' '; t++);
+ if ((char_count != 0) && ((t - s) + char_count >= columns)) {
+ put_crlf();
+ while (*s == ' ')
+ s++;
+ }
+ while (s < t) {
+ putchp(*s++);
+ }
+ }
+}
+
+
+void
+put_dec(char *f, int i)
+{ /* print a line with a decimal number in it */
+ char tm[128];
+
+ sprintf(tm, f, i / 10, i % 10);
+ ptext(tm);
+}
+
+
+void
+three_digit(char *tx, int i)
+{ /* convert the decimal number to a string of
+ at least 3 digits */
+ if (i < 1000)
+ sprintf(tx, "%d.%d", i / 10, i % 10);
+ else
+ sprintf(tx, "%d", i / 10);
+}
+
+
+void
+ptextln(const char *s)
+{ /* print the text using ptext() then add a CR
+ LF */
+ ptext(s);
+ put_crlf();
+}
+
+
+static void
+expand_one(int ch, char **v)
+{ /* expand one character */
+ char *t = *v;
+
+ if (ch & 0x80) { /* dump it in octal (yuck) */
+ *t++ = '\\';
+ *t++ = '0' + ((ch >> 6) & 3);
+ *t++ = '0' + ((ch >> 3) & 7);
+ *t++ = '0' + (ch & 7);
+ expand_chars += 4;
+ } else if (ch == 127) { /* DEL */
+ *t++ = '^';
+ *t++ = '?';
+ expand_chars += 2;
+ } else if (ch >= ' ') {
+ *t++ = ch;
+ expand_chars++;
+ } else { /* control characters */
+ *t++ = '^';
+ *t++ = ch + '@';
+ expand_chars += 2;
+ }
+ *v = t;
+}
+
+
+char *
+expand(const char *s)
+{ /* convert the string to printable form */
+ static char buf[4096];
+ char *t, *v;
+ int ch;
+
+ if (magic_cookie_glitch <= 0 && exit_attribute_mode) {
+ v = enter_reverse_mode;
+ } else {
+ v = NULL;
+ }
+ expand_chars = 0;
+ t = buf;
+ if (s) {
+ for (; (ch = *s); s++) {
+ if ((ch & 0x80) && v) { /* print it in reverse video
+ mode */
+ strcpy(t, liberated(tparm(v)));
+ for (; *t; t++);
+ expand_one(ch & 0x7f, &t);
+ strcpy(t, liberated(tparm(exit_attribute_mode)));
+ for (; *t; t++);
+ } else {
+ expand_one(ch, &t);
+ }
+ }
+ }
+ *t = '\0';
+ return buf;
+}
+
+
+char *
+print_expand(char *s)
+{ /* convert the string to 7-bit printable form */
+ static char buf[4096];
+ char *t;
+ int ch;
+
+ expand_chars = 0;
+ t = buf;
+ if (s) {
+ for (; (ch = *s); s++) {
+ expand_one(ch, &t);
+ }
+ }
+ *t = '\0';
+ return buf;
+}
+
+
+char *
+expand_to(char *s, int l)
+{ /* expand s to length l */
+ char *t;
+
+ for (s = t = expand(s); *t; t++);
+ for (; expand_chars < l; expand_chars++) {
+ *t++ = ' ';
+ }
+ *t = '\0';
+ return s;
+}
+
+
+char *
+hex_expand_to(char *s, int l)
+{ /* expand s to length l in hex */
+ static char buf[4096];
+ char *t;
+
+ for (t = buf; *s; s++) {
+ sprintf(t, "%02X ", *s & 0xff);
+ t += 3;
+ if (t - buf > (int) sizeof(buf) - 4) {
+ break;
+ }
+ }
+ for (; t - buf < l;) {
+ *t++ = ' ';
+ }
+ *t = '\0';
+ expand_chars = t - buf;
+ return buf;
+}
+
+
+char *
+expand_command(const char *c)
+{ /* expand an ANSI escape sequence */
+ static char buf[256];
+ int i, j, ch;
+ char *s;
+
+ s = buf;
+ for (i = FALSE; (ch = (*c & 0xff)); c++) {
+ if (i) {
+ *s++ = ' ';
+ }
+ i = TRUE;
+ if (ch < 32) {
+ j = c[1] & 0xff;
+ if (ch == '\033' && j >= '@' && j <= '_') {
+ ch = j - '@';
+ c++;
+ for (j = 0; (*s = c1[ch][j++]); s++);
+ } else
+ for (j = 0; (*s = c0[ch][j++]); s++);
+ } else {
+ *s++ = ch;
+ j = c[1] & 0xff;
+ if (ch >= '0' && ch <= '9' &&
+ j >= '0' && j <= '9') {
+ i = FALSE;
+ }
+ }
+ }
+ *s = '\0';
+ return buf;
+}
+
+/*
+** go_home()
+**
+** Move the cursor to the home position
+*/
+void
+go_home(void)
+{
+ int i;
+
+ if (cursor_home)
+ tt_putp(cursor_home);
+ else if (cursor_address)
+ tt_putparm(cursor_address, lines, 0, 0);
+ else if (row_address) { /* use (vpa) */
+ put_cr();
+ tt_putparm(row_address, 1, 0, 0);
+ } else if (cursor_up && cursor_to_ll) {
+ tt_putp(cursor_to_ll);
+ for (i = 1; i < lines; i++) {
+ tt_putp(cursor_up);
+ }
+ } else {
+ can_go_home = FALSE;
+ return;
+ }
+ char_count = line_count = 0;
+ can_go_home = TRUE;
+}
+
+
+void
+home_down(void)
+{ /* move the cursor to the lower left hand
+ corner */
+ int i;
+
+ if (cursor_to_ll)
+ tt_putp(cursor_to_ll);
+ else if (cursor_address)
+ tt_putparm(cursor_address, lines, lines - 1, 0);
+ else if (row_address) { /* use (vpa) */
+ put_cr();
+ tt_putparm(row_address, 1, lines - 1, 0);
+ } else if (cursor_down && cursor_home) {
+ tt_putp(cursor_home);
+ for (i = 1; i < lines; i++)
+ tt_putp(cursor_down);
+ } else
+ return;
+ char_count = 0;
+ line_count = lines - 1;
+}
+
+
+void
+put_clear(void)
+{ /* clear the screen */
+ int i;
+
+ if (clear_screen)
+ tt_tputs(clear_screen, lines);
+ else if (clr_eos && can_go_home) {
+ go_home();
+ tt_tputs(clr_eos, lines);
+ } else if (scroll_forward && !over_strike && (can_go_home || cursor_up)) {
+ /* clear the screen by scrolling */
+ put_cr();
+ if (cursor_to_ll) {
+ tt_putp(cursor_to_ll);
+ } else if (cursor_address) {
+ tt_putparm(cursor_address, lines, lines - 1, 0);
+ } else if (row_address) {
+ tt_putparm(row_address, 1, lines - 1, 0);
+ } else {
+ for (i = 1; i < lines; i++) {
+ tt_putp(scroll_forward);
+ }
+ }
+ for (i = 1; i < lines; i++) {
+ tt_putp(scroll_forward);
+ }
+ if (can_go_home) {
+ go_home();
+ } else {
+ for (i = 1; i < lines; i++) {
+ tt_putp(cursor_up);
+ }
+ }
+ } else {
+ can_clear_screen = FALSE;
+ return;
+ }
+ char_count = line_count = 0;
+ can_clear_screen = TRUE;
+}
+
+/*
+** wait_here()
+**
+** read one character from the input stream
+** If the terminal is not in RAW mode then this function will
+** wait for a <cr> or <lf>.
+*/
+int
+wait_here(void)
+{
+ char ch, cc[64];
+ char message[16];
+ int i, j;
+
+ for (i = 0; i < (int) sizeof(cc); i++) {
+ cc[i] = ch = getchp(STRIP_PARITY);
+ if (ch == '\r' || ch == '\n') {
+ put_crlf();
+ char_sent = 0;
+ return cc[i ? i - 1 : 0];
+ }
+ if (ch >= ' ') {
+ if (stty_query(TTY_CHAR_MODE)) {
+ put_crlf();
+ char_sent = 0;
+ return ch;
+ }
+ continue;
+ }
+ if (ch == 023) { /* Control S */
+ /* ignore control S, but tell me about it */
+ while (ch == 023 || ch == 021) {
+ ch = getchp(STRIP_PARITY);
+ if (i < (int) sizeof(cc))
+ cc[++i] = ch;
+ }
+ put_str("\nThe terminal sent a ^S -");
+ for (j = 0; j <= i; j++) {
+ sprintf(message, " %02X", cc[j] & 0xFF);
+ put_str(message);
+ }
+ put_crlf();
+ i = -1;
+ } else if (ch != 021) { /* Not Control Q */
+ /* could be abort character */
+ spin_flush();
+ if (tty_can_sync == SYNC_TESTED) {
+ (void) tty_sync_error();
+ } else {
+ put_str("\n? ");
+ }
+ }
+ }
+ return '?';
+}
+
+
+/*
+** read_string(buffer, length)
+**
+** Read a string of characters from the input stream.
+*/
+void
+read_string(
+ char *buf,
+ int length)
+{
+ int ch, i;
+
+ for (i = 0; i < length - 1; ) {
+ ch = getchp(STRIP_PARITY);
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ if (ch == '\b' || ch == 127) {
+ if (i) {
+ putchp('\b');
+ putchp(' ');
+ putchp('\b');
+ i--;
+ }
+ } else {
+ buf[i++] = ch;
+ putchp(ch);
+ }
+ }
+ buf[i] = '\0';
+ put_crlf();
+ char_sent = 0;
+}
+
+/*
+** maybe_wait(lines)
+**
+** wait if near the end of the screen, then clear screen
+*/
+void
+maybe_wait(int n)
+{
+ if (line_count + n >= lines) {
+ if (char_sent != 0) {
+ ptext("Go? ");
+ (void) wait_here();
+ }
+ put_clear();
+ } else {
+ put_crlf();
+ }
+}
diff --git a/contrib/ncurses/tack/pad.c b/contrib/ncurses/tack/pad.c
new file mode 100644
index 000000000000..bc6c6933e614
--- /dev/null
+++ b/contrib/ncurses/tack/pad.c
@@ -0,0 +1,1955 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: pad.c,v 1.1 1998/01/10 00:30:27 tom Exp $")
+
+/* test the pad counts on the terminal */
+
+static void pad_standard(struct test_list *, int *, int *);
+static void init_xon_xoff(struct test_list *, int *, int *);
+static void init_cup(struct test_list *, int *, int *);
+static void pad_rmxon(struct test_list *, int *, int *);
+static void pad_home1(struct test_list *, int *, int *);
+static void pad_home2(struct test_list *, int *, int *);
+static void pad_clear(struct test_list *, int *, int *);
+static void pad_ech(struct test_list *, int *, int *);
+static void pad_el1(struct test_list *, int *, int *);
+static void pad_el(struct test_list *, int *, int *);
+static void pad_smdc(struct test_list *, int *, int *);
+static void pad_dch(struct test_list *, int *, int *);
+static void pad_dch1(struct test_list *, int *, int *);
+static void pad_smir(struct test_list *, int *, int *);
+static void pad_ich(struct test_list *, int *, int *);
+static void pad_ich1(struct test_list *, int *, int *);
+static void pad_xch1(struct test_list *, int *, int *);
+static void pad_rep(struct test_list *, int *, int *);
+static void pad_cup(struct test_list *, int *, int *);
+static void pad_hd(struct test_list *, int *, int *);
+static void pad_hu(struct test_list *, int *, int *);
+static void pad_rin(struct test_list *, int *, int *);
+static void pad_il(struct test_list *, int *, int *);
+static void pad_indn(struct test_list *, int *, int *);
+static void pad_dl(struct test_list *, int *, int *);
+static void pad_xl(struct test_list *, int *, int *);
+static void pad_scrc(struct test_list *, int *, int *);
+static void pad_csrind(struct test_list *, int *, int *);
+static void pad_sccsrrc(struct test_list *, int *, int *);
+static void pad_csr_nel(struct test_list *, int *, int *);
+static void pad_csr_cup(struct test_list *, int *, int *);
+static void pad_ht(struct test_list *, int *, int *);
+static void pad_smso(struct test_list *, int *, int *);
+static void pad_smacs(struct test_list *, int *, int *);
+static void pad_crash(struct test_list *, int *, int *);
+
+extern struct test_menu change_pad_menu;
+
+/*
+ Any command found in this list, executed from a "Done" prompt
+ will force the default action to repeat rather than next.
+*/
+const char *pad_repeat_test = {"ep-+<>"};
+
+struct test_list pad_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {0, 0, 0, 0, "p) change padding", 0, &change_pad_menu},
+ {0, 0, 0, 0, "@) display statistics about the last test", dump_test_stats, 0},
+ {0, 0, 0, 0, "c) clear screen", menu_clear_screen, 0},
+ {0, 0, 0, 0, "i) send reset and init", menu_reset_init, 0},
+ {0, 0, 0, 0, txt_longer_test_time, longer_test_time, 0},
+ {0, 0, 0, 0, txt_shorter_test_time, shorter_test_time, 0},
+ {0, 0, 0, 0, txt_longer_augment, longer_augment, 0},
+ {0, 0, 0, 0, txt_shorter_augment, shorter_augment, 0},
+ /***
+ Phase 1: Test initialization and reset strings.
+
+ (rs1) (rs2) (rs3) (is1) (is2) (is3) are very difficult to test.
+ They have no defined output. To make matters worse, the cap
+ builder could partition (rs1) (rs2) (rs3) by length, leaving the
+ terminal in some unknown state between (rs1) and (rs2) or between
+ (r2) and (rs3). Some reset strings clear the screen when done.
+
+ We have no control over this. The only thing we can do for
+ certain is to test the pad times by checking for overruns.
+ ***/
+ {MENU_NEXT, 3, "rs1", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "rs2", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "rs3", 0, 0, pad_standard, 0},
+ {MENU_NEXT | MENU_INIT, 0, 0, 0, 0, init_xon_xoff, 0},
+ {MENU_NEXT, 3, "is1", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "is2", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "is3", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "rmxon", "smxon", 0, pad_rmxon, 0},
+ {MENU_NEXT | MENU_INIT, 0, 0, 0, 0, init_cup, 0},
+ /*
+ Phase 2: Test home, screen clears and erases.
+ */
+ {MENU_NEXT, 0, "home", 0, 0, pad_home1, 0},
+ {MENU_NEXT, 0, "home) (nel", 0, 0, pad_home2, 0},
+ {MENU_NEXT | 1, 0, "clear", 0, 0, pad_clear, 0},
+ {MENU_NEXT | MENU_LM1, 0, "ed", 0, 0, pad_clear, 0},
+ {MENU_NEXT | MENU_80c, 0, "ech", 0, 0, pad_ech, 0},
+ {MENU_NEXT | MENU_80c, 0, "el1", "cub1 nel", 0, pad_el1, 0},
+ {MENU_NEXT | MENU_10c, 0, "el", "nel", 0, pad_el, 0},
+ /*
+ Phase 3: Character deletions and insertions
+ */
+ {MENU_NEXT, 0, "smdc) (rmdc", 0, 0, pad_smdc, 0},
+ {MENU_NEXT | MENU_80c, 0, "dch", "smdc rmdc", 0, pad_dch, 0},
+ {MENU_NEXT | MENU_80c, 0, "dch1", "smdc rmdc", 0, pad_dch1, 0},
+ {MENU_NEXT, 0, "smir) (rmir", 0, 0, pad_smir, 0},
+ {MENU_NEXT | MENU_90c, 0, "ich) (ip", "smir rmir", 0, pad_ich, 0},
+ {MENU_NEXT | MENU_90c, 0, "ich1) (ip", "smir rmir", 0, pad_ich1, 0},
+ {MENU_NEXT, 4, "ich1) (dch1", "smir rmir", 0, pad_xch1, 0},
+ {MENU_NEXT | MENU_90c, 0, "rep", 0, 0, pad_rep, 0},
+ /*
+ Phase 4: Test cursor addressing pads.
+ */
+ {MENU_NEXT, 0, "cup", 0, 0, pad_cup, 0},
+ /*
+ Phase 5: Test scrolling and cursor save/restore.
+ */
+ {MENU_NEXT, 0, "hd", 0, 0, pad_hd, 0},
+ {MENU_NEXT, 0, "hu", 0, 0, pad_hu, 0},
+ {MENU_NEXT | MENU_LM1 | 1, 0, "rin", 0, 0, pad_rin, 0},
+ {MENU_NEXT, 0, "ri", 0, 0, pad_rin, 0},
+ {MENU_NEXT | MENU_LM1 | 1, 0, "il", 0, 0, pad_il, 0},
+ {MENU_NEXT, 0, "il1", 0, 0, pad_il, 0},
+ {MENU_NEXT | MENU_LM1 | 1, 0, "indn", 0, 0, pad_indn, 0},
+ {MENU_NEXT, 0, "ind", 0, 0, pad_indn, 0},
+ {MENU_NEXT | MENU_LM1 | 1, 0, "dl", 0, 0, pad_dl, 0},
+ {MENU_NEXT, 0, "dl1", 0, 0, pad_dl, 0},
+ {MENU_NEXT, 0, "il1) (dl1", 0, 0, pad_xl, 0},
+ {MENU_NEXT, 0, "sc) (rc", 0, 0, pad_scrc, 0},
+ {MENU_NEXT | MENU_50l, 0, "csr) (ind", 0, 0, pad_csrind, 0},
+ {MENU_NEXT, 0, "sc) (csr) (rc", 0, 0, pad_sccsrrc, 0},
+ {MENU_NEXT, 0, "csr) (nel", "sc rc", 0, pad_csr_nel, 0},
+ {MENU_NEXT, 0, "csr) (cup", 0, 0, pad_csr_cup, 0},
+ /*
+ Phase 6: Test tabs.
+ */
+ {MENU_NEXT, 0, "ht", 0, 0, pad_ht, 0},
+ /*
+ Phase 7: Test character-set-switch pads.
+ */
+ {MENU_NEXT, 0, "smso) (rmso", 0, 0, pad_smso, 0},
+ {MENU_NEXT, 0, "smacs) (rmacs", 0, 0, pad_smacs, 0},
+ /*
+ Phase 8: Tests for miscellaneous mode-switch pads.
+ */
+ {MENU_NEXT, 3, "flash", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "smkx", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "rmkx", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "smm", 0, 0, pad_standard, 0},
+ {MENU_NEXT, 3, "rmm", 0, 0, pad_standard, 0},
+ /*
+ Phase 9: Test crash-and-burn properties of unpadded (clear).
+ */
+ {0, 0, "clear", "xon", "k) run clear test with no padding", pad_crash, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+extern int test_complete; /* counts number of tests completed */
+
+/* globals */
+int hzcc; /* horizontal character count */
+char letter; /* current character being displayed */
+int letter_number; /* points into letters[] */
+int augment, repeats; /* number of characters (or lines) effected */
+char letters[] = "AbCdefghiJklmNopQrStuVwXyZ";
+
+static char every_line[] = "This text should be on every line.";
+static char all_lines[] = "Each char on any line should be the same. ";
+static char above_line[] = "The above lines should be all Xs. ";
+static char no_visual[] = "This loop test has no visual failure indicator. ";
+
+/*
+** pad_standard(test_list, status, ch)
+**
+** Run a single cap pad test.
+*/
+static void
+pad_standard(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ const char *long_name;
+ char *cap;
+ int l = 2, i;
+ char tbuf[128];
+
+ if ((cap = get_string_cap_byname(t->caps_done, &long_name))) {
+ sprintf(tbuf, "(%s) %s, start testing", t->caps_done,
+ long_name);
+ if (skip_pad_test(t, state, ch, tbuf)) {
+ return;
+ }
+ i = 1;
+ pad_test_startup(1);
+ do {
+ if (i >= columns) {
+ page_loop();
+ l++;
+ i = 1;
+ }
+ tt_putp(cap);
+ putchp(letter);
+ i++;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ if (l >= lines) {
+ home_down();
+ } else {
+ put_crlf();
+ }
+ ptextln(no_visual);
+ } else {
+ CAP_NOT_FOUND;
+ /* Note: get_string_cap_byname() always sets long_name */
+ sprintf(temp, "(%s) %s, not present. ", t->caps_done,
+ long_name);
+ ptext(temp);
+ }
+ pad_done_message(t, state, ch);
+}
+
+/*
+** init_xon_xoff(test_list, status, ch)
+**
+** Initialize the xon_xoff values
+*/
+static void
+init_xon_xoff(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ /* the reset strings may dink with the XON/XOFF modes */
+ if (select_xon_xoff == 0 && exit_xon_mode) {
+ tc_putp(exit_xon_mode);
+ }
+ if (select_xon_xoff == 1 && enter_xon_mode) {
+ tc_putp(enter_xon_mode);
+ }
+}
+
+/*
+** pad_rmxon(test_list, status, ch)
+**
+** Test (rmxon) exit XON/XOFF mode
+*/
+static void
+pad_rmxon(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (select_xon_xoff == 0 && exit_xon_mode) {
+ pad_standard(t, state, ch);
+ }
+}
+
+/*
+** init_cup(test_list, status, ch)
+**
+** Send the initialization strings for XON/XOFF and (smcup)
+** Stop pad testing if clear screen is missing.
+*/
+static void
+init_cup(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ init_xon_xoff(t, state, ch);
+ if (enter_ca_mode) {
+ tc_putp(enter_ca_mode);
+ }
+ if (!can_clear_screen) {
+ ptext("(clear) clear screen not present,");
+ ptext(" pad processing terminated. ");
+ pad_done_message(t, state, ch);
+ if (*ch == 0 || *ch == 'n' || *ch == 's' || *ch == 'r') {
+ *ch = '?';
+ }
+ return;
+ }
+}
+
+/*
+** pad_home1(test_list, status, ch)
+**
+** Test (home) when (am) is set.
+*/
+static void
+pad_home1(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int j, k;
+
+ if (can_go_home && auto_right_margin) {
+ /*
+ truly brain damaged terminals will fail this test because
+ they cannot accept data at full rate
+ */
+ if (skip_pad_test(t, state, ch, "(home) Home start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (j = 1; j < lines; j++) {
+ for (k = 0; k < columns; k++) {
+ if (k & 0xF) {
+ put_this(letter);
+ } else {
+ put_this('.');
+ }
+ }
+ SLOW_TERMINAL_EXIT;
+ }
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext("All the dots should line up. ");
+ pad_done_message(t, state, ch);
+ put_clear();
+ }
+}
+
+/*
+** pad_home2(test_list, status, ch)
+**
+** Test (home) and (nel). (am) is reset.
+*/
+static void
+pad_home2(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int j, k;
+
+ if (can_go_home) {
+ if (skip_pad_test(t, state, ch,
+ "(home) Home, (nel) newline start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (j = 1; j < lines; j++) {
+ for (k = 2; k < columns; k++) {
+ if (k & 0xF) {
+ put_this(letter);
+ } else {
+ put_this('.');
+ }
+ }
+ put_crlf(); /* this does the (nel) */
+ SLOW_TERMINAL_EXIT;
+ }
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext("All the dots should line up. ");
+ pad_done_message(t, state, ch);
+ put_clear();
+ }
+}
+
+/*
+** pad_clear(test_list, status, ch)
+**
+** Test (clear) and (ed)
+** run the clear screen tests (also clear-to-end-of-screen)
+**
+** 0) full page
+** 1) sparse page
+** 2) short lines
+** 3) one full line
+** 4) one short line
+*/
+static void
+pad_clear(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ const char *end_message = 0;
+ const char *txt;
+ int j, k, is_clear;
+ int clear_select; /* select the test number */
+
+ is_clear = t->flags & 1;
+ clear_select = auto_right_margin ? 0 : 1;
+ if (is_clear) {
+ txt = "(clear) clear-screen start testing";
+ } else {
+ if (!clr_eos) {
+ CAP_NOT_FOUND;
+ ptext("(ed) erase-to-end-of-display, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ txt = "(ed) erase-to-end-of-display start testing";
+ }
+ if (skip_pad_test(t, state, ch, txt)) {
+ return;
+ }
+ if (enter_am_mode) {
+ tc_putp(enter_am_mode);
+ clear_select = 0;
+ }
+ for (; clear_select < 5; clear_select++) {
+ if (augment > lines || is_clear || !cursor_address) {
+ augment = lines;
+ } else {
+ if (augment <= 1) {
+ augment = 2;
+ }
+ if (augment < lines) {
+ put_clear();
+ tt_putparm(cursor_address, 1,
+ lines - augment - 1, 0);
+ ptextln("This line should not be erased (ed)");
+ }
+ }
+ repeats = augment;
+ switch (clear_select) {
+ case 0:
+ end_message = "Clear full screen. ";
+ break;
+ case 1:
+ end_message = "Clear sparse screen. ";
+ if (cursor_down) {
+ break;
+ }
+ clear_select++;
+ case 2:
+ end_message = "Clear one character per line. ";
+ if (newline) {
+ break;
+ }
+ clear_select++;
+ case 3:
+ end_message = "Clear one full line. ";
+ break;
+ case 4:
+ end_message = "Clear single short line. ";
+ break;
+ }
+ pad_test_startup(0);
+ do {
+ switch (clear_select) {
+ case 0: /* full screen test */
+ for (j = 1; j < repeats; j++) {
+ for (k = 0; k < columns; k++) {
+ if (k & 0xF) {
+ put_this(letter);
+ } else {
+ put_this('.');
+ }
+ }
+ SLOW_TERMINAL_EXIT;
+ }
+ break;
+ case 1: /* sparse screen test */
+ for (j = columns - repeats; j > 2; j--) {
+ put_this(letter);
+ }
+ for (j = 2; j < repeats; j++) {
+ tt_putp(cursor_down);
+ put_this(letter);
+ }
+ break;
+ case 2: /* short lines */
+ for (j = 2; j < repeats; j++) {
+ put_this(letter);
+ tt_putp(newline);
+ }
+ put_this(letter);
+ break;
+ case 3: /* one full line */
+ for (j = columns - 5; j > 1; j--) {
+ put_this(letter);
+ }
+ break;
+ case 4: /* one short line */
+ put_str("Erase this!");
+ break;
+ }
+ if (is_clear) {
+ put_clear();
+ } else {
+ if (augment == lines) {
+ go_home();
+ } else {
+ tt_putparm(cursor_address, 1,
+ lines - repeats, 0);
+ }
+ tt_tputs(clr_eos, repeats);
+ }
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 1);
+ ptext(end_message);
+
+ pad_done_message(t, state, ch);
+
+ if (*ch != 0 && *ch != 'n') {
+ return;
+ }
+ }
+}
+
+/*
+** pad_ech(test_list, status, ch)
+**
+** Test (ech) erase characters
+*/
+static void
+pad_ech(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!erase_chars) {
+ CAP_NOT_FOUND;
+ ptext("(ech) Erase-characters, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(ech) Erase-characters start testing")) {
+ return;
+ }
+ if (augment > columns - 2) {
+ augment = columns - 2;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (i = 2; i < lines; i++) {
+ for (j = 0; j <= repeats; j++) {
+ putchp(letter);
+ }
+ put_cr();
+ tt_putparm(erase_chars, repeats, repeats, 0);
+ put_crlf();
+ SLOW_TERMINAL_EXIT;
+ }
+ for (i = 1; i <= repeats; i++) {
+ putchp(' ');
+ }
+ putchp(letter);
+ put_crlf();
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext(all_lines);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_el1(test_list, status, ch)
+**
+** Test (el1) erase to start of line also (cub1) and (nel)
+*/
+static void
+pad_el1(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!clr_bol) {
+ CAP_NOT_FOUND;
+ ptext("(el1) Erase-to-beginning-of-line, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(el1) Erase-to-beginning-of-line start testing")) {
+ return;
+ }
+ if (augment > columns - 2) {
+ augment = columns - 2;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (i = 2; i < lines; i++) {
+ for (j = 0; j <= repeats; j++) {
+ putchp(letter);
+ }
+ tt_putp(cursor_left);
+ tt_putp(cursor_left);
+ tt_tputs(clr_bol, repeats);
+ put_crlf();
+ SLOW_TERMINAL_EXIT;
+ }
+ for (i = 1; i <= repeats; i++) {
+ putchp(' ');
+ }
+ putchp(letter);
+ put_crlf();
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext(all_lines);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_el(test_list, status, ch)
+**
+** Test (el) clear to end of line also (nel)
+*/
+static void
+pad_el(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!clr_eol) {
+ CAP_NOT_FOUND;
+ ptext("(el) Clear-to-end-of-line, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(el) Clear-to-end-of-line start testing")) {
+ return;
+ }
+ hzcc = columns * 8 / 10; /* horizontal character count */
+ if (augment > hzcc) {
+ augment = hzcc;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (i = 2; i < lines; i++) {
+ for (j = -1; j < augment; j++) {
+ putchp(letter);
+ }
+ put_cr();
+ putchp(letter);
+ tt_putp(clr_eol);
+ put_crlf();
+ SLOW_TERMINAL_EXIT;
+ }
+ putchp(letter);
+ put_crlf();
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext(all_lines);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_smdc(test_list, status, ch)
+**
+** Test (smdc) (rmdc) Delete mode
+*/
+static void
+pad_smdc(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (!enter_delete_mode) {
+ CAP_NOT_FOUND;
+ ptext("(smdc) Enter-delete-mode");
+ if (!exit_delete_mode) {
+ ptext(", (rmdc) Exit-delete-mode");
+ }
+ ptext(", not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(smdc) (rmdc) Enter/Exit-delete-mode start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ page_loop();
+ for (i = 1; i < columns; i++) {
+ tt_putp(enter_delete_mode);
+ tt_putp(exit_delete_mode);
+ putchp(letter);
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext(no_visual);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_dch(test_list, status, ch)
+**
+** Test (smdc) (rmdc) Delete mode and (dch)
+*/
+static void
+pad_dch(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!parm_dch) {
+ CAP_NOT_FOUND;
+ ptext("(dch) Delete-characters, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(dch) Delete-characters start testing")) {
+ return;
+ }
+ hzcc = columns * 8 / 10; /* horizontal character count */
+ if (augment > hzcc) {
+ augment = hzcc;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (i = 2; i < lines; i++) {
+ for (j = 0; j <= repeats; j++) {
+ putchp(letter);
+ }
+ put_cr();
+ tt_putp(enter_delete_mode);
+ tt_putparm(parm_dch, repeats, repeats, 0);
+ tt_putp(exit_delete_mode);
+ put_crlf();
+ SLOW_TERMINAL_EXIT;
+ }
+ putchp(letter);
+ put_crlf();
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext(all_lines);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_dch1(test_list, status, ch)
+**
+** Test (smdc) (rmdc) Delete mode and (dch1)
+*/
+static void
+pad_dch1(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!delete_character) {
+ if (parm_dch) {
+ /* if the other one is defined then its OK */
+ return;
+ }
+ CAP_NOT_FOUND;
+ ptext("(dch1) Delete-character, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(dch1) Delete-character start testing")) {
+ return;
+ }
+ hzcc = columns * 8 / 10; /* horizontal character count */
+ if (augment > hzcc) {
+ augment = hzcc;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (i = 2; i < lines; i++) {
+ for (j = -1; j < augment; j++) {
+ putchp(letter);
+ }
+ put_cr();
+ tt_putp(enter_delete_mode);
+ for (j = 0; j < augment; j++) {
+ tt_putp(delete_character);
+ }
+ tt_putp(exit_delete_mode);
+ put_crlf();
+ SLOW_TERMINAL_EXIT;
+ }
+ putchp(letter);
+ put_crlf();
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext(all_lines);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_smir(test_list, status, ch)
+**
+** Test (smir) (rmir) Insert mode
+*/
+static void
+pad_smir(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (!enter_insert_mode) {
+ CAP_NOT_FOUND;
+ ptext("(smir) Enter-insert-mode");
+ if (!exit_insert_mode) {
+ ptext(", (rmir) Exit-insert-mode");
+ }
+ ptext(", not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(smir) (rmir) Enter/Exit-insert-mode start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ page_loop();
+ for (i = 1; i < columns; i++) {
+ tt_putp(enter_insert_mode);
+ tt_putp(exit_insert_mode);
+ putchp(letter);
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext(no_visual);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_ich(test_list, status, ch)
+**
+** Test (smir) (rmir) Insert mode and (ich) and (ip)
+*/
+static void
+pad_ich(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!parm_ich) {
+ CAP_NOT_FOUND;
+ ptext("(ich) Insert-characters, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(ich) Insert-characters, (ip) Insert-padding start testing")) {
+ return;
+ }
+ j = columns * 9 / 10;
+ if (augment > j) {
+ augment = j;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (i = 2; i < lines; i++) {
+ putchp(letter);
+ put_cr();
+ tt_putp(enter_insert_mode);
+ replace_mode = 0;
+ tt_putparm(parm_ich, repeats, repeats, 0);
+ tt_putp(exit_insert_mode);
+ replace_mode = 1;
+ put_crlf();
+ SLOW_TERMINAL_EXIT;
+ }
+ for (i = 0; i < repeats; i++) {
+ putchp(' ');
+ }
+ putchp(letter);
+ NEXT_LETTER;
+ put_crlf();
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext(all_lines);
+ pad_done_message(t, state, ch);
+ tc_putp(exit_insert_mode);
+}
+
+/*
+** pad_ich1(test_list, status, ch)
+**
+** Test (smir) (rmir) Insert mode and (ich1) and (ip)
+*/
+static void
+pad_ich1(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!insert_character) {
+ CAP_NOT_FOUND;
+ ptext("(ich1) Insert-character, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(ich1) Insert-character, (ip) Insert-padding start testing")) {
+ return;
+ }
+ if (augment > columns - 2) {
+ augment = columns - 2;
+ }
+ pad_test_startup(1);
+ do {
+ put_clear();
+ for (i = 2; i < lines; i++) {
+ putchp(letter);
+ put_cr();
+ tt_putp(enter_insert_mode);
+ replace_mode = 0;
+ if (!insert_padding && !insert_character) {
+ /* only enter/exit is needed */
+ for (j = 0; j < augment; j++) {
+ putchp('.');
+ }
+ } else {
+ for (j = 0; j < augment; j++) {
+ tt_putp(insert_character);
+ putchp('.');
+ tt_putp(insert_padding);
+ }
+ }
+ tt_putp(exit_insert_mode);
+ replace_mode = 1;
+ put_crlf();
+ SLOW_TERMINAL_EXIT;
+ }
+ for (j = 0; j < augment; j++) {
+ putchp('.');
+ }
+ putchp(letter);
+ NEXT_LETTER;
+ put_crlf();
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptext(all_lines);
+ pad_done_message(t, state, ch);
+ tc_putp(exit_insert_mode);
+}
+
+/*
+** pad_xch1(test_list, status, ch)
+**
+** Test (ich1) (ip) (dch1)
+*/
+static void
+pad_xch1(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ static char xch1[] =
+ "This line should not be garbled. It should be left justified.";
+
+ if (enter_insert_mode || exit_insert_mode ||
+ enter_delete_mode || exit_delete_mode ||
+ !insert_character || !delete_character) {
+ /* this test is quitely ignored */
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(ich1) Insert-character, (dch1) Delete-character start testing")) {
+ return;
+ }
+ put_crlf();
+ ptext(xch1);
+ put_cr();
+ pad_test_startup(0);
+ do {
+ tt_putp(insert_character);
+ tt_putp(delete_character);
+ } while(still_testing());
+ pad_test_shutdown(t, 1);
+ ptextln(xch1);
+ ptext("The preceeding two lines should be the same. ");
+ pad_done_message(t, state, ch);
+}
+
+/*
+** pad_rep(test_list, status, ch)
+**
+** Test (rep) repeat character
+*/
+static void
+pad_rep(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!repeat_char) {
+ CAP_NOT_FOUND;
+ ptext("(rep) Repeat-character, not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(rep) Repeat-character start testing")) {
+ return;
+ }
+ if (augment > columns - 2) {
+ augment = columns - 2;
+ }
+ if (augment < 2) {
+ augment = 2;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (i = 2; i < lines; i++) {
+ tt_putparm(repeat_char, repeats, letter, repeats);
+ put_crlf();
+ }
+ for (j = 0; j < repeats; j++) {
+ putchp(letter);
+ }
+ put_crlf();
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptextln(all_lines);
+ pad_done_message(t, state, ch);
+}
+
+/*
+** pad_cup(test_list, status, ch)
+**
+** Test (cup) Cursor address
+*/
+static void
+pad_cup(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j, l, r, c;
+
+ if (!cursor_address) {
+ CAP_NOT_FOUND;
+ ptext("(cup) Cursor-address not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(cup) Cursor-address start testing")) {
+ return;
+ }
+ put_clear();
+ ptext("Each line should be filled with the same letter. There should");
+ ptext(" be no gaps, or single letters scattered over the screen. ");
+ if (char_count + 15 > columns) {
+ put_crlf();
+ }
+ if (((lines - line_count) & 1) == 0) {
+ /* this removes the gap in the middle of the test when the
+ number of lines is odd. */
+ put_crlf();
+ }
+ r = line_count;
+ c = char_count;
+ l = (columns - 4) >> 1;
+ pad_test_startup(0);
+ do {
+ for (i = 1; i + i + r < lines; i++) {
+ for (j = 0; j <= l; j++) {
+ tt_putparm(cursor_address, 1, r + i, j);
+ putchp(letter);
+ tt_putparm(cursor_address, 1, r + i, l + l + 1 - j);
+ putchp(letter);
+ tt_putparm(cursor_address, 1, lines - i, j);
+ putchp(letter);
+ tt_putparm(cursor_address, 1, lines - i, l + l + 1 - j);
+ putchp(letter);
+ }
+ SLOW_TERMINAL_EXIT;
+ }
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ tt_putparm(cursor_address, 1, line_count = r, char_count = c);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_hd(test_list, status, ch)
+**
+** Test (hd) Half down
+*/
+static void
+pad_hd(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j, k;
+
+ if (!down_half_line) {
+ CAP_NOT_FOUND;
+ ptext("(hd) Half-line-down not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(hd) Half-line-down start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ for (i = 1; i < columns; i += 2) {
+ for (j = 1; j < i; ++j) {
+ putchp(' ');
+ }
+ tt_putp(down_half_line);
+ for (k = lines + lines; k > 4; k--) {
+ if (j++ >= columns) {
+ break;
+ }
+ tt_putp(down_half_line);
+ putchp(letter);
+ }
+ go_home();
+ SLOW_TERMINAL_EXIT;
+ }
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_hu(test_list, status, ch)
+**
+** Test (hu) Half line up
+*/
+static void
+pad_hu(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j, k;
+
+ if (!up_half_line) {
+ CAP_NOT_FOUND;
+ ptext("(hu) Half-line-up not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(hu) Half-line-up start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ for (i = 1; i < columns; i += 2) {
+ home_down();
+ for (j = 1; j < i; ++j) {
+ putchp(' ');
+ }
+ tt_putp(up_half_line);
+ for (k = lines + lines; k > 4; k--) {
+ if (j++ >= columns) {
+ break;
+ }
+ tt_putp(up_half_line);
+ putchp(letter);
+ }
+ SLOW_TERMINAL_EXIT;
+ }
+ go_home();
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_rin(test_list, status, ch)
+**
+** Test (rin) and (ri) Reverse index
+*/
+static void
+pad_rin(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+ const char *start_message;
+
+ if (t->flags & 1) {
+ /* rin */
+ if (!parm_rindex) {
+ CAP_NOT_FOUND;
+ ptext("(rin) Scroll-reverse-n-lines not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(rin) Scroll-reverse-n-lines start testing";
+ } else {
+ /* ri */
+ if (!scroll_reverse) {
+ CAP_NOT_FOUND;
+ ptext("(ri) Scroll-reverse not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(ri) Scroll-reverse start testing";
+ augment = 1;
+ }
+ if (skip_pad_test(t, state, ch, start_message)) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ sprintf(temp, "%d\r", test_complete);
+ put_str(temp);
+ if (scroll_reverse && augment == 1) {
+ tt_putp(scroll_reverse);
+ } else {
+ tt_putparm(parm_rindex, repeats, repeats, 0);
+ }
+ } while(still_testing());
+ put_str("This line should be on the bottom.\r");
+ if (scroll_reverse && augment == 1) {
+ for (i = 1; i < lines; i++) {
+ tt_putp(scroll_reverse);
+ }
+ } else {
+ tt_putparm(parm_rindex, lines - 1, lines - 1, 0);
+ }
+ putln("The screen should have text on the bottom line.");
+ sprintf(temp, "Scroll reverse %d line%s. ", augment,
+ augment == 1 ? "" : "s");
+ put_str(temp);
+ pad_test_shutdown(t, 0);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_il(test_list, status, ch)
+**
+** Test (il) and (il1) Insert line
+*/
+static void
+pad_il(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+ const char *start_message;
+
+ if (t->flags & 1) {
+ /* il */
+ if (!parm_insert_line) {
+ CAP_NOT_FOUND;
+ ptext("(il) Insert-lines not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(il) Insert-lines start testing";
+ } else {
+ /* il1 */
+ if (!insert_line) {
+ CAP_NOT_FOUND;
+ ptext("(il1) Insert-line not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(il1) Insert-line start testing";
+ augment = 1;
+ }
+ if (skip_pad_test(t, state, ch, start_message)) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ sprintf(temp, "%d\r", test_complete);
+ put_str(temp);
+ if (insert_line && repeats == 1) {
+ tt_putp(insert_line);
+ } else {
+ tt_putparm(parm_insert_line, repeats, repeats, 0);
+ }
+ } while(still_testing());
+ put_str("This line should be on the bottom.\r");
+ if (scroll_reverse && augment == 1) {
+ for (i = 1; i < lines; i++) {
+ tt_putp(insert_line);
+ }
+ } else {
+ tt_putparm(parm_insert_line, lines - 1, lines - 1, 0);
+ }
+ putln("The screen should have text on the bottom line.");
+ sprintf(temp, "Insert %d line%s. ", augment,
+ augment == 1 ? "" : "s");
+ put_str(temp);
+ pad_test_shutdown(t, 0);
+ pad_done_message(t, state, ch);
+ put_clear();
+}
+
+/*
+** pad_indn(test_list, status, ch)
+**
+** Test (indn) and (ind) Scroll forward
+*/
+static void
+pad_indn(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+ const char *start_message;
+
+ if (t->flags & 1) {
+ /* indn */
+ if (!parm_index) {
+ CAP_NOT_FOUND;
+ ptext("(indn) Scroll-forward-n-lines not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(indn) Scroll-forward-n-lines start testing";
+ } else {
+ /* ind */
+ if (!scroll_forward && over_strike) {
+ CAP_NOT_FOUND;
+ ptext("(ind) Scroll-forward not tested on overstrike terminals. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(ind) Scroll-forward start testing";
+ augment = 1;
+ }
+ if (skip_pad_test(t, state, ch, start_message)) {
+ return;
+ }
+ pad_test_startup(1);
+ /* go to the bottom of the screen */
+ home_down();
+ do {
+ sprintf(temp, "%d\r", test_complete);
+ put_str(temp);
+ if (augment > 1) {
+ tt_putparm(parm_index, repeats, repeats, 0);
+ } else {
+ put_ind();
+ }
+ } while(still_testing());
+ put_str("This line should be on the top.\r");
+ if (augment == 1) {
+ for (i = 1; i < lines; i++) {
+ put_ind();
+ }
+ } else {
+ tt_putparm(parm_index, lines - 1, lines - 1, 0);
+ }
+ go_home();
+ sprintf(temp, "\nScroll forward %d line%s. ", augment,
+ augment == 1 ? "" : "s");
+ put_str(temp);
+ pad_test_shutdown(t, 0);
+ pad_done_message(t, state, ch);
+}
+
+/*
+** pad_dl(test_list, status, ch)
+**
+** Test (dl) and (dl1) Delete lines
+*/
+static void
+pad_dl(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i = 0;
+ const char *start_message;
+
+ if (t->flags & 1) {
+ /* dl */
+ if (!parm_delete_line) {
+ CAP_NOT_FOUND;
+ ptext("(dl) Delete-lines not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(dl) Delete-lines start testing";
+ } else {
+ /* dl1 */
+ if (!delete_line) {
+ CAP_NOT_FOUND;
+ ptext("(dl1) Delete-line not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ start_message = "(dl1) Delete-line start testing";
+ augment = 1;
+ }
+ if (skip_pad_test(t, state, ch, start_message)) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ sprintf(temp, "%d\r", test_complete);
+ if ((i & 0x7f) == 0 && augment < lines - 1) {
+ go_home();
+ putln(temp);
+ }
+ put_str(temp);
+ if (repeats || !delete_line) {
+ tt_putparm(parm_delete_line, repeats, repeats, 0);
+ } else {
+ tt_putp(delete_line);
+ }
+ } while(still_testing());
+ home_down();
+ put_str("This line should be on the top.");
+ go_home();
+ if (repeats || !delete_line) {
+ tt_putparm(parm_delete_line, lines - 1, lines - 1, 0);
+ } else {
+ for (i = 1; i < lines; i++) {
+ tt_putp(delete_line);
+ }
+ }
+ sprintf(temp, "\nDelete %d line%s. ", augment,
+ augment == 1 ? "" : "s");
+ put_str(temp);
+ pad_test_shutdown(t, 0);
+ pad_done_message(t, state, ch);
+}
+
+/*
+** pad_xl(test_list, status, ch)
+**
+** Test (il1) Insert and (dl1) Delete lines
+*/
+static void
+pad_xl(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ if (!insert_line && !delete_line) {
+ /* quietly skip this test */
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(il1) Insert-line, (dl1) Delete-line start testing")) {
+ return;
+ }
+ put_clear();
+ putln("\rThis text is written on the first line.");
+ ptext("This sentence begins on the second line. As this");
+ ptext(" test runs the bottom part of this paragraph will");
+ ptext(" jump up and down. Don't worry, that's normal. When");
+ ptext(" the jumping stops, the entire paragraph should");
+ ptext(" still be on the screen and in the same place as when");
+ ptext(" the test started. If this paragraph has scrolled");
+ ptext(" off the top or bottom of the screen then the test");
+ ptext(" has failed. Scrolling off the top of the screen");
+ ptext(" usually means that the delete line capability is");
+ ptext(" working better than the insert line capability. If");
+ ptext(" the text scrolls off the bottom then delete line may");
+ ptext(" be broken. If parts of the text are missing then");
+ ptext(" you should get professional help.");
+ put_crlf();
+ go_home();
+ put_newlines(2);
+ pad_test_startup(0);
+ do {
+ tt_putp(insert_line);
+ put_cr();
+ tt_putp(delete_line);
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext("The top of the screen should have a paragraph of text. ");
+ pad_done_message(t, state, ch);
+}
+
+/*
+** pad_scrc(test_list, status, ch)
+**
+** Test (sc) (rc) Save/restore cursor
+*/
+static void
+pad_scrc(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (!save_cursor || !restore_cursor) {
+ CAP_NOT_FOUND;
+ if (save_cursor) {
+ ptext("(rc) Restore-cursor");
+ } else
+ if (restore_cursor) {
+ ptext("(sc) Save-cursor");
+ } else {
+ ptext("(sc) Save-cursor, (rc) Restore-cursor");
+ }
+ ptext(" not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(sc) (rc) Save/Restore-cursor start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ page_loop();
+ for (i = 1; i < columns; i++) {
+ tt_putp(save_cursor);
+ putchp(letter);
+ tt_putp(restore_cursor);
+ putchp('X');
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext(above_line);
+ pad_done_message(t, state, ch);
+}
+
+/*
+** pad_csrind(test_list, status, ch)
+**
+** Test (csr) and (ind) Change scroll region and index.
+*/
+static void
+pad_csrind(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (!change_scroll_region) {
+ CAP_NOT_FOUND;
+ ptext("(csr) Change-scroll-region not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(csr) Save/Restore-cursor, (ind) index start testing")) {
+ return;
+ }
+ if (augment < 2) {
+ augment = 2;
+ }
+ if (augment > lines - 1) {
+ augment = lines - 1;
+ }
+ put_clear();
+ ptext("This text is on the top line.");
+ tt_putparm(change_scroll_region, 1, lines - augment, lines - 1);
+ /* go to the bottom of the screen */
+ home_down();
+ pad_test_startup(0);
+ do {
+ sprintf(temp, "%d\r", test_complete);
+ put_str(temp);
+ put_ind();
+ } while(still_testing());
+ ptextln("(csr) is broken.");
+ for (i = augment; i > 1; i--) {
+ put_ind();
+ }
+ pad_test_shutdown(t, 0);
+ ptext("All but top and bottom lines should be blank. ");
+ pad_done_message(t, state, ch);
+ tt_putparm(change_scroll_region, 1, 0, lines - 1);
+ put_clear();
+}
+
+/*
+** pad_sccsrrc(test_list, status, ch)
+**
+** Test (sc) (csr) and (rc) Save/Change/Restore scroll region
+*/
+static void
+pad_sccsrrc(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i;
+
+ if (!save_cursor || !change_scroll_region || !restore_cursor) {
+ /* quietly ignore this test */
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(sc) (csr) (rc) Save/Change/Restore-cursor, start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ page_loop();
+ for (i = 1; i < columns; i++) {
+ tt_putp(save_cursor);
+ putchp(letter);
+ tt_putparm(change_scroll_region, 1, 0, lines - 1);
+ tt_putp(restore_cursor);
+ putchp('X');
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext(above_line);
+ pad_done_message(t, state, ch);
+ tt_putparm(change_scroll_region, 1, 0, lines - 1);
+}
+
+/*
+** pad_csr_nel(test_list, status, ch)
+**
+** Test (sc) (csr) (nel) and (rc) Save/Change/Restore scroll region
+*/
+static void
+pad_csr_nel(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!save_cursor || !change_scroll_region || !restore_cursor) {
+ /* quietly ignore this test */
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(csr) Change-scroll-region, (nel) newline start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ for (i = 0; i < lines; i++) {
+ for (j = lines - i; j > 0; j--) {
+ put_crlf();
+ }
+ tt_putp(save_cursor);
+ tt_putparm(change_scroll_region, 1, i, lines - 1);
+ tt_putp(restore_cursor);
+ put_str(every_line);
+ }
+ tt_putp(save_cursor);
+ tt_putparm(change_scroll_region, 1, 0, lines - 1);
+ tt_putp(restore_cursor);
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ put_str(" ");
+ pad_done_message(t, state, ch);
+ tt_putparm(change_scroll_region, 1, 0, lines - 1);
+}
+
+/*
+** pad_csr_cup(test_list, status, ch)
+**
+** Test (csr) (cup) Change scroll region and cursor address
+*/
+static void
+pad_csr_cup(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!change_scroll_region || !cursor_address) {
+ /* quietly ignore this test */
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(csr) Change-scroll-region, (cup) cursor-address start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ for (i = 0; i < lines; i++) {
+ for (j = lines - i; j > 0; j--) {
+ put_crlf();
+ }
+ tt_putparm(change_scroll_region, 1, i, lines - 1);
+ tt_putparm(cursor_address, 1, lines - 1, 0);
+ put_str(every_line);
+ }
+ tt_putparm(change_scroll_region, 1, 0, lines - 1);
+ tt_putparm(cursor_address, 1, lines - 1, strlen(every_line));
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ put_str(" ");
+ pad_done_message(t, state, ch);
+ tt_putparm(change_scroll_region, 1, 0, lines - 1);
+}
+
+/*
+** pad_ht(test_list, status, ch)
+**
+** Test (ht) Tabs
+*/
+static void
+pad_ht(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!set_tab && init_tabs <= 0) {
+ CAP_NOT_FOUND;
+ ptext("(ht) Tab not tested. (hts) Set-tabs and (it) initial-tabs not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch, "(ht) Tab start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ /*
+ it is not always possible to test tabs with caps
+ that do not already have padding. The following
+ test uses a mixed bag of tests in order to avoid
+ this problem. Note: I do not scroll
+ */
+ if (auto_right_margin && can_go_home)
+ for (i = 1, go_home(); i < lines - 2; i++) {
+ for (j = 8; j < columns; j += 8) {
+ putchp('\t');
+ }
+ put_str("A ");
+ }
+ if (cursor_down && can_go_home)
+ for (i = 1, go_home(); i < lines - 2; i++) {
+ for (j = 8; j < columns; j += 8) {
+ putchp('\t');
+ }
+ put_str("D\r");
+ tt_putp(cursor_down);
+ }
+ if (cursor_address)
+ for (i = 1; i < lines - 2; i++) {
+ tt_putparm(cursor_address, 1, i - 1, 0);
+ for (j = 8; j < columns; j += 8) {
+ putchp('\t');
+ }
+ put_str("C");
+ }
+ go_home();
+ for (i = 1; i < lines - 2; i++) {
+ for (j = 8; j < columns; j += 8) {
+ putchp('\t');
+ }
+ putln("N");
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ ptextln("Letters on the screen other than Ns at the right margin indicate failure.");
+ ptext("A-(am) D-(cud1) C-(cup) N-(nel) ");
+ pad_done_message(t, state, ch);
+}
+
+/*
+** pad_smso(test_list, status, ch)
+**
+** Test (smso) (rmso) Enter/exit mode
+*/
+static void
+pad_smso(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ if (!enter_standout_mode || !exit_standout_mode) {
+ CAP_NOT_FOUND;
+ ptext("(smso) (rmso) Enter/Exit-standout-mode not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(smso) (rmso) Enter/Exit-standout-mode start testing")) {
+ return;
+ }
+ /*
+ In terminals that emulate non-hidden attributes with hidden
+ attributes, the amount of time that it takes to fill the screen
+ with an attribute is nontrivial. The following test is designed to
+ catch those delays
+ */
+ pad_test_startup(1);
+ do {
+ page_loop();
+ j = magic_cookie_glitch > 0 ? magic_cookie_glitch : 0;
+ for (i = 2 + j + j; i < columns;) {
+ put_mode(enter_standout_mode);
+ i += j + j + 2;
+ putchp('X');
+ put_mode(exit_standout_mode);
+ putchp('X');
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext(above_line);
+ pad_done_message(t, state, ch);
+ put_mode(exit_standout_mode);
+}
+
+/*
+** pad_smacs(test_list, status, ch)
+**
+** Test (smacs) (rmacs) Enter/exit altcharset mode
+*/
+static void
+pad_smacs(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int i, j;
+
+ /* test enter even if exit is missing */
+ if (!enter_alt_charset_mode) {
+ CAP_NOT_FOUND;
+ ptext("(smacs) Enter-altcharset-mode not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(smacs) (rmacs) Enter/Exit-altcharset-mode start testing")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ page_loop();
+ j = magic_cookie_glitch > 0 ? magic_cookie_glitch : 0;
+ for (i = 2 + j + j; i < columns;) {
+ put_mode(enter_alt_charset_mode);
+ i += j + j + 2;
+ putchp(letter);
+ put_mode(exit_alt_charset_mode);
+ putchp(letter);
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ home_down();
+ ptext("Every other character is from the alternate character set. ");
+ pad_done_message(t, state, ch);
+ put_mode(exit_alt_charset_mode);
+}
+
+/*
+** pad_crash(test_list, status, ch)
+**
+** Test (clear) without padding
+*/
+static void
+pad_crash(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int save_xon_xoff;
+
+ if (!clear_screen) {
+ ptext("(clear) Clear-screen not present. ");
+ pad_done_message(t, state, ch);
+ return;
+ }
+ ptext("If you would like to see if the terminal will really lock up.");
+ ptextln(" I will send the clear screen sequence without the pads.");
+ if (skip_pad_test(t, state, ch,
+ "(clear) Clear-screen start crash testing")) {
+ return;
+ }
+ save_xon_xoff = xon_xoff;
+ xon_xoff = 1;
+ pad_test_startup(0);
+ do {
+ put_str("Erase this!");
+ tt_putp(clear_screen);
+ } while(still_testing());
+ xon_xoff = save_xon_xoff;
+ pad_test_shutdown(t, 1);
+ pad_done_message(t, state, ch);
+}
diff --git a/contrib/ncurses/tack/scan.c b/contrib/ncurses/tack/scan.c
new file mode 100644
index 000000000000..d9429c96ee5a
--- /dev/null
+++ b/contrib/ncurses/tack/scan.c
@@ -0,0 +1,261 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+/* scan mode keyboard support */
+
+#include <tack.h>
+
+MODULE_ID("$Id: scan.c,v 1.2 1999/08/21 23:09:35 tom Exp $")
+
+int scan_max; /* length of longest scan code */
+char **scan_up, **scan_down, **scan_name;
+int *scan_tested, *scan_length, *scan_value;
+
+static int shift_state;
+static char *str;
+static int debug_char_count;
+
+#define SHIFT_KEY 0x100
+#define CONTROL_KEY 0x200
+#define META_KEY 0x400
+#define CAPS_LOCK 0x800
+
+static const struct {
+ const char *name;
+ int type;
+} scan_special[] = {
+ {"<shift>", SHIFT_KEY},
+ {"<left shift>", SHIFT_KEY},
+ {"<right shift>", SHIFT_KEY},
+ {"<control>", CONTROL_KEY},
+ {"<left control>", CONTROL_KEY},
+ {"<right control>", CONTROL_KEY},
+ {"<meta>", META_KEY},
+ {"<left meta>", META_KEY},
+ {"<right meta>", META_KEY},
+ {"<caps lock>", CAPS_LOCK},
+ {"<tab>", '\t'},
+ {"<space>", ' '},
+ {"<return>", '\r'},
+ {"<linefeed>", '\n'},
+ {"<formfeed>", '\f'},
+ {"<backspace>", '\b'},
+ {0, 0}
+};
+
+static void
+scan_blanks(void)
+{ /* scan past the white space */
+ while (*str == ' ' || *str == '\t')
+ str++;
+}
+
+static char *
+smash(void)
+{ /* convert a string to hex */
+ char *s, *t;
+ int ch, i, j;
+
+ t = s = str;
+ for (i = 0; (ch = *str); str++) {
+ if (ch >= '0' && ch <= '9')
+ j = ch - '0';
+ else if (ch >= 'a' && ch <= 'f')
+ j = 10 - 'a' + ch;
+ else if (ch >= 'A' && ch <= 'F')
+ j = 10 - 'A' + ch;
+ else if (ch == ' ' || ch == '\t')
+ break;
+ else
+ continue;
+ if (i) {
+ *s |= j;
+ s++;
+ } else
+ *s = j << 4;
+ i ^= 1;
+ }
+ *s = '\0';
+ return t;
+}
+
+void
+scan_init(char *fn)
+{ /* read the scan mode key definitions */
+ char *s, *sl;
+ FILE *fp;
+ int ch, i, j;
+ char home[512];
+
+ if ((str = getenv("HOME")))
+ strcpy(home, str);
+ else
+ home[0] = '\0';
+ fp = NULL;
+ if ((str = getenv("KEYBOARD"))) {
+ if (!(fp = fopen(str, "r")) && home[0]) {
+ sprintf(temp, "%s/.scan.%s", home, str);
+ fp = fopen(temp, "r");
+ }
+ }
+ if (!fp) {
+ sprintf(temp, ".scan.%s", fn);
+ fp = fopen(temp, "r");
+ }
+ if (!fp && home[0]) {
+ sprintf(temp, "%s/.scan.%s", home, fn);
+ fp = fopen(temp, "r");
+ }
+ if (!fp) {
+ ptext("Unable to open scanfile: ");
+ ptextln(temp);
+ bye_kids(1);
+ return;
+ }
+ /*
+ scan file format:
+
+ <down value> <up value> <name>
+
+ values are in hex. <name> may be any string of characters
+
+ */
+ scan_up = (char **) malloc(sizeof(char *) * MAX_SCAN);
+ scan_down = (char **) malloc(sizeof(char *) * MAX_SCAN);
+ scan_name = (char **) malloc(sizeof(char *) * MAX_SCAN);
+ scan_tested = (int *) malloc(sizeof(int *) * MAX_SCAN);
+ scan_length = (int *) malloc(sizeof(int *) * MAX_SCAN);
+ scan_value = (int *) malloc(sizeof(int *) * MAX_SCAN);
+ scan_up[0] = scan_down[0] = scan_name[0] = (char *) 0;
+ str = (char *) malloc(4096); /* buffer space */
+ sl = str + 4000; /* an upper limit */
+ scan_max = 1;
+ for (i = 0;;) {
+ for (s = str; (ch = getc(fp)) != EOF;) {
+ if (ch == '\n' || ch == '\r')
+ break;
+ *s++ = ch;
+ }
+ *s++ = '\0';
+ if (ch == EOF)
+ break;
+ if (*str == '#' || *str == '\0')
+ continue;
+ scan_down[i] = smash();
+ scan_blanks();
+ scan_up[i] = smash();
+ scan_blanks();
+ scan_name[i] = str;
+
+ scan_length[i] = strlen(scan_down[i]);
+ ch = strlen(scan_up[i]) + scan_length[i];
+ if (ch > scan_max)
+ scan_max = ch;
+
+ scan_value[i] = scan_name[i][0];
+ if (scan_name[i][1]) /* multi-character name */
+ for (j = 0; scan_special[j].name; j++) {
+ if (!strcmp(scan_name[i], scan_special[j].name)) {
+ scan_value[i] = scan_special[j].type;
+ break;
+ }
+ }
+
+ i++;
+ if (str > sl) {
+ str = (char *) malloc(4096);
+ sl = str + 4000;
+ } else
+ str = s;
+ }
+ fclose(fp);
+#ifdef notdef
+ for (i = 0; scan_down[i]; i++) {
+ put_str(hex_expand_to(scan_down[i], 3));
+ put_str(hex_expand_to(scan_up[i], 3));
+ put_str(" ");
+ put_str(scan_name[i]);
+ put_crlf();
+ }
+ (void) wait_here();
+#endif
+}
+
+int
+scan_key(void)
+{ /* read a key and translate scan mode to
+ ASCII */
+ int i, j, ch;
+ char buf[64];
+
+ for (i = 1;; i++) {
+ ch = getchar();
+ if (ch == EOF)
+ return EOF;
+ if (debug_fp) {
+ fprintf(debug_fp, "%02X ", ch);
+ debug_char_count += 3;
+ if (debug_char_count > 72) {
+ fprintf(debug_fp, "\n");
+ debug_char_count = 0;
+ }
+ }
+ buf[i - 1] = ch;
+ buf[i] = '\0';
+ if (buf[0] & 0x80) { /* scan up */
+ for (j = 0; scan_up[j]; j++) {
+ if (i == scan_length[j] &&
+ !strcmp(buf, scan_up[j])) {
+ i = 0;
+ shift_state &= ~scan_value[j];
+ break;
+ }
+ }
+ continue;
+ }
+ for (j = 0; scan_down[j]; j++) {
+ if (i == scan_length[j] && !strcmp(buf, scan_down[j])) {
+ i = 0;
+ shift_state |= scan_value[j];
+ ch = scan_value[j];
+ if (ch == CAPS_LOCK)
+ shift_state ^= SHIFT_KEY;
+ if (ch >= 256)
+ break;
+ if (shift_state & SHIFT_KEY) {
+ if (ch >= 0x60)
+ ch -= 0x20;
+ else if (ch >= 0x30 && ch <= 0x3f)
+ ch -= 0x10;
+ }
+ if (shift_state & CONTROL_KEY) {
+ if ((ch | 0x20) >= 0x60 &&
+ (ch | 0x20) <= 0x7f)
+ ch = (ch | 0x20) - 0x60;
+ }
+ if (shift_state & META_KEY)
+ ch |= 0x80;
+ return ch;
+ }
+ }
+ if (i > scan_max)
+ i = 1;
+ }
+}
diff --git a/contrib/ncurses/tack/sync.c b/contrib/ncurses/tack/sync.c
new file mode 100644
index 000000000000..d8866a0e5ebb
--- /dev/null
+++ b/contrib/ncurses/tack/sync.c
@@ -0,0 +1,424 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+#include <time.h>
+
+MODULE_ID("$Id: sync.c,v 1.1 1998/01/10 00:31:07 tom Exp $")
+
+/* terminal-synchronization and performance tests */
+
+static void sync_home(struct test_list *, int *, int *);
+static void sync_lines(struct test_list *, int *, int *);
+static void sync_clear(struct test_list *, int *, int *);
+static void sync_summary(struct test_list *, int *, int *);
+
+struct test_list sync_test_list[] = {
+ {MENU_NEXT, 0, 0, 0, "b) baud rate test", sync_home, 0},
+ {MENU_NEXT, 0, 0, 0, "l) scroll performance", sync_lines, 0},
+ {MENU_NEXT, 0, 0, 0, "c) clear screen performance", sync_clear, 0},
+ {MENU_NEXT, 0, 0, 0, "p) summary of results", sync_summary, 0},
+ {0, 0, 0, 0, txt_longer_test_time, longer_test_time, 0},
+ {0, 0, 0, 0, txt_shorter_test_time, shorter_test_time, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+struct test_menu sync_menu = {
+ 0, 'n', 0,
+ "Performance tests", "perf", "n) run standard tests",
+ sync_test, sync_test_list, 0, 0, 0
+};
+
+int tty_can_sync; /* TRUE if tty_sync_error() returned FALSE */
+int tty_newline_rate; /* The number of newlines per second */
+int tty_clear_rate; /* The number of clear-screens per second */
+int tty_cps; /* The number of characters per second */
+
+#define TTY_ACK_SIZE 64
+
+int ACK_terminator; /* terminating ACK character */
+int ACK_length; /* length of ACK string */
+const char *tty_ENQ; /* enquire string */
+char tty_ACK[TTY_ACK_SIZE]; /* ACK response, set by tty_sync_error() */
+
+/*****************************************************************************
+ *
+ * Terminal synchronization.
+ *
+ * These functions handle the messy business of enq-ack handshaking
+ * for timing purposes.
+ *
+ *****************************************************************************/
+
+int
+tty_sync_error(void)
+{
+ int ch, trouble, ack;
+
+ trouble = FALSE;
+ for (;;) {
+ tt_putp(tty_ENQ); /* send ENQ */
+ ch = getnext(STRIP_PARITY);
+ event_start(TIME_SYNC); /* start the timer */
+
+ /*
+ The timer doesn't start until we get the first character.
+ After that I expect to get the remaining characters of
+ the acknowledge string in a short period of time. If
+ that is not true then these characters are coming from
+ the user and we need to send the ENQ sequence out again.
+ */
+ for (ack = 0; ; ) {
+ if (ack < TTY_ACK_SIZE - 2) {
+ tty_ACK[ack] = ch;
+ tty_ACK[ack + 1] = '\0';
+ }
+ if (ch == ACK_terminator) {
+ return trouble;
+ }
+ if (++ack >= ACK_length) {
+ return trouble;
+ }
+ ch = getnext(STRIP_PARITY);
+ if (event_time(TIME_SYNC) > 400000) {
+ break;
+ }
+ }
+
+ set_attr(0); /* just in case */
+ put_crlf();
+ if (trouble) {
+ /* The terminal won't sync. Life is not good. */
+ return TRUE;
+ }
+ put_str(" -- sync -- ");
+ trouble = TRUE;
+ }
+}
+
+/*
+** flush_input()
+**
+** Throw away any output.
+*/
+void
+flush_input(void)
+{
+ if (tty_can_sync == SYNC_TESTED && ACK_terminator >= 0) {
+ (void) tty_sync_error();
+ } else {
+ spin_flush();
+ }
+}
+
+/*
+** probe_enq_ok()
+**
+** does the terminal do enq/ack handshaking?
+*/
+static void
+probe_enq_ok(void)
+{
+ int tc, len, ulen;
+
+ put_str("Testing ENQ/ACK, standby...");
+ fflush(stdout);
+ can_test("u8 u9", FLAG_TESTED);
+
+ tty_ENQ = user9 ? user9 : "\005";
+ tc_putp(tty_ENQ);
+ event_start(TIME_SYNC); /* start the timer */
+ read_key(tty_ACK, TTY_ACK_SIZE - 1);
+
+ if (event_time(TIME_SYNC) > 400000 || tty_ACK[0] == '\0') {
+ /* These characters came from the user. Sigh. */
+ tty_can_sync = SYNC_FAILED;
+ ptext("\nThis program expects the ENQ sequence to be");
+ ptext(" answered with the ACK character. This will help");
+ ptext(" the program reestablish synchronization when");
+ ptextln(" the terminal is overrun with data.");
+ ptext("\nENQ sequence from (u9): ");
+ putln(expand(tty_ENQ));
+ ptext("ACK recieved: ");
+ putln(expand(tty_ACK));
+ len = user8 ? strlen(user8) : 0;
+ sprintf(temp, "Length of ACK %d. Expected length of ACK %d.",
+ (int) strlen(tty_ACK), len);
+ ptextln(temp);
+ if (len) {
+ temp[0] = user8[len - 1];
+ temp[1] = '\0';
+ ptext("Terminating character found in (u8): ");
+ putln(expand(temp));
+ }
+ return;
+ }
+
+ tty_can_sync = SYNC_TESTED;
+ if ((len = strlen(tty_ACK)) == 1) {
+ /* single character acknowledge string */
+ ACK_terminator = tty_ACK[0];
+ ACK_length = 4096;
+ return;
+ }
+ tc = tty_ACK[len - 1];
+ if (user8) {
+ ulen = strlen(user8);
+ if (tc == user8[ulen - 1]) {
+ /* ANSI style acknowledge string */
+ ACK_terminator = tc;
+ ACK_length = 4096;
+ return;
+ }
+ }
+ /* fixed length acknowledge string */
+ ACK_length = len;
+ ACK_terminator = -2;
+}
+
+/*
+** verify_time()
+**
+** verify that the time tests are ready to run.
+** If the baud rate is not set then compute it.
+*/
+void
+verify_time(void)
+{
+ int status, ch;
+
+ if (tty_can_sync == SYNC_FAILED) {
+ return;
+ }
+ probe_enq_ok();
+ put_crlf();
+ if (tty_can_sync == SYNC_TESTED) {
+ put_crlf();
+ if (ACK_terminator >= 0) {
+ ptext("ACK terminating character: ");
+ temp[0] = ACK_terminator;
+ temp[1] = '\0';
+ ptextln(expand(temp));
+ } else {
+ sprintf(temp, "Fixed length ACK, %d characters",
+ ACK_length);
+ ptextln(temp);
+ }
+ }
+ if (tty_baud_rate == 0) {
+ sync_home(&sync_test_list[0], &status, &ch);
+ }
+}
+
+/*****************************************************************************
+ *
+ * Terminal performance tests
+ *
+ * Find out how fast the terminal can:
+ * 1) accept characters
+ * 2) scroll the screen
+ * 3) clear the screen
+ *
+ *****************************************************************************/
+
+/*
+** sync_home(test_list, status, ch)
+**
+** Baudrate test
+*/
+void
+sync_home(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int j, k;
+ unsigned long rate;
+
+ if (!cursor_home && !cursor_address && !row_address) {
+ ptext("Terminal can not home cursor. ");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(home) Start baudrate search")) {
+ return;
+ }
+ pad_test_startup(1);
+ do {
+ go_home();
+ for (j = 1; j < lines; j++) {
+ for (k = 0; k < columns; k++) {
+ if (k & 0xF) {
+ put_this(letter);
+ } else {
+ put_this('.');
+ }
+ }
+ SLOW_TERMINAL_EXIT;
+ }
+ NEXT_LETTER;
+ } while(still_testing());
+ pad_test_shutdown(t, auto_right_margin == 0);
+ /* note: tty_frame_size is the real framesize times two.
+ This takes care of half bits. */
+ rate = (tx_cps * tty_frame_size) >> 1;
+ if (rate > tty_baud_rate) {
+ tty_baud_rate = rate;
+ }
+ if (tx_cps > tty_cps) {
+ tty_cps = tx_cps;
+ }
+ sprintf(temp, "%d characters per second. Baudrate %d ", tx_cps, j);
+ ptext(temp);
+ generic_done_message(t, state, ch);
+}
+
+/*
+** sync_lines(test_list, status, ch)
+**
+** How many newlines/second?
+*/
+static void
+sync_lines(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int j;
+
+ if (skip_pad_test(t, state, ch,
+ "(nel) Start scroll performance test")) {
+ return;
+ }
+ pad_test_startup(0);
+ repeats = 100;
+ do {
+ sprintf(temp, "%d", test_complete);
+ put_str(temp);
+ put_newlines(repeats);
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ j = sliding_scale(tx_count[0], 1000000, usec_run_time);
+ if (j > tty_newline_rate) {
+ tty_newline_rate = j;
+ }
+ sprintf(temp, "%d linefeeds per second. ", j);
+ ptext(temp);
+ generic_done_message(t, state, ch);
+}
+
+/*
+** sync_clear(test_list, status, ch)
+**
+** How many clear-screens/second?
+*/
+static void
+sync_clear(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ int j;
+
+ if (!clear_screen) {
+ ptext("Terminal can not clear-screen. ");
+ generic_done_message(t, state, ch);
+ return;
+ }
+ if (skip_pad_test(t, state, ch,
+ "(clear) Start clear-screen performance test")) {
+ return;
+ }
+ pad_test_startup(0);
+ repeats = 20;
+ do {
+ sprintf(temp, "%d", test_complete);
+ put_str(temp);
+ for (j = 0; j < repeats; j++) {
+ put_clear();
+ }
+ } while(still_testing());
+ pad_test_shutdown(t, 0);
+ j = sliding_scale(tx_count[0], 1000000, usec_run_time);
+ if (j > tty_clear_rate) {
+ tty_clear_rate = j;
+ }
+ sprintf(temp, "%d clear-screens per second. ", j);
+ ptext(temp);
+ generic_done_message(t, state, ch);
+}
+
+/*
+** sync_symmary(test_list, status, ch)
+**
+** Print out the test results.
+*/
+static void
+sync_summary(
+ struct test_list *t,
+ int *state,
+ int *ch)
+{
+ char size[32];
+
+ put_crlf();
+ ptextln("Terminal size characters/sec linefeeds/sec clears/sec");
+ sprintf(size, "%dx%d", columns, lines);
+ sprintf(temp, "%-10s%-11s%11d %11d %11d", tty_basename, size,
+ tty_cps, tty_newline_rate, tty_clear_rate);
+ ptextln(temp);
+ generic_done_message(t, state, ch);
+}
+
+/*
+** sync_test(menu)
+**
+** Run at the beginning of the pad tests and function key tests
+*/
+void
+sync_test(
+ struct test_menu *menu)
+{
+ control_init();
+ if (tty_can_sync == SYNC_NOT_TESTED) {
+ verify_time();
+ }
+ if (menu->menu_title) {
+ put_crlf();
+ ptextln(menu->menu_title);
+ }
+}
+
+/*
+** sync_handshake(test_list, status, ch)
+**
+** Test or retest the ENQ/ACK handshake
+*/
+void
+sync_handshake(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ tty_can_sync = SYNC_NOT_TESTED;
+ verify_time();
+}
diff --git a/contrib/ncurses/tack/sysdep.c b/contrib/ncurses/tack/sysdep.c
new file mode 100644
index 000000000000..763cc66e2a90
--- /dev/null
+++ b/contrib/ncurses/tack/sysdep.c
@@ -0,0 +1,455 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+/*
+ * Operating system dependant functions. We assume the POSIX API.
+ * Note: on strict-POSIX systems (including BSD/OS) the select_delay_type
+ * global has no effect.
+ */
+
+#include <tack.h>
+
+#include <signal.h>
+#include <term.h>
+#include <errno.h>
+
+#if 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
+
+MODULE_ID("$Id: sysdep.c,v 1.5 1999/08/21 21:42:25 tom Exp $")
+
+#if DECL_ERRNO
+extern int errno;
+#endif
+
+/* globals */
+int tty_frame_size; /* asynch frame size times 2 */
+unsigned long tty_baud_rate; /* baud rate - bits per second */
+int not_a_tty; /* TRUE if output is not a tty (i.e. pipe) */
+int nodelay_read; /* TRUE if NDELAY is set */
+
+#define TTY_IS_NOECHO !(new_modes.c_lflag & ECHO)
+#define TTY_IS_OUT_TRANS (new_modes.c_oflag & OPOST)
+#define TTY_IS_CHAR_MODE !(new_modes.c_lflag & ICANON)
+#define TTY_WAS_CS8 ((old_modes.c_cflag & CSIZE) == CS8)
+#define TTY_WAS_XON_XOFF (old_modes.c_iflag & (IXON|IXOFF))
+
+static TTY old_modes, new_modes;
+
+void catchsig(void);
+
+/*
+ * These are a sneaky way of conditionalizing bit unsets so strict-POSIX
+ * systems won't see them.
+ */
+#ifndef XCASE
+#define XCASE 0
+#endif
+#ifndef OLCUC
+#define OLCUC 0
+#endif
+#ifndef IUCLC
+#define IUCLC 0
+#endif
+#ifndef TABDLY
+#define TABDLY 0
+#endif
+#ifndef IXANY
+#define IXANY 0
+#endif
+
+void
+tty_raw(int minch GCC_UNUSED, int mask)
+{ /* set tty to raw noecho */
+ new_modes = old_modes;
+#if HAVE_SELECT
+ new_modes.c_cc[VMIN] = 1;
+#else
+ new_modes.c_cc[VMIN] = minch;
+#endif
+ new_modes.c_cc[VTIME] = 2;
+ new_modes.c_lflag &=
+ ~(ISIG | ICANON | XCASE | ECHO | ECHOE | ECHOK | ECHONL);
+#ifdef LOBLK
+ new_modes.c_lflag &= ~LOBLK;
+#endif
+ new_modes.c_oflag &= ~(OPOST | OLCUC | TABDLY);
+ if (mask == ALLOW_PARITY) {
+ new_modes.c_cflag &= ~(CSIZE | PARENB | HUPCL);
+ new_modes.c_cflag |= CS8;
+ }
+ new_modes.c_iflag &=
+ ~(IGNBRK | BRKINT | IGNPAR | PARMRK | INPCK | ISTRIP | INLCR | IGNCR | ICRNL |
+ IUCLC | IXON | IXANY | IXOFF);
+ if (not_a_tty)
+ return;
+ tcsetattr(fileno(stdin), TCSAFLUSH, &new_modes);
+}
+
+void
+tty_set(void)
+{ /* set tty to special modes */
+ new_modes = old_modes;
+ new_modes.c_cc[VMIN] = 1;
+ new_modes.c_cc[VTIME] = 1;
+ new_modes.c_lflag &= ~(ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHONL);
+#if defined(ONLCR) && defined(OCRNL) && defined(ONLRET) && defined(OFILL)
+ new_modes.c_oflag &= ~(ONLCR | OCRNL | ONLRET | OFILL);
+#else
+ new_modes.c_oflag &= ~(OPOST);
+#endif
+ if (char_mask == ALLOW_PARITY)
+ new_modes.c_iflag &= ~ISTRIP;
+ switch (select_xon_xoff) {
+ case 0:
+ new_modes.c_iflag &= ~(IXON | IXOFF);
+ break;
+ case 1:
+#if sequent
+ /* the sequent System V emulation is broken */
+ new_modes = old_modes;
+ new_modes.c_cc[VEOL] = 6; /* control F (ACK) */
+#endif
+ new_modes.c_iflag |= IXON | IXOFF;
+ break;
+ }
+ switch (select_delay_type) {
+ case 0:
+#ifdef NLDLY
+ new_modes.c_oflag &=
+ ~(NLDLY | CRDLY | TABDLY | BSDLY | VTDLY | FFDLY);
+#endif /* NLDLY */
+ break;
+ case 1:
+#ifdef NLDLY
+ new_modes.c_oflag &=
+ ~(NLDLY | CRDLY | TABDLY | BSDLY | VTDLY | FFDLY);
+#endif /* NLDLY */
+#ifdef NL1
+ new_modes.c_oflag |= NL1 | CR2;
+#endif /* NL1 */
+ break;
+ }
+ if (!(new_modes.c_oflag & ~OPOST))
+ new_modes.c_oflag &= ~OPOST;
+ if (not_a_tty)
+ return;
+ tcsetattr(fileno(stdin), TCSAFLUSH, &new_modes);
+}
+
+
+void
+tty_reset(void)
+{ /* reset the tty to the original modes */
+ fflush(stdout);
+ if (not_a_tty)
+ return;
+ tcsetattr(fileno(stdin), TCSAFLUSH, &old_modes);
+}
+
+
+void
+tty_init(void)
+{ /* ATT terminal init */
+#ifdef F_GETFL
+ int flags;
+
+ flags = fcntl(fileno(stdin), F_GETFL, 0);
+ nodelay_read = flags & O_NDELAY;
+#else
+ nodelay_read = FALSE;
+#endif
+ not_a_tty = FALSE;
+ if (tcgetattr(fileno(stdin), &old_modes) == -1) {
+ if (errno == ENOTTY) {
+ tty_frame_size = 20;
+ not_a_tty = TRUE;
+ return;
+ }
+ printf("tcgetattr error: %d\n", errno);
+ exit(1);
+ }
+ /* if TAB3 is set then setterm() wipes out tabs (ht) */
+ new_modes = old_modes;
+#ifdef TABDLY
+ new_modes.c_oflag &= ~TABDLY;
+#endif /* TABDLY */
+ if (tcsetattr(fileno(stdin), TCSAFLUSH, &new_modes) == -1) {
+ printf("tcsetattr error: %d\n", errno);
+ exit(1);
+ }
+#ifdef sequent
+ /* the sequent ATT emulation is broken soooo. */
+ old_modes.c_cflag &= ~(CSIZE | CSTOPB);
+ old_modes.c_cflag |= CS7 | PARENB;
+#endif
+ catchsig();
+ switch (old_modes.c_cflag & CSIZE) {
+#if defined(CS5) && (CS5 != 0)
+ case CS5:
+ tty_frame_size = 10;
+ break;
+#endif
+#if defined(CS6) && (CS6 != 0)
+ case CS6:
+ tty_frame_size = 12;
+ break;
+#endif
+#if defined(CS7) && (CS7 != 0)
+ case CS7:
+ tty_frame_size = 14;
+ break;
+#endif
+#if defined(CS8) && (CS8 != 0)
+ case CS8:
+ tty_frame_size = 16;
+ break;
+#endif
+ }
+ tty_frame_size += 2 +
+ ((old_modes.c_cflag & PARENB) ? 2 : 0) +
+ ((old_modes.c_cflag & CSTOPB) ? 4 : 2);
+}
+
+/*
+** stty_query(question)
+**
+** Does the current driver settings have this property?
+*/
+int
+stty_query(int q)
+{
+ switch (q) {
+ case TTY_NOECHO:
+ return TTY_IS_NOECHO;
+ case TTY_OUT_TRANS:
+ return TTY_IS_OUT_TRANS;
+ case TTY_CHAR_MODE:
+ return TTY_IS_CHAR_MODE;
+ }
+ return (-1);
+}
+
+/*
+** initial_stty_query(question)
+**
+** Did the initial driver settings have this property?
+*/
+int
+initial_stty_query(int q)
+{
+ switch (q) {
+ case TTY_8_BIT:
+ return TTY_WAS_CS8;
+ case TTY_XON_XOFF:
+ return TTY_WAS_XON_XOFF;
+ }
+ return (-1);
+}
+
+#if HAVE_SELECT && defined(FD_ZERO)
+static int
+char_ready(void)
+{
+ int n;
+ fd_set ifds;
+ struct timeval tv;
+
+ FD_ZERO(&ifds);
+ FD_SET(fileno(stdin), &ifds);
+ tv.tv_sec = 0;
+ tv.tv_usec = 200000;
+ n = select(fileno(stdin)+1, &ifds, NULL, NULL, &tv);
+ return (n != 0);
+}
+
+#else
+#ifdef FIONREAD
+int
+char_ready(void)
+{
+ int i, j;
+
+ /* the following loop has to be tuned for each computer */
+ for (j = 0; j < 1000; j++) {
+ ioctl(fileno(stdin), FIONREAD, &i);
+ if (i)
+ return i;
+ }
+ return i;
+}
+
+#else
+#define char_ready() 1
+#endif
+#endif
+
+/*
+** spin_flush()
+**
+** Wait for the input stream to stop.
+** Throw away all input characters.
+*/
+void
+spin_flush(void)
+{
+ unsigned char buf[64];
+
+ fflush(stdout);
+ event_start(TIME_FLUSH); /* start the timer */
+ do {
+ if (char_ready()) {
+ (void) read(fileno(stdin), &buf, sizeof(buf));
+ }
+ } while (event_time(TIME_FLUSH) < 400000);
+}
+
+/*
+** read_key(input-buffer, length-of-buffer)
+**
+** read one function key from the input stream.
+** A null character is converted to 0x80.
+*/
+void
+read_key(char *buf, int max)
+{
+ int got, ask, i, l;
+ char *s;
+
+ *buf = '\0';
+ s = buf;
+ fflush(stdout);
+ /* ATT unix may return 0 or 1, Berkeley Unix should be 1 */
+ while (read(fileno(stdin), s, 1) == 0);
+ ++s;
+ --max;
+ while (max > 0 && (ask = char_ready())) {
+ if (ask > max) {
+ ask = max;
+ }
+ if ((got = read(fileno(stdin), s, ask))) {
+ s += got;
+ } else {
+ break;
+ }
+ max -= got;
+ }
+ *s = '\0';
+ l = s - buf;
+ for (s = buf, i = 0; i < l; i++) {
+ if ((*s & 0x7f) == 0) {
+ /* convert nulls to 0x80 */
+ *(unsigned char *)s = 128;
+ } else {
+ /* strip high order bits (if any) */
+ *s &= char_mask;
+ }
+ }
+}
+
+
+void
+ignoresig(void)
+{
+ /* ignore signals */
+ signal(SIGINT, SIG_IGN);
+ signal(SIGHUP, SIG_IGN);
+ signal(SIGQUIT, SIG_IGN);
+ signal(SIGTERM, SIG_IGN);
+ signal(SIGALRM, SIG_IGN);
+}
+
+ /*
+ onintr( )
+
+ is the interrupt handling routine onintr turns off interrupts while doing
+ clean-up
+
+ onintr always exits fatally
+ */
+
+
+static RETSIGTYPE
+onintr(int sig GCC_UNUSED)
+{
+ ignoresig();
+ tty_reset();
+ exit(1);
+}
+
+
+ /*
+ catchsig( )
+
+ set up to field interrupts (via function onintr( )) so that if interrupted
+ we can restore the correct terminal modes
+
+ catchsig simply returns
+ */
+
+
+void
+catchsig(void)
+{
+ if ((signal(SIGINT, SIG_IGN)) == SIG_DFL)
+ signal(SIGINT, onintr);
+
+ if ((signal(SIGHUP, SIG_IGN)) == SIG_DFL)
+ signal(SIGHUP, onintr);
+
+ if ((signal(SIGQUIT, SIG_IGN)) == SIG_DFL)
+ signal(SIGQUIT, onintr);
+
+ if ((signal(SIGTERM, SIG_IGN)) == SIG_DFL)
+ signal(SIGTERM, onintr);
+
+}
+
+/*
+** alarm_event(sig)
+**
+** Come here for an alarm event
+*/
+static void
+alarm_event(
+ int sig GCC_UNUSED)
+{
+ no_alarm_event = 0;
+}
+
+/*
+** set_alarm_clock(seconds)
+**
+** Set the alarm clock to fire in <seconds>
+*/
+void
+set_alarm_clock(
+ int seconds)
+{
+ signal(SIGALRM, alarm_event);
+ no_alarm_event = 1;
+ (void) alarm(seconds);
+}
diff --git a/contrib/ncurses/tack/tack.1 b/contrib/ncurses/tack/tack.1
new file mode 100644
index 000000000000..be74e5852cc9
--- /dev/null
+++ b/contrib/ncurses/tack/tack.1
@@ -0,0 +1,311 @@
+.TH tack 1M ""
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+\fBtack\fR - \fIterminfo\fR action checker
+.SH SYNOPSIS
+\fBtack\fR [-itV] [term]
+.br
+.SH DESCRIPTION
+The \fBtack\fR program has three purposes:
+(1) to help you build a new terminfo entry describing an unknown terminal,
+(2) to test the correctness of an existing entry, and
+(3) to develop the correct pad timings needed to ensure that screen updates
+don't fall behind the incoming data stream.
+.PP
+\fBTack\fR presents a series of screen-painting and interactive
+tests in ways which are intended to make any mismatches between the
+terminfo entry and reality visually obvious.
+\fBTack\fR also provides tools that can help in understanding how
+the terminal operates.
+.SS OPTIONS
+.TP
+.I "\-i"
+Usually \fBtack\fR will send the reset and init strings to the terminal
+when the program starts up. The \fI-i\fR option will inhibit the
+terminal initialization.
+.TP
+.I "\-t"
+Tell \fBtack\fR to override the terminfo settings for basic terminal
+functions. When this option is set \fBtack\fR will translate
+(cr) to \\r, (cud1) to \\n, (ind) to \\n, (nel) to \\r\\n,
+(cub1) to \\b, (bel) to \\007, (ff) to \\f and (ht) to \\t.
+.TP
+.I "\-V"
+Display the version information and exit.
+.TP
+.I "term"
+Terminfo terminal name to be tested. If not present then the $TERM
+environment variable will be used.
+.SH OVERVIEW
+Since \fBtack\fR is designed to test terminfo's it is not possible
+to rely on the correctness of the terminfo data base. Because of this
+the menuing system used with \fBtack\fR is vary primitive. When a
+menu is printed it will scroll the entire screen. To compensate
+for this verbose menu system \fBtack\fR permits menu selection
+type ahead.
+If you already know what action you would like \fBtack\fR to perform
+then you can enter that value immediately and avoid the menu display.
+When in doubt the question mark (?) is a good character to type.
+A carriage return will execute the default action. These default
+actions are designed to run all the standard tests.
+.PP
+When \fBtack\fR first comes up it will display some basic information
+about the terminal. Take some time to verify this information.
+If it is wrong many of the subsequent tests will fail. The most
+important item is the screen size. If the screen size is wrong there
+is no point in proceeding. (home) and (clear) are also critical
+to the success of subsequent tests. The values of (cr) (ind)
+(cub1) and (ht) may effect the tests if they are defined incorrectly.
+If they are undefined \fBtack\fR will set them to reasonable defaults.
+The last two entries on the display are the enquire and acknowledge strings.
+These strings are taken from the user strings (u9) and (u8).
+.PP
+By now you must be wondering why the terminfo names are enclosed
+in parenthesis. This has no profound meaning other than it makes
+them stand out. The \fBtack\fR program uses this convention any time
+it displays a terminfo name. Remember \fBtack\fR is designed to
+rely on as little of the terminfo entry as possible.
+.SH CREATING NEW ENTRIES
+\fBTack\fR has a number of tools that are designed to help gather
+information about the terminal. Although these functions are not
+dependent on terminal type, you may wish to execute \fBtack\fR
+with options \fI\-it\fR. This will turn off initialization
+and default the standard entries.
+.PP
+These tools may be reached from the main menu by selecting
+the 'tools' entry.
+.PP
+\fBEcho tool\fR: All data typed from the keyboard will be echoed back
+to the terminal. Control characters are not translated to the up arrow format
+but are sent as control characters. This allows you to test an escape
+sequence and see what it actually does. You may also elect to
+\fBenable hex output on echo tool\fR this will echo the characters in
+hexadecimal. Once the test is running you may enter the 'lines'
+or 'columns' keywords which will display a pattern that will help
+you determine your screen size. A complete list of keywords will
+be displayed when the test starts. Type 'help' to redisplay
+the list of available commands.
+.PP
+\fBReply tool\fR: This tool acts much like the echo tool, but
+control characters that are sent from the terminal more than one character
+after a carriage return will be expanded to the up arrow format. For example
+on a standard ANSI terminal you may type:
+
+ CR ESC [ c
+
+and the response will be echoed as something like:
+
+ ^[ [ ? 6 c
+.PP
+\fBANSI sgr display\fR: This test assumes you have an ANSI terminal. It
+goes through attribute numbers 0 to 79, displaying each in turn and using that
+SGR number to write the text. This shows you which of the SGR
+modes are actually implemented by the terminal. Note: some terminals (such as
+Tektronix color) use the private use characters to augment the functionality of
+the SGR command. These private use characters may be interjected into the
+escape sequence by typing the character ( <, =, >, ? ) after the original
+display has been shown.
+.PP
+\fBANSI status reports\fR: This test queries the terminal in standard
+ANSI/VT-100 fashion. The results of this test may help
+determine what options are supported by your terminal.
+.PP
+\fBANSI character sets\fR: This test displays the character sets
+available on a ANSI/VT-100 style terminal.
+Character sets on a real VT-100 terminal are usually defined
+with smacs=\\E(0 and rmacs=\\E(B. The first character after the
+escape defines the font bank. The second character defines the
+character set. This test allows you to view any of the possible
+combinations. Private use character sets are defined by the digits.
+Standard character sets are located in the alphabetic range.
+.SH VERIFYING AN EXISTING ENTRY
+.PP
+You can verify the correctness of an entry with the `begin testing'
+function. This entry is the default action and will be chosen
+if you hit carriage return (or enter). This will bring up a
+secondary menu that allows you to select more specific tests.
+.PP
+The general philosophy of the program is, for each capability, to send an
+appropriate test pattern to the terminal then send a description of
+what the user should expect. Occasionally (as when checking function-key
+capabilities) the program will ask you to enter input for it to check.
+.PP
+If the test fails then you have the option of dynamically changing
+the terminfo entry and re-running the test. This is done with
+the 'edit terminfo' menu item. The edit submenu allows you to change
+the offending terminfo entry and immediately retest the capability.
+The edit menu lets you do other things with the terminfo, such as;
+display the entire terminfo entry,
+display which caps have been tested and display which caps cannot
+be tested. This menu also allows you to write the newly modified
+terminfo to disc. If you have made any modifications to the
+terminfo \fBtack\fR will ask you if you want to save the file
+to disc before it exits. The filename will be the same as the terminal name.
+After the program exits you can run the tic(1M) compiler on the
+new terminfo to install it in the terminfo data base.
+.PP
+.SH CORRECTING PAD TIMINGS
+.SS Theory of Overruns and Padding
+.PP
+Some terminals require significant amounts of time (that is, more than one
+transmitted-character interval) to do screen updates that change large
+portions of the screen, such as screen clears, line insertions,
+line deletions, and scrolls (including scrolls triggered by line feeds
+or a write to the lowest, right-hand-most cell of the screen).
+.PP
+If the computer continues to send characters to the terminal while one
+of these time-consuming operations is going on, the screen may be garbled.
+Since the length of a character transmission time varies inversely with
+transmission speed in cps, entries which function at lower speeds may
+break at higher speeds.
+.PP
+Similar problems result if the host machine is simply sending characters at a
+sustained rate faster than the terminal can buffer and process them. In either
+case, when the terminal cannot process them and can't tell the host to stop
+soon enough, it will just drop them. The dropped characters could be text,
+escape sequences or the escape character itself, causing some really
+strange-looking displays. This kind of glitch is called an \fIoverrun\fR.
+.PP
+In terminfo entries, you can attach a \fBpad time\fR to each string capability
+that is a number of milliseconds to delay after sending it. This will give
+the terminal time to catch up and avoid overruns.
+.PP
+If you are running a software terminal emulator, or you are on an X pseudo-tty,
+or your terminal is on an RS-232C line which correctly handles RTS/CTS
+hardware flow control, then pads are not strictly necessary. However, some
+display packages (such as ncurses(3X)) use the pad counts to calculate
+the fastest way to implement certain functions.
+For example: scrolling the screen may be faster than deleting the top line.
+.PP
+One common way to avoid overruns is with XON/XOFF handshaking.
+But even this handshake may have problems at high baud rates.
+This is a result of the way XON/XOFF works. The terminal tells
+the host to stop with an XOFF. When the host gets this character, it stops
+sending. However, there is a small amount of time between the stop request and
+the actual stop. During this window, the terminal must continue to accept
+characters even though it has told the host to stop. If the terminal sends
+the stop request too late, then its internal buffer will overflow. If it sends
+the stop character too early, then the terminal is not getting the most
+efficient use out of its internal buffers. In a real application at high baud
+rates, a terminal could get a dozen or more characters before the host gets
+around to suspending transmission. Connecting the terminal over a network
+will make the problem much worse.
+.PP
+(RTS/CTS handshaking does not have this problem because the UARTs are
+signal-connected and the "stop flow" is done at the lowest level, without
+software intervention).
+.PP
+.SS Timing your terminal
+.PP
+In order to get accurate timings from your terminal \fBtack\fR
+needs to know when the terminal has finished processing all the
+characters that were sent. This requires a different type of handshaking
+than the XON/XOFF that is supported by most terminals. \fBTack\fR
+needs to send a request to the terminal and wait for its reply.
+Many terminals will respond with an ACK when they receive an ENQ.
+This is the preferred method since the sequence is short.
+ANSI/VT-100 style terminals can mimic this handshake with the
+escape sequence that requests 'primary device attributes'.
+
+ ESC [ c
+
+The terminal will respond with a sequence like:
+
+ ESC [ ? 1 ; 0 c
+
+\fBTack\fR assumes that (u9) is the enquire sequence and that (u8) is the
+acknowledge string. A VT-100 style terminal could set u9=\\E[c
+and u8=\\E[?1;0c.
+Acknowledge strings fall into two categories.
+1) Strings with a unique terminating character and,
+2) strings of fixed length.
+The acknowledge string for the VT-100 is of the first type since
+it always ends with the letter 'c'. Some Tektronics terminals
+have fixed length acknowledge strings. \fBTack\fR supports both
+types of strings by scanning for the terminating character until
+the length of the expected acknowledge string has arrived.
+(u8) should be set to some typical acknowledge that will be
+returned when (u9) is sent.
+.PP
+\fBTack\fR will test this sequence before running any of the pad
+tests or the function key tests. \fBTack\fR will ask you the following:
+
+ Hit lower case g to start testing...
+
+After it sends this message it will send the enquire string.
+It will then read characters from the terminal until it sees the
+letter g.
+.PP
+.SS Testing and Repairing Pad Timings
+.PP
+The pad timings in distributed terminfo entries are often incorrect. One
+major motivation for this program is to make it relatively easy to tune these
+timings.
+.PP
+You can verify and edit the pad timings for a terminal with
+the `test string capabilities'
+function (this is also part of the `normal test sequence' function).
+.PP
+The key to determining pad times is to find out the effective baud rate of
+the terminal. The effective baud rate determines the number of characters
+per second that the terminal can accept without either handshaking or
+losing data. This rate is frequently less than the nominal cps rate on the
+RS-232 line.
+.PP
+\fBTack\fR uses the effective baud rate to judge the duration of the test and
+how much a particular escape sequence will perturb the terminal.
+.PP
+Each pad test has two associated variables that can be tweaked to help verify
+the correctness of the pad timings. One is the pad test length. The other is
+the pad multiplier, which is used if the pad prefix includes `*'. In curses
+use, it is often the first parameter of the capability (if there is one).
+For a capability like (dch) or (il) this will be the number of character
+positions or lines affected, respectively.
+.PP
+\fBTack\fR will run the pad tests and display the results to the terminal.
+On capabilities that have multipliers \fBtack\fR will not tell you
+if the pad needs the multiplier or not. You must make this decision
+yourself by rerunning the test with a different multiplier.
+If the padding changes in proportion to the multiplier than the
+multiplier is required. If the multiplier has little or no effect on
+the suggested padding then the multiplier is not needed.
+Some capabilities will take several runs to get a good feel for
+the correct values. You may wish to make the test longer
+to get more accurate results. System load will also effect the
+results (a heavily loaded system will not stress the
+terminal as much, possibly leading to pad timings that are too short).
+.PP
+.SH NOTE
+The tests done at the beginning of the program are assumed to be correct later
+in the code. In particular, \fBtack\fR displays the number of lines and
+columns indicated in the terminfo entry as part of its initial output.
+If these values are wrong a large number of tests will fail or give incorrect
+results.
+.SH FILES
+.TP 12
+tack.log
+If logging is enabled then all characters written to the terminal
+will also be written to the log file. This gives you the ability
+to see how the tests were performed. This feature is disabled by default.
+.TP 12
+.I "term"
+If you make changes to the terminfo entry \fBtack\fR will save
+the new terminfo to a file. The file will have the same name
+as the terminal name.
+.SH SEE ALSO
+\fBterminfo\fR(\*n), \fBncurses\fR(3X), \fBtic\fR(1m), \fBinfocmp\fR(1m).
+You should also have the documentation supplied by the terminal
+manufacturer.
+.SH BUGS
+If the screen size is incorrect, many of the tests will fail.
+.SH AUTHOR
+Concept, design, and original implementation by
+Daniel Weaver <danw@znyx.com>. Portions of the code and
+documentation are by Eric S. Raymond <esr@snark.thyrsus.com>.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/contrib/ncurses/tack/tack.c b/contrib/ncurses/tack/tack.c
new file mode 100644
index 000000000000..8ada023ff4b0
--- /dev/null
+++ b/contrib/ncurses/tack/tack.c
@@ -0,0 +1,620 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+#include <tack.h>
+
+MODULE_ID("$Id: tack.c,v 1.1 1998/01/10 01:34:45 tom Exp $")
+
+/*
+ This program is designed to test terminfo, not curses. Therefore
+ I have used as little of curses as possible.
+
+ Pads associated with the following capabilities are used to set
+ delay times in the handler: (cr), (ind), (cub1), (ff), (tab).
+
+ I use the (nxon) capability to set the tty handler with/without
+ xon/xoff. If (smxon)/(rmxon) is defined I will change the terminal
+ too.
+
+ (xon) inhibits the sending of delay characters in putp().
+ If the terminal is defined with no padding then the (xon) boolean
+ is a don't care. In this case I recommend that it be reset.
+ */
+
+/*****************************************************************************
+ *
+ * Option processing
+ *
+ *****************************************************************************/
+
+/* options and modes */
+int debug_level; /* debugging level */
+int translate_mode; /* translate tab, bs, cr, lf, ff */
+int scan_mode; /* use scan codes */
+int char_mask; /* either 0xFF else 0x7F, eight bit data mask */
+int select_delay_type; /* set handler delays for <cr><lf> */
+int select_xon_xoff; /* TTY driver XON/XOFF mode select */
+int hex_out; /* Display output in hex */
+int send_reset_init; /* Send the reset and initialization strings */
+FILE *log_fp; /* Terminal logfile */
+
+/*****************************************************************************
+ *
+ * Menu definitions
+ *
+ *****************************************************************************/
+
+extern struct test_menu sync_menu;
+
+static void tools_hex_echo(struct test_list *, int *, int *);
+static void tools_debug(struct test_list *, int *, int *);
+
+static char hex_echo_menu_entry[80];
+
+struct test_list tools_test_list[] = {
+ {0, 0, 0, 0, "s) ANSI status reports", tools_status, 0},
+ {0, 0, 0, 0, "g) ANSI SGR modes (bold, underline, reverse)", tools_sgr, 0},
+ {0, 0, 0, 0, "c) ANSI character sets", tools_charset, 0},
+ {0, 0, 0, 0, hex_echo_menu_entry, tools_hex_echo, 0},
+ {0, 0, 0, 0, "e) echo tool", tools_report, 0},
+ {1, 0, 0, 0, "r) reply tool", tools_report, 0},
+ {0, 0, 0, 0, "p) performance testing", 0, &sync_menu},
+ {0, 0, 0, 0, "i) send reset and init", menu_reset_init, 0},
+ {0, 0, "u8) (u9", 0, "u) test ENQ/ACK handshake", sync_handshake, 0},
+ {0, 0, 0, 0, "d) change debug level", tools_debug, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+struct test_menu tools_menu = {
+ 0, 'q', 0, "Tools Menu", "tools",
+ 0, 0, tools_test_list, 0, 0, 0
+};
+
+static void tty_width(struct test_list *, int *, int *);
+static void tty_delay(struct test_list *, int *, int *);
+static void tty_xon(struct test_list *, int *, int *);
+static void tty_trans(struct test_list *, int *, int *);
+static void tty_show_state(struct test_menu *);
+
+static char tty_width_menu[80];
+static char tty_delay_menu[80];
+static char tty_xon_menu[80];
+static char tty_trans_menu[80];
+static char enable_xon_xoff[] = {"x) enable xon/xoff"};
+static char disable_xon_xoff[] = {"x) disable xon/xoff"};
+
+static struct test_list tty_test_list[] = {
+ {0, 0, 0, 0, tty_width_menu, tty_width, 0},
+ {0, 0, 0, 0, tty_delay_menu, tty_delay, 0},
+ {0, 0, 0, 0, tty_xon_menu, tty_xon, 0},
+ {0, 0, 0, 0, tty_trans_menu, tty_trans, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+static struct test_menu tty_menu = {
+ 0, 'q', 0, "Terminal and driver configuration",
+ "tty", 0,
+ tty_show_state, tty_test_list, 0, 0, 0
+};
+
+extern struct test_list edit_test_list[];
+
+struct test_menu edit_menu = {
+ 0, 'q', 0, "Edit terminfo menu",
+ "edit", 0,
+ 0, edit_test_list, 0, 0, 0
+};
+
+extern struct test_list mode_test_list[];
+
+struct test_menu mode_menu = {
+ 0, 'n', 0, "Mode test menu",
+ "mode", "n) run standard tests",
+ 0, mode_test_list, 0, 0, 0
+};
+
+extern struct test_list acs_test_list[];
+
+static struct test_menu acs_menu = {
+ 0, 'n', 0,
+ "Alternate character set and graphics rendition test menu",
+ "acs", "n) run standard tests",
+ 0, acs_test_list, 0, 0, 0
+};
+
+extern struct test_list color_test_list[];
+
+struct test_menu color_menu = {
+ 0, 'n', 0,
+ "Color test menu",
+ "color", "n) run standard tests",
+ 0, color_test_list, 0, 0, 0
+};
+
+extern struct test_list crum_test_list[];
+
+static struct test_menu crum_menu = {
+ 0, 'n', 0,
+ "Cursor movement test menu",
+ "move", "n) run standard tests",
+ 0, crum_test_list, 0, 0, 0
+};
+
+extern struct test_list funkey_test_list[];
+
+static struct test_menu funkey_menu = {
+ 0, 'n', 0,
+ "Function key test menu",
+ "fkey", "n) run standard tests",
+ sync_test, funkey_test_list, 0, 0, 0
+};
+
+extern struct test_list printer_test_list[];
+
+static struct test_menu printer_menu = {
+ 0, 'n', 0,
+ "Printer test menu",
+ "printer", "n) run standard tests",
+ 0, printer_test_list, 0, 0, 0
+};
+
+static void pad_gen(struct test_list *, int *, int *);
+extern struct test_list pad_test_list[];
+
+static struct test_menu pad_menu = {
+ 0, 'n', 0,
+ "Pad test menu",
+ "pad", "n) run standard tests",
+ sync_test, pad_test_list, 0, 0, 0
+};
+
+static struct test_list normal_test_list[] = {
+ {0, 0, 0, 0, "e) edit terminfo", 0, &edit_menu},
+ {0, 0, 0, 0, "i) send reset and init", menu_reset_init, 0},
+ {MENU_NEXT, 0, 0, 0, "x) test modes and glitches", 0, &mode_menu},
+ {MENU_NEXT, 0, 0, 0, "a) test alternate character sets", 0, &acs_menu},
+ {MENU_NEXT, 0, 0, 0, "c) test color", 0, &color_menu},
+ {MENU_NEXT, 0, 0, 0, "m) test cursor movement", 0, &crum_menu},
+ {MENU_NEXT, 0, 0, 0, "f) test function keys", 0, &funkey_menu},
+ {MENU_NEXT, 0, 0, 0, "p) test string capabilities", 0, &pad_menu},
+ {0, 0, 0, 0, "P) test printer", 0, &printer_menu},
+ {MENU_MENU, 0, 0, 0, "/) test a specific capability", 0, 0},
+ {0, 0, 0, 0, "t) auto generate pad delays", pad_gen, &pad_menu},
+ {0, 0, "u8) (u9", 0, 0, sync_handshake, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+
+struct test_menu normal_menu = {
+ 0, 'n', 0, "Main test menu",
+ "test", "n) run standard tests",
+ 0, normal_test_list, 0, 0, 0
+};
+
+static void start_tools(struct test_list *, int *, int *);
+static void start_modes(struct test_list *, int *, int *);
+static void start_basic(struct test_list *, int *, int *);
+static void start_log(struct test_list *, int *, int *);
+
+static char logging_menu_entry[80] = "l) start logging";
+
+struct test_list start_test_list[] = {
+ {0, 0, 0, 0, "b) display basic information", start_basic, 0},
+ {0, 0, 0, 0, "m) change modes", start_modes, 0},
+ {0, 0, 0, 0, "t) tools", start_tools, 0},
+ {MENU_COMPLETE, 0, 0, 0, "n) begin testing", 0, &normal_menu},
+ {0, 0, 0, 0, logging_menu_entry, start_log, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+
+struct test_menu start_menu = {
+ 0, 'n', 0, "Main Menu", "tack", 0,
+ 0, start_test_list, 0, 0, 0
+};
+
+static struct test_list write_terminfo_list[] = {
+ {0, 0, 0, 0, "w) write the current terminfo to a file", save_info, 0},
+ {MENU_LAST, 0, 0, 0, 0, 0, 0}
+};
+
+/*****************************************************************************
+ *
+ * Menu command interpretation.
+ *
+ *****************************************************************************/
+
+/*
+** tools_hex_echo(testlist, state, ch)
+**
+** Flip the hex echo flag.
+*/
+static void
+tools_hex_echo(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ if (hex_out) {
+ hex_out = FALSE;
+ strcpy(hex_echo_menu_entry,
+ "h) enable hex output on echo tool");
+ } else {
+ hex_out = TRUE;
+ strcpy(hex_echo_menu_entry,
+ "h) disable hex output on echo tool");
+ }
+}
+
+/*
+** tools_debug(testlist, state, ch)
+**
+** Change the debug level.
+*/
+static void
+tools_debug(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ char buf[32];
+
+ ptext("Enter a new value: ");
+ read_string(buf, sizeof(buf));
+ if (buf[0]) {
+ sscanf(buf, "%d", &debug_level);
+ }
+ sprintf(temp, "Debug level is now %d", debug_level);
+ ptext(temp);
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** start_tools(testlist, state, ch)
+**
+** Run the generic test tools
+*/
+static void
+start_tools(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ if (hex_out) {
+ strcpy(hex_echo_menu_entry,
+ "h) disable hex output on echo tool");
+ } else {
+ strcpy(hex_echo_menu_entry,
+ "h) enable hex output on echo tool");
+ }
+ menu_display(&tools_menu, 0);
+}
+
+/*
+** tty_show_state()
+**
+** Display the current state on the tty driver settings
+*/
+static void
+tty_show_state(
+ struct test_menu *menu GCC_UNUSED)
+{
+ put_crlf();
+ (void) sprintf(temp,
+ "Accepting %d bits, UNIX delays %d, XON/XOFF %sabled, speed %ld, translate %s, scan-code mode %s.",
+ (char_mask == ALLOW_PARITY) ? 8 : 7,
+ select_delay_type,
+ select_xon_xoff ? "en" : "dis",
+ tty_baud_rate,
+ translate_mode ? "on" : "off",
+ scan_mode ? "on" : "off");
+ ptextln(temp);
+ put_crlf();
+}
+
+/*
+** tty_width(testlist, state, ch)
+**
+** Change the character width
+*/
+static void
+tty_width(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ if (char_mask == STRIP_PARITY) {
+ char_mask = ALLOW_PARITY;
+ strcpy(tty_width_menu, "7) treat terminal as 7-bit");
+ } else {
+ char_mask = STRIP_PARITY;
+ strcpy(tty_width_menu, "8) treat terminal as 8-bit");
+ }
+}
+
+/*
+** tty_delay(testlist, state, ch)
+**
+** Change the delay for <cr><lf> in the TTY driver
+*/
+static void
+tty_delay(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ if (select_delay_type) {
+ select_delay_type = FALSE;
+ strcpy(tty_delay_menu,
+ "d) enable UNIX tty driver delays for <cr><lf>");
+ } else {
+ select_delay_type = TRUE;
+ strcpy(tty_delay_menu,
+ "d) disable UNIX tty driver delays for <cr><lf>");
+ }
+}
+
+/*
+** tty_xon(testlist, state, ch)
+**
+** Change the XON/XOFF flags in the TTY driver
+*/
+static void
+tty_xon(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ if (select_xon_xoff) {
+ if (needs_xon_xoff) {
+ ptextln("This terminal is marked as needing XON/XOFF protocol with (nxon)");
+ }
+ if (exit_xon_mode) {
+ tc_putp(exit_xon_mode);
+ }
+ xon_xoff = select_xon_xoff = FALSE;
+ strcpy(tty_xon_menu, enable_xon_xoff);
+ } else {
+ if (enter_xon_mode) {
+ tc_putp(enter_xon_mode);
+ }
+ xon_xoff = select_xon_xoff = TRUE;
+ strcpy(tty_xon_menu, disable_xon_xoff);
+ }
+ tty_set();
+}
+
+/*
+** tty_trans(testlist, state, ch)
+**
+** Change the translation mode for special characters
+*/
+static void
+tty_trans(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ if (translate_mode) {
+ translate_mode = FALSE;
+ strcpy(tty_trans_menu,
+ "t) use terminfo values for \\b\\f\\n\\r\\t");
+ } else {
+ translate_mode = TRUE;
+ strcpy(tty_trans_menu,
+ "t) override terminfo values for \\b\\f\\n\\r\\t");
+ }
+}
+
+/*
+** pad_gen(testlist, state, ch)
+**
+** Menu function for automatic pad generation
+*/
+static void
+pad_gen(
+ struct test_list *t,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ control_init();
+ if (tty_can_sync == SYNC_NOT_TESTED) {
+ verify_time();
+ }
+ auto_pad_mode = TRUE;
+ menu_display(t->sub_menu, ch);
+ auto_pad_mode = FALSE;
+}
+
+/*
+** start_modes(testlist, state, ch)
+**
+** Change the TTY modes
+*/
+static void
+start_modes(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+
+ if (select_delay_type) {
+ strcpy(tty_delay_menu,
+ "d) disable UNIX tty driver delays for <cr><lf>");
+ } else {
+ strcpy(tty_delay_menu,
+ "d) enable UNIX tty driver delays for <cr><lf>");
+ }
+ if (char_mask == ALLOW_PARITY) {
+ strcpy(tty_width_menu,
+ "7) treat terminal as 7-bit");
+ } else {
+ strcpy(tty_width_menu,
+ "8) treat terminal as 8-bit");
+ }
+ if (select_xon_xoff) {
+ strcpy(tty_xon_menu, disable_xon_xoff);
+ } else {
+ strcpy(tty_xon_menu, enable_xon_xoff);
+ }
+ if (translate_mode) {
+ strcpy(tty_trans_menu,
+ "t) override terminfo values for \\b\\f\\n\\r\\t");
+ } else {
+ strcpy(tty_trans_menu,
+ "t) use terminfo values for \\b\\f\\n\\r\\t");
+ }
+ menu_display(&tty_menu, 0);
+ tty_set();
+}
+
+/*
+** start_basic(testlist, state, ch)
+**
+** Display basic terminal information
+*/
+static void
+start_basic(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch)
+{
+ display_basic();
+ *ch = REQUEST_PROMPT;
+}
+
+/*
+** start_log(testlist, state, ch)
+**
+** Start/stop in logging function
+*/
+static void
+start_log(
+ struct test_list *t GCC_UNUSED,
+ int *state GCC_UNUSED,
+ int *ch GCC_UNUSED)
+{
+ if (logging_menu_entry[5] == 'a') {
+ ptextln("The log file will capture all characters sent to the terminal.");
+ if ((log_fp = fopen("tack.log", "w"))) {
+ ptextln("Start logging to file: tack.log");
+ strcpy(logging_menu_entry, "l) stop logging");
+ } else {
+ ptextln("File open error: tack.log");
+ }
+ } else {
+ if (log_fp) {
+ fclose(log_fp);
+ log_fp = 0;
+ }
+ ptextln("Terminal output logging stopped.");
+ strcpy(logging_menu_entry, "l) start logging");
+ }
+}
+
+/*
+** show_usage()
+**
+** Tell the user how its done.
+*/
+void
+show_usage(
+ char *name)
+{
+ (void) fprintf(stderr, "usage: %s [-itV] [term]\n", name);
+}
+
+/*
+** print_version()
+**
+** Print version and other useful information.
+*/
+void
+print_version(void)
+{
+ printf("tack version %d.%02d\n", MAJOR_VERSION, MINOR_VERSION);
+ printf("Copyright (C) 1997 Free Software Foundation, Inc.\n");
+ printf("Tack comes with NO WARRANTY, to the extent permitted by law.\n");
+ printf("You may redistribute copies of Tack under the terms of the\n");
+ printf("GNU General Public License. For more information about\n");
+ printf("these matters, see the file named COPYING.\n");
+}
+
+
+/*****************************************************************************
+ *
+ * Main sequence
+ *
+ *****************************************************************************/
+
+int
+main(int argc, char *argv[])
+{
+ int i, j;
+ char *term_variable;
+
+ /* scan the option flags */
+ send_reset_init = TRUE;
+ translate_mode = FALSE;
+ term_variable = getenv("TERM");
+ tty_can_sync = SYNC_NOT_TESTED;
+ for (i = 1; i < argc; i++) {
+ if (argv[i][0] == '-') {
+ for (j = 1; argv[i][j]; j++) {
+ switch (argv[i][j]) {
+ case 'V':
+ print_version();
+ return (1);
+ case 'i':
+ send_reset_init = FALSE;
+ break;
+ case 't':
+ translate_mode = FALSE;
+ break;
+ default:
+ show_usage(argv[0]);
+ return (0);
+ }
+ }
+ } else {
+ term_variable = argv[i];
+ }
+ }
+ (void) strcpy(tty_basename, term_variable);
+
+ curses_setup(argv[0]);
+
+ menu_can_scan(&normal_menu); /* extract which caps can be tested */
+ menu_display(&start_menu, 0);
+
+ if (user_modified()) {
+ sprintf(temp, "Hit y to save changes to file: %s ? ",
+ tty_basename);
+ ptext(temp);
+ if (wait_here() == 'y') {
+ save_info(write_terminfo_list, &i, &j);
+ }
+ }
+
+ put_str("\nTerminal test complete\n");
+ bye_kids(0);
+ return (0);
+}
diff --git a/contrib/ncurses/tack/tack.h b/contrib/ncurses/tack/tack.h
new file mode 100644
index 000000000000..22e15af57444
--- /dev/null
+++ b/contrib/ncurses/tack/tack.h
@@ -0,0 +1,403 @@
+/*
+** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
+**
+** This file is part of TACK.
+**
+** TACK 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 2, or (at your option)
+** any later version.
+**
+** TACK 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 TACK; see the file COPYING. If not, write to
+** the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+** Boston, MA 02111-1307, USA.
+*/
+
+/* $Id: tack.h,v 1.5 1999/06/26 22:14:07 tom Exp $ */
+
+#ifndef _TACK_H
+#define _TACK_H 1
+
+/* terminfo action checker include file */
+
+#define MAJOR_VERSION 1
+#define MINOR_VERSION 0
+
+#ifdef HAVE_CONFIG_H
+#include <ncurses_cfg.h>
+#else
+#define RETSIGTYPE void
+#define GCC_UNUSED /*nothing*/
+#define HAVE_GETTIMEOFDAY 1
+#define HAVE_SELECT 1
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_TIME_SELECT 1
+#endif
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
+
+#include <curses.h>
+#include <term_entry.h>
+
+#if USE_RCS_IDS
+#define MODULE_ID(id) static const char Ident[] = id;
+#else
+#define MODULE_ID(id) /*nothing*/
+#endif
+
+#if !HAVE_STRSTR
+extern char *_nc_strstr(const char *, const char *);
+#define strstr(h,n) _nc_strstr(h,n)
+#endif
+
+extern FILE *log_fp;
+extern FILE *debug_fp;
+extern int debug_level;
+extern char temp[];
+extern char tty_basename[];
+extern char tty_shortname[];
+
+#define SYNC_FAILED 0
+#define SYNC_TESTED 1
+#define SYNC_NOT_TESTED 2
+#define SYNC_NEEDED 3
+
+extern int tty_can_sync;
+extern int total_pads_sent; /* count pad characters sent */
+extern int total_caps_sent; /* count caps sent */
+extern int total_printing_characters; /* count printing characters sent */
+extern int no_alarm_event; /* TRUE if the alarm has not gone off yet */
+extern int usec_run_time; /* length of last test in microseconds */
+extern int raw_characters_sent; /* Total output characters */
+
+/* Stopwatch event timers */
+#define TIME_TEST 0
+#define TIME_SYNC 1
+#define TIME_FLUSH 2
+#define MAX_TIMERS 3
+
+/* definitions for pad.c */
+
+#define EXIT_CONDITION (no_alarm_event && (tt_delay_used < tt_delay_max))
+#define SLOW_TERMINAL_EXIT if (!test_complete && !EXIT_CONDITION) { break; }
+#define CAP_NOT_FOUND if (auto_pad_mode) return
+
+extern char letters[26+1];
+#define NEXT_LETTER letter = letters[letter_number =\
+ letters[letter_number + 1] ? letter_number + 1 : 0]
+
+extern int test_complete; /* counts number of tests completed */
+extern char letter;
+extern int letter_number;
+extern int augment, repeats;
+extern long char_sent;
+extern const char *pad_repeat_test; /* commands that force repeat */
+
+extern int replace_mode;
+extern int char_count, line_count, expand_chars;
+extern int can_go_home, can_clear_screen;
+
+extern int translate_mode, scan_mode;
+extern int auto_pad_mode; /* TRUE for auto time tests */
+extern int char_mask;
+extern int hex_out; /* Display output in hex */
+
+/* Parity bit macros */
+#define STRIP_PARITY 0x7f
+#define ALLOW_PARITY 0xff
+
+/* select_delay_type: 0 -> reset all delays
+ 1 -> force long delays
+ 2 -> do not change the delays */
+extern int select_delay_type;
+
+/* select_xon_xoff: 0 -> reset xon/xoff
+ 1 -> set xon/xoff
+ 2 -> do not change xon/xoff */
+extern int select_xon_xoff;
+
+extern int tty_frame_size;
+extern unsigned long tty_baud_rate;
+extern int tty_cps; /* The number of characters per second */
+extern int not_a_tty, nodelay_read;
+extern int send_reset_init;
+
+/* definitions for stty_query() and initial_stty_query() */
+#define TTY_CHAR_MODE 0
+#define TTY_NOECHO 1
+#define TTY_OUT_TRANS 2
+#define TTY_8_BIT 3
+#define TTY_XON_XOFF 4
+
+/* scan code definitions */
+#define MAX_SCAN 256
+
+/* translate mode default strings */
+struct default_string_list {
+ const char *name; /* terminfo name */
+ const char *value; /* value of default string */
+ int index; /* index into the strfname[] array */
+};
+
+#define TM_last 8
+extern struct default_string_list TM_string[TM_last];
+
+/* attribute structure definition */
+struct mode_list {
+ const char *name;
+ const char *begin_mode;
+ const char *end_mode;
+ int number;
+};
+
+extern const struct mode_list alt_modes[];
+extern const int mode_map[];
+
+/* Test data base */
+
+#define FLAG_CAN_TEST 1
+#define FLAG_TESTED 2
+#define FLAG_LABEL 4
+#define FLAG_FUNCTION_KEY 8
+
+/* caps under test data base */
+
+#define TT_MAX 8
+#define MAX_CHANGES (TT_MAX+2)
+
+extern int tt_delay_max; /* max number of milliseconds we can delay */
+extern int tt_delay_used; /* number of milliseconds consumed in delay */
+extern const char *tt_cap[TT_MAX]; /* value of string */
+extern int tt_affected[TT_MAX]; /* lines or columns effected (repitition
+ factor) */
+extern int tt_count[TT_MAX]; /* Number of times sent */
+extern int tt_delay[TT_MAX]; /* Number of milliseconds delay */
+extern int ttp; /* number of entries used */
+
+extern const char *tx_cap[TT_MAX]; /* value of string */
+extern int tx_affected[TT_MAX]; /* lines or columns effected (repitition
+ factor) */
+extern int tx_count[TT_MAX]; /* Number of times sent */
+extern int tx_delay[TT_MAX]; /* Number of milliseconds delay */
+extern int tx_index[TT_MAX]; /* String index */
+extern int txp; /* number of entries used */
+extern int tx_characters; /* printing characters sent by test */
+extern int tx_cps; /* characters per second */
+
+/*
+ Menu control for tack.
+*/
+
+struct test_results {
+ struct test_results *next; /* point to next entry */
+ struct test_list *test; /* Test which got these results */
+ int reps; /* repeat count */
+ int delay; /* delay times 10 */
+};
+
+struct test_list {
+ int flags; /* Test description flags */
+ int lines_needed; /* Lines needed for test (0->no action) */
+ const char *caps_done; /* Caps shown in Done message */
+ const char *caps_tested; /* Other caps also being tested */
+ const char *menu_entry; /* Menu entry text (optional) */
+ /* Function that does testing */
+ void (*test_procedure)(struct test_list *, int *, int *);
+ struct test_menu *sub_menu; /* Nested sub-menu */
+};
+
+struct test_menu {
+ int flags; /* Menu feature flag */
+ int default_action; /* Default command if <cr> <lf> entered */
+ const char *menu_text; /* Describe this test_menu */
+ const char *menu_title; /* Title for the menu */
+ const char *ident; /* short menu name */
+ const char *standard_tests; /* Standard test text */
+ /* print current settings (optional) */
+ void (*menu_function)(struct test_menu *);
+ struct test_list *tests; /* Pointer to the menu/function pairs */
+ struct test_list *resume_tests; /* Standard test resume point */
+ int resume_state; /* resume state of test group */
+ int resume_char; /* resume ch of test group */
+};
+
+
+/* menu flags */
+#define MENU_100c 0x00001a00 /* Augment 100% of columns */
+#define MENU_90c 0x00001900 /* Augment 90% of columns */
+#define MENU_80c 0x00001800 /* Augment 80% of columns */
+#define MENU_70c 0x00001700 /* Augment 70% of columns */
+#define MENU_60c 0x00001600 /* Augment 60% of columns */
+#define MENU_50c 0x00001500 /* Augment 50% of columns */
+#define MENU_40c 0x00001400 /* Augment 40% of columns */
+#define MENU_30c 0x00001300 /* Augment 30% of columns */
+#define MENU_20c 0x00001200 /* Augment 20% of columns */
+#define MENU_10c 0x00001100 /* Augment 10% of columns */
+#define MENU_LM1 0x00002e00 /* Augment lines - 1 */
+#define MENU_100l 0x00002a00 /* Augment 100% of lines */
+#define MENU_90l 0x00002900 /* Augment 90% of lines */
+#define MENU_50l 0x00002500 /* Augment 50% of lines */
+#define MENU_lines 0x00002000 /* Augment of lines */
+#define MENU_columns 0x00001000 /* Augment of columns */
+#define MENU_LC_MASK 0x00003000 /* Augment mask for lines and columns */
+#define MENU_1L 0x00002f00 /* Augment == one */
+#define MENU_1C 0x00001f00 /* Augment == one */
+#define MENU_ONE 0x00000f00 /* Augment == one */
+#define MENU_ONE_MASK 0x00000f00 /* Augment == one mask */
+#define MENU_REP_MASK 0x00003f00 /* Augment mask */
+
+#define MENU_CLEAR 0x00010000 /* clear screen */
+#define MENU_INIT 0x00020000 /* Initialization function */
+#define MENU_NEXT 0x00040000 /* Next test in sequence */
+#define MENU_LAST 0x00080000 /* End of menu list */
+#define MENU_STOP 0x00100000 /* Stop testing next-in-sequence */
+#define MENU_COMPLETE 0x00200000 /* Test complete after this */
+#define MENU_MENU 0x00400000 /* Pass the menu name not test name */
+
+#define REQUEST_PROMPT 256
+
+extern char prompt_string[80]; /* menu prompt storage */
+extern struct test_menu edit_menu;
+extern struct test_list *augment_test;
+
+/* tack.c */
+extern void show_usage(char *);
+extern void print_version(void);
+
+/* output.c */
+extern void tt_tputs(const char *, int);
+extern void tt_putp(const char *);
+extern void tt_putparm(NCURSES_CONST char *, int, int, int);
+extern int tc_putp(const char *);
+extern int tc_putch(int);
+extern void putchp(int);
+extern void put_cr(void);
+extern void put_crlf(void);
+extern void put_clear(void);
+extern void put_dec(char *, int);
+extern void put_str(const char *);
+extern void put_lf(void);
+extern void put_ind(void);
+extern void put_newlines(int);
+extern void put_columns(const char *, int, int);
+extern void put_this(int);
+extern void putln(const char *);
+extern void ptext(const char *);
+extern void ptextln(const char *);
+extern void home_down(void);
+extern void go_home(void);
+extern void three_digit(char *, int);
+extern int getchp(int);
+extern char *expand(const char *);
+extern char *expand_to(char *, int);
+extern char *expand_command(const char *);
+extern char *hex_expand_to(char *, int);
+extern char *print_expand(char *);
+extern void maybe_wait(int);
+extern int wait_here(void);
+extern void read_string(char *, int);
+extern int getnext(int);
+
+/* control.c */
+extern void event_start(int);
+extern long event_time(int);
+extern char *liberated(char *);
+extern void page_loop(void);
+extern void control_init(void);
+extern int msec_cost(const char *const, int);
+extern int skip_pad_test(struct test_list *, int *, int *, const char *);
+extern void pad_test_startup(int);
+extern int still_testing(void);
+extern void pad_test_shutdown(struct test_list *, int);
+extern void dump_test_stats(struct test_list *, int *, int *);
+extern void longer_test_time(struct test_list *, int *, int *);
+extern void shorter_test_time(struct test_list *, int *, int *);
+extern char txt_longer_test_time[80];
+extern char txt_shorter_test_time[80];
+extern void set_augment_txt(void);
+extern void longer_augment(struct test_list *, int *, int *);
+extern void shorter_augment(struct test_list *, int *, int *);
+extern char txt_longer_augment[80];
+extern char txt_shorter_augment[80];
+extern int sliding_scale(int, int, int);
+
+/* sync.c */
+extern void verify_time(void);
+extern int tty_sync_error(void);
+extern void flush_input(void);
+extern void sync_test(struct test_menu *);
+extern void sync_handshake(struct test_list *, int *, int *);
+
+/* charset.c */
+extern void set_attr(int);
+extern void eat_cookie(void);
+extern void put_mode(char *);
+
+/* init.c */
+extern void reset_init(void);
+extern void display_basic(void);
+extern void put_name(const char *, const char *);
+extern void charset_can_test(void);
+extern void curses_setup(char *);
+extern void bye_kids(int);
+
+/* scan.c */
+extern int scan_key(void);
+extern void scan_init(char *fn);
+
+/* ansi.c */
+extern void tools_status(struct test_list *, int *, int *);
+extern void tools_charset(struct test_list *, int *, int *);
+extern void tools_sgr(struct test_list *, int *, int *);
+
+/* pad.c */
+
+/* fun.c */
+extern void enter_key(const char *, char *, char *);
+extern int tty_meta_prep(void);
+extern void tools_report(struct test_list *, int *, int *);
+
+/* sysdep.c */
+extern void tty_set(void);
+extern void tty_raw(int, int);
+extern void tty_init(void);
+extern void tty_reset(void);
+extern void spin_flush(void);
+extern void read_key(char *, int);
+extern void set_alarm_clock(int);
+extern void ignoresig(void);
+extern int stty_query(int);
+extern int initial_stty_query(int);
+
+/* edit.c */
+extern int user_modified(void);
+extern void save_info(struct test_list *, int *, int *);
+extern void can_test(const char *, int);
+extern void cap_index(const char *, int *);
+extern int cap_match(const char *names, const char *cap);
+extern void edit_init(void);
+extern char *get_string_cap_byname(const char *, const char **);
+extern int get_string_cap_byvalue(const char *);
+extern void show_report(struct test_list *, int *, int *);
+
+/* menu.c */
+extern void menu_prompt(void);
+extern void menu_can_scan(const struct test_menu *);
+extern void menu_display(struct test_menu *, int *);
+extern void generic_done_message(struct test_list *, int *, int *);
+extern void pad_done_message(struct test_list *, int *, int *);
+extern void menu_clear_screen(struct test_list *, int *, int *);
+extern void menu_reset_init(struct test_list *, int *, int *);
+extern int subtest_menu(struct test_list *, int *, int *);
+
+#endif /* _TACK_H */
diff --git a/contrib/ncurses/tar-copy.sh b/contrib/ncurses/tar-copy.sh
new file mode 100755
index 000000000000..4e45bc34ed33
--- /dev/null
+++ b/contrib/ncurses/tar-copy.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+# $Id: tar-copy.sh,v 1.3 1998/02/11 12:14:03 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1997,1998
+#
+# Copy a collection of files using 'tar', so that their dates and links are
+# preserved
+#
+# Parameters:
+# $1 = files to copy
+# $2 = source directory
+# $3 = destination directory
+#
+#DOIT=echo
+DOIT=eval
+
+if test $# != 3 ; then
+ echo "Usage: $0 files source target"
+ exit 1
+elif test ! -d "$2" ; then
+ echo "Source directory not found: $2"
+ exit 1
+elif test ! -d "$3" ; then
+ echo "Target directory not found: $3"
+ exit 1
+fi
+
+WD=`pwd`
+
+TMP=$WD/copy$$
+trap "rm -f $TMP" 0 1 2 5 15
+
+cd $2
+if ( tar cf $TMP $1 )
+then
+ cd $3
+ LIST=`tar tf $TMP 2>&1`
+ $DOIT rm -rf $LIST 2>/dev/null
+ $DOIT tar xvf $TMP
+else
+ echo "Cannot create tar of $1 files"
+ exit 1
+fi
diff --git a/contrib/ncurses/test/Makefile.in b/contrib/ncurses/test/Makefile.in
new file mode 100644
index 000000000000..3626f2420e80
--- /dev/null
+++ b/contrib/ncurses/test/Makefile.in
@@ -0,0 +1,207 @@
+# $Id: Makefile.in,v 1.51 1999/04/10 21:31:59 tom Exp $
+##############################################################################
+# Copyright (c) 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> 1996,1997,1998
+#
+# Makefile for ncurses tests.
+
+# turn off _all_ suffix rules; we'll generate our own
+.SUFFIXES:
+
+SHELL = /bin/sh
+
+x = @PROG_EXT@
+
+MODEL = ../@DFT_OBJ_SUBDIR@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+includedir = @includedir@
+
+CC = @CC@
+
+CFLAGS = @CFLAGS@
+CPPFLAGS = -I../test -I$(srcdir) @CPPFLAGS@ -DHAVE_CONFIG_H
+
+CCFLAGS = $(CPPFLAGS) $(CFLAGS)
+
+CFLAGS_NORMAL = $(CCFLAGS)
+CFLAGS_DEBUG = $(CCFLAGS) @CC_G_OPT@ -DTRACE
+CFLAGS_PROFILE = $(CCFLAGS) -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_LIBS = @TEST_DEPS@
+MATH_LIB = @MATH_LIB@
+
+LD = @LD@
+LINK = @LINK_TESTS@ $(CC)
+
+LDFLAGS = @LD_MODEL@ @TEST_ARGS@ @LIBS@ @EXTRA_LIBS@ @LOCAL_LDFLAGS@ @LDFLAGS@
+
+LDFLAGS_NORMAL = $(LDFLAGS)
+LDFLAGS_DEBUG = $(LDFLAGS) @CC_G_OPT@
+LDFLAGS_PROFILE = $(LDFLAGS) -pg
+LDFLAGS_SHARED = $(LDFLAGS) @LD_SHARED_OPTS@
+
+LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@)
+
+LINT = @LINT@
+LINT_OPTS = @LINT_OPTS@
+LINT_LIBS = -lform -lmenu -lpanel -lncurses @LIBS@
+
+TESTS = \
+ blue$x \
+ bs$x \
+ cardfile$x \
+ ditto$x \
+ filter$x \
+ firework$x \
+ firstlast$x \
+ gdc$x \
+ hanoi$x \
+ hashtest$x \
+ keynames$x \
+ knight$x \
+ lrtest$x \
+ ncurses$x \
+ newdemo$x \
+ rain$x \
+ tclock$x \
+ testaddch$x \
+ testcurs$x \
+ testscanw$x \
+ view$x \
+ worm$x \
+ xmas$x
+
+all: $(TESTS)
+
+sources:
+
+blue$x: $(MODEL)/blue.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/blue.o $(LDFLAGS_DEFAULT)
+
+bs$x: $(MODEL)/bs.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/bs.o $(LDFLAGS_DEFAULT)
+
+cardfile$x: $(MODEL)/cardfile.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/cardfile.o $(LDFLAGS_DEFAULT)
+
+ditto$x: $(MODEL)/ditto.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/ditto.o $(LDFLAGS_DEFAULT)
+
+filter$x: $(MODEL)/filter.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/filter.o $(LDFLAGS_DEFAULT)
+
+firework$x: $(MODEL)/firework.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/firework.o $(LDFLAGS_DEFAULT)
+
+firstlast$x: $(MODEL)/firstlast.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/firstlast.o $(LDFLAGS_DEFAULT)
+
+gdc$x: $(MODEL)/gdc.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/gdc.o $(LDFLAGS_DEFAULT)
+
+hanoi$x: $(MODEL)/hanoi.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/hanoi.o $(LDFLAGS_DEFAULT)
+
+hashtest$x: $(MODEL)/hashtest.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/hashtest.o $(LDFLAGS_DEFAULT)
+
+keynames$x: $(MODEL)/keynames.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/keynames.o $(LDFLAGS_DEFAULT)
+
+knight$x: $(MODEL)/knight.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/knight.o $(LDFLAGS_DEFAULT)
+
+lrtest$x: $(MODEL)/lrtest.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/lrtest.o $(LDFLAGS_DEFAULT)
+
+ncurses$x: $(MODEL)/ncurses.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/ncurses.o $(LDFLAGS_DEFAULT)
+
+newdemo$x: $(MODEL)/newdemo.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/newdemo.o $(LDFLAGS_DEFAULT)
+
+rain$x: $(MODEL)/rain.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/rain.o $(LDFLAGS_DEFAULT)
+
+tclock$x: $(MODEL)/tclock.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/tclock.o $(LDFLAGS_DEFAULT) $(MATH_LIB)
+
+testaddch$x: $(MODEL)/testaddch.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/testaddch.o $(LDFLAGS_DEFAULT)
+
+testcurs$x: $(MODEL)/testcurs.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/testcurs.o $(LDFLAGS_DEFAULT)
+
+testscanw$x: $(MODEL)/testscanw.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/testscanw.o $(LDFLAGS_DEFAULT)
+
+view$x: $(MODEL)/view.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/view.o $(LDFLAGS_DEFAULT)
+
+worm$x: $(MODEL)/worm.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/worm.o $(LDFLAGS_DEFAULT)
+
+xmas$x: $(MODEL)/xmas.o $(LOCAL_LIBS)
+ @ECHO_LINK@ $(LINK) -o $@ $(MODEL)/xmas.o $(LDFLAGS_DEFAULT)
+
+install:
+install.libs:
+install.test:
+
+uninstall:
+uninstall.libs:
+uninstall.test:
+
+mostlyclean ::
+ -rm -f core tags TAGS *~ *.ln *.atac trace
+
+clean :: mostlyclean
+ -rm -rf *.o screendump *.lis $(TESTS)
+
+distclean :: clean
+ -rm -f Makefile ncurses_cfg.h config.*
+
+realclean :: distclean
+
+lint:
+ sh -c 'for N in $(TESTS); do echo LINT:$$N; $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/$$N.c $(LINT_LIBS); done'
+
+# Use this to get a list of test-programs for the standalone configure script.
+echo_tests :
+ @echo "$(TESTS)"
+echo_suffix :
+ @echo "$x"
diff --git a/contrib/ncurses/test/README b/contrib/ncurses/test/README
new file mode 100644
index 000000000000..cd1767a179b2
--- /dev/null
+++ b/contrib/ncurses/test/README
@@ -0,0 +1,22 @@
+The programs in this directory are designed to test your newest toy :-)
+Check the sources for any further details.
+
+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)
+worm.c - worms run all over your screen (uses color)
+xmas.c - Xmas greeting card
+
+The bs and knight games demonstrate processing of mouse events under xterm.
+This directory also contains:
+
+tracemunch - Perl script to crunch trace scripts to make them easier to read
diff --git a/contrib/ncurses/test/blue.c b/contrib/ncurses/test/blue.c
new file mode 100644
index 000000000000..4f7335132bba
--- /dev/null
+++ b/contrib/ncurses/test/blue.c
@@ -0,0 +1,440 @@
+/*****************************************************************************
+ * *
+ * B l u e M o o n *
+ * ================= *
+ * V2.2 *
+ * A patience game by T.A.Lister *
+ * Integral screen support by Eric S. Raymond *
+ * *
+ *****************************************************************************/
+
+/*
+ * Compile this with the command `cc -O blue.c -lcurses -o blue'. For best
+ * results, use the ncurses(3) library. On non-Intel machines, SVr4 curses is
+ * just as good.
+ *
+ * $Id: blue.c,v 1.18 1999/01/17 00:11:56 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <string.h>
+#include <signal.h>
+#include <time.h>
+
+#include <term.h>
+
+#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 RETSIGTYPE die(int onsig) GCC_NORETURN;
+
+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'}
+};
+
+/* Please note, that this is a bad example.
+ Color values should not be or'ed in. This
+ only works, because the characters used here
+ are plain and have no color attribute themselves. */
+#ifdef COLOR_PAIR
+#define OR_COLORS(value,pair) ((value) | COLOR_PAIR(pair))
+#else
+#define OR_COLORS(value,pair) (value)
+#endif
+
+#define PC_COLORS(value,pair) (OR_COLORS(value,pair) | A_ALTCHARSET)
+
+static chtype letters[4] =
+{
+ OR_COLORS('h', RED_ON_WHITE), /* hearts */
+ OR_COLORS('s', BLACK_ON_WHITE), /* spades */
+ OR_COLORS('d', RED_ON_WHITE), /* diamonds */
+ OR_COLORS('c', BLACK_ON_WHITE), /* clubs */
+};
+
+#if defined(__i386__)
+static chtype glyphs[] =
+{
+ PC_COLORS('\003', RED_ON_WHITE), /* hearts */
+ PC_COLORS('\006', BLACK_ON_WHITE), /* spades */
+ PC_COLORS('\004', RED_ON_WHITE), /* diamonds */
+ PC_COLORS('\005', BLACK_ON_WHITE), /* clubs */
+};
+#endif /* __i386__ */
+
+static chtype *suits = letters; /* this may change to glyphs below */
+
+static RETSIGTYPE die(int onsig)
+{
+ (void) signal(onsig, SIG_IGN);
+ endwin();
+ exit(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 i,j,numswaps,swapnum,temp;
+
+ numswaps=size*10; /* an arbitrary figure */
+
+ for (swapnum=0;swapnum<numswaps;swapnum++)
+ {
+ i=rand() % size;
+ j=rand() % size;
+ temp=deck[i];
+ deck[i]=deck[j];
+ deck[j]=temp;
+ }
+}
+
+static void deal_cards(void)
+{
+ int ptr, card=0, value, csuit, crank, suit, aces[4];
+
+ for (suit=HEARTS;suit<=CLUBS;suit++)
+ {
+ 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)
+{
+ (void) addch(' ');
+ if (value == NOCARD)
+ (void) addstr(" ");
+ else
+ {
+ addch(ranks[value % SUIT_LENGTH][0] | COLOR_PAIR(BLUE_ON_WHITE));
+ addch(ranks[value % SUIT_LENGTH][1] | COLOR_PAIR(BLUE_ON_WHITE));
+ addch(suits[value / SUIT_LENGTH]);
+ }
+ (void) 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++ = '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];
+
+ (void)sprintf(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();
+ (void) addch(' ');
+ } while
+ (((c = 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);
+ standout();
+ (void)printw("Finished deal %d - type any character to continue...", deal_number);
+ standend();
+ (void) getch();
+}
+
+static int collect_discards(void)
+{
+ int row, col, cardno=0, finish, gridno;
+
+ for (row=HEARTS;row<=CLUBS;row++)
+ {
+ 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);
+ 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");
+ standend();
+ (void) addstr(". ");
+ refresh();
+}
+
+int main(int argc, char *argv[])
+{
+ (void) signal(SIGINT, die);
+ initscr();
+
+ /*
+ * We use COLOR_GREEN because COLOR_BLACK is wired to the wrong thing.
+ */
+ 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);
+
+#ifndef COLOR_PAIR
+ letters[0] = OR_COLORS('h', RED_ON_WHITE); /* hearts */
+ letters[1] = OR_COLORS('s', BLACK_ON_WHITE); /* spades */
+ letters[2] = OR_COLORS('d', RED_ON_WHITE); /* diamonds */
+ letters[3] = OR_COLORS('c', BLACK_ON_WHITE); /* clubs */
+#if defined(__i386__) && defined(A_ALTCHARSET)
+ glyphs[0] = PC_COLORS('\003', RED_ON_WHITE); /* hearts */
+ glyphs[1] = PC_COLORS('\006', BLACK_ON_WHITE); /* spades */
+ glyphs[2] = PC_COLORS('\004', RED_ON_WHITE); /* diamonds */
+ glyphs[3] = PC_COLORS('\005', BLACK_ON_WHITE); /* clubs */
+#endif
+#endif
+
+#if defined(__i386__) && defined(A_ALTCHARSET)
+ if (tigetstr("smpch"))
+ suits = glyphs;
+#endif /* __i386__ && A_ALTCHARSET */
+
+ 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/contrib/ncurses/test/bs.6 b/contrib/ncurses/test/bs.6
new file mode 100644
index 000000000000..38cfe82a9811
--- /dev/null
+++ b/contrib/ncurses/test/bs.6
@@ -0,0 +1,42 @@
+.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/contrib/ncurses/test/bs.c b/contrib/ncurses/test/bs.c
new file mode 100644
index 000000000000..368abcd8f28d
--- /dev/null
+++ b/contrib/ncurses/test/bs.c
@@ -0,0 +1,1268 @@
+/*
+ * 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.24 1999/08/21 23:14:38 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <signal.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+#ifndef SIGIOT
+#define SIGIOT SIGABRT
+#endif
+
+#ifndef A_UNDERLINE /* BSD curses */
+#define beep() write(1,"\007",1);
+#define cbreak crmode
+#define saveterm savetty
+#define resetterm resetty
+#define nocbreak nocrmode
+#define strchr index
+#endif /* !A_UNDERLINE */
+
+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 */
+
+/* coordinate handling */
+#define BWIDTH 10
+#define BDEPTH 10
+
+/* display symbols */
+#define SHOWHIT '*'
+#define SHOWSPLASH ' '
+#define IS_SHIP(c) (isupper(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 name[40];
+static char dftname[] = "stranger";
+
+/* direction constants */
+#define E 0
+#define SE 1
+#define S 2
+#define SW 3
+#define W 4
+#define NW 5
+#define N 6
+#define NE 7
+static int xincr[8] = {1, 1, 0, -1, -1, -1, 0, 1};
+static int yincr[8] = {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 */
+ char x, y; /* coordinates of ship start point */
+ unsigned char 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 }
+
+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 RETSIGTYPE uninitgame(int sig) GCC_NORETURN;
+
+static RETSIGTYPE uninitgame(int sig GCC_UNUSED)
+/* end the game, either normally or due to signal */
+{
+ clear();
+ (void)refresh();
+ (void)resetterm();
+ (void)echo();
+ (void)endwin();
+ exit(EXIT_FAILURE);
+}
+
+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)
+{
+ char *tmpname;
+
+ srand((unsigned)(time(0L)+getpid())); /* Kick the random number generator */
+
+ (void) signal(SIGINT,uninitgame);
+ (void) signal(SIGINT,uninitgame);
+ (void) signal(SIGIOT,uninitgame); /* for assert(3) */
+ if(signal(SIGQUIT,SIG_IGN) != SIG_IGN)
+ (void)signal(SIGQUIT,uninitgame);
+
+ if((tmpname = getlogin()) != 0)
+ {
+ (void)strcpy(name,tmpname);
+ name[0] = toupper(name[0]);
+ }
+ else
+ (void)strcpy(name,dftname);
+
+ (void)initscr();
+#ifdef KEY_MIN
+ keypad(stdscr, TRUE);
+#endif /* KEY_MIN */
+ (void)saveterm();
+ (void)nonl();
+ (void)cbreak();
+ (void)noecho();
+
+#ifdef PENGUIN
+ (void)clear();
+ (void)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");
+
+ (void) 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);
+ (void) addch((chtype)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 */
+{
+ register int bwidth = BWIDTH - ss->length;
+ register int bdepth = BDEPTH - ss->length;
+
+ do {
+ ss->y = rnd(bdepth);
+ ss->x = rnd(bwidth);
+ ss->dir = rnd(2) ? E : S;
+ } while
+ (!checkplace(b, ss, FALSE));
+}
+
+static void initgame(void)
+{
+ int i, j, unplaced;
+ ship_t *ss;
+
+ (void) clear();
+ (void) 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 */
+ (void) mvaddstr(PYBASE - 2, PXBASE + 5, "Main Board");
+ (void) mvaddstr(PYBASE - 1, PXBASE - 3,numbers);
+ for(i=0; i < BDEPTH; ++i)
+ {
+ (void) mvaddch(PYBASE + i, PXBASE - 3, (chtype)(i + 'A'));
+#ifdef A_COLOR
+ if (has_colors())
+ attron(COLOR_PAIR(COLOR_BLUE));
+#endif /* A_COLOR */
+ (void) addch(' ');
+ for (j = 0; j < BWIDTH; j++)
+ (void) addstr(" . ");
+#ifdef A_COLOR
+ attrset(0);
+#endif /* A_COLOR */
+ (void) addch(' ');
+ (void) addch((chtype)(i + 'A'));
+ }
+ (void) mvaddstr(PYBASE + BDEPTH, PXBASE - 3,numbers);
+ (void) mvaddstr(CYBASE - 2, CXBASE + 7,"Hit/Miss Board");
+ (void) mvaddstr(CYBASE - 1, CXBASE - 3, numbers);
+ for(i=0; i < BDEPTH; ++i)
+ {
+ (void) mvaddch(CYBASE + i, CXBASE - 3, (chtype)(i + 'A'));
+#ifdef A_COLOR
+ if (has_colors())
+ attron(COLOR_PAIR(COLOR_BLUE));
+#endif /* A_COLOR */
+ (void) addch(' ');
+ for (j = 0; j < BWIDTH; j++)
+ (void) addstr(" . ");
+#ifdef A_COLOR
+ attrset(0);
+#endif /* A_COLOR */
+ (void) addch(' ');
+ (void) addch((chtype)(i + 'A'));
+ }
+
+ (void) mvaddstr(CYBASE + BDEPTH,CXBASE - 3,numbers);
+
+ (void) mvprintw(HYBASE, HXBASE,
+ "To position your ships: move the cursor to a spot, then");
+ (void) mvprintw(HYBASE+1,HXBASE,
+ "type the first letter of a ship type to select it, then");
+ (void) mvprintw(HYBASE+2,HXBASE,
+ "type a direction ([hjkl] or [4862]), indicating how the");
+ (void) mvprintw(HYBASE+3,HXBASE,
+ "ship should be pointed. You may also type a ship letter");
+ (void) mvprintw(HYBASE+4,HXBASE,
+ "followed by `r' to position it randomly, or type `R' to");
+ (void) mvprintw(HYBASE+5,HXBASE,
+ "place all remaining ships randomly.");
+
+ (void) mvaddstr(MYBASE, MXBASE, "Aiming keys:");
+ (void) mvaddstr(SYBASE, SXBASE, "y k u 7 8 9");
+ (void) mvaddstr(SYBASE+1, SXBASE, " \\|/ \\|/ ");
+ (void) mvaddstr(SYBASE+2, SXBASE, "h-+-l 4-+-6");
+ (void) mvaddstr(SYBASE+3, SXBASE, " /|\\ /|\\ ");
+ (void) 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);
+ }
+
+ ss = (ship_t *)NULL;
+ do {
+ char c, docked[SHIPTYPES + 2], *cp = docked;
+
+ /* 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 = 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 = getch();
+ } while
+ (!strchr("hjklrR", c) || c == FF);
+
+ if (c == FF)
+ {
+ (void)clearok(stdscr, TRUE);
+ (void)refresh();
+ }
+ 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 = N; break;
+ case 'j': case '2': ss->dir = S; break;
+ case 'h': case '4': ss->dir = W; break;
+ case 'l': case '6': ss->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);
+
+ (void) mvprintw(HYBASE, HXBASE,
+ "To fire, move the cursor to your chosen aiming point ");
+ (void) mvprintw(HYBASE+1, HXBASE,
+ "and strike any key other than a motion key. ");
+ (void) mvprintw(HYBASE+2, HXBASE,
+ " ");
+ (void) mvprintw(HYBASE+3, HXBASE,
+ " ");
+ (void) mvprintw(HYBASE+4, HXBASE,
+ " ");
+ (void) mvprintw(HYBASE+5, HXBASE,
+ " ");
+
+ (void) prompt(0, "Press any key to start...", "");
+ (void) getch();
+}
+
+static int getcoord(int atcpu)
+{
+ int ny, nx, c;
+
+ if (atcpu)
+ cgoto(cury,curx);
+ else
+ pgoto(cury, curx);
+ (void)refresh();
+ for (;;)
+ {
+ if (atcpu)
+ {
+ (void) mvprintw(CYBASE + BDEPTH+1, CXBASE+11, "(%d, %c)", curx, 'A'+cury);
+ cgoto(cury, curx);
+ }
+ else
+ {
+ (void) mvprintw(PYBASE + BDEPTH+1, PXBASE+11, "(%d, %c)", curx, 'A'+cury);
+ pgoto(cury, curx);
+ }
+
+ switch(c = getch())
+ {
+ case 'k': case '8':
+#ifdef KEY_MIN
+ case KEY_UP:
+#endif /* KEY_MIN */
+ ny = cury+BDEPTH-1; nx = curx;
+ break;
+ case 'j': case '2':
+#ifdef KEY_MIN
+ case KEY_DOWN:
+#endif /* KEY_MIN */
+ ny = cury+1; nx = curx;
+ break;
+ case 'h': case '4':
+#ifdef KEY_MIN
+ case KEY_LEFT:
+#endif /* KEY_MIN */
+ ny = cury; nx = curx+BWIDTH-1;
+ break;
+ case 'l': case '6':
+#ifdef KEY_MIN
+ case KEY_RIGHT:
+#endif /* KEY_MIN */
+ ny = cury; nx = curx+1;
+ break;
+ case 'y': case '7':
+#ifdef KEY_MIN
+ case KEY_A1:
+#endif /* KEY_MIN */
+ ny = cury+BDEPTH-1; nx = curx+BWIDTH-1;
+ break;
+ case 'b': case '1':
+#ifdef KEY_MIN
+ case KEY_C1:
+#endif /* KEY_MIN */
+ ny = cury+1; nx = curx+BWIDTH-1;
+ break;
+ case 'u': case '9':
+#ifdef KEY_MIN
+ case KEY_A3:
+#endif /* KEY_MIN */
+ ny = cury+BDEPTH-1; nx = curx+1;
+ break;
+ case 'n': case '3':
+#ifdef KEY_MIN
+ case KEY_C3:
+#endif /* KEY_MIN */
+ 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)
+ (void) mvaddstr(CYBASE + BDEPTH + 1, CXBASE + 11, " ");
+ else
+ (void) 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 < 8; 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 * xincr[ss->dir];
+ yend = ss->y + ss->length * 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;
+ ship_t *ss;
+
+ for(i=0; i<2; ++i)
+ {
+ 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, j;
+
+ if (!closepack)
+ for (j = -1; j <= 1; j++)
+ {
+ int bx = ss->x + j * xincr[(ss->dir + 2) % 8];
+ int by = ss->y + j * yincr[(ss->dir + 2) % 8];
+
+ 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 */
+ (void)addch(MARK_MISS);
+#ifdef A_COLOR
+ attrset(0);
+#endif /* A_COLOR */
+ }
+ }
+ }
+ }
+
+ 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);
+ (void) addch((chtype)(ss->symbol));
+ }
+ }
+
+ (void) move(oldy, oldx);
+ return(ss);
+ }
+ }
+ (void) move(oldy, oldx);
+ return((ship_t *)NULL);
+}
+
+static int 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] = (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 */
+ (void) addch((chtype)hits[PLAYER][curx][cury]);
+#ifdef A_COLOR
+ 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;
+ }
+ (void)printw(m, ss->name);
+ (void)beep();
+ return(awinna() == -1);
+ }
+ return (hit);
+}
+
+static int sgetc(const char *s)
+{
+ const char *s1;
+ int ch;
+
+ (void)refresh();
+ for(;;)
+ {
+ ch = getch();
+ if (islower(ch))
+ ch = toupper(ch);
+ if (ch == CTRLC)
+ uninitgame(0);
+ for (s1=s; *s1 && ch != *s1; ++s1)
+ continue;
+ if (*s1)
+ {
+ (void) addch((chtype)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!");
+ exit(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;
+
+ hits[COMPUTER][x][y] = (hit = (board[PLAYER][x][y])) ? MARK_HIT : MARK_MISS;
+ (void) 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 */
+ (void)addch((chtype)(hit ? SHOWHIT : SHOWSPLASH));
+#ifdef A_COLOR
+ attrset(0);
+#endif /* A_COLOR */
+
+ return ((hit ? (sunk ? S_SUNK : S_HIT) : S_MISS) ? TRUE : FALSE);
+}
+
+/*
+ * 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.
+ */
+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[4];
+ 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[E/2] = used[S/2] = used[W/2] = used[N/2] = FALSE;
+ /* FALLTHROUGH */
+
+ case HUNT_DIRECT: /* last shot hit, we're looking for ship's long axis */
+ for (d = navail = 0; d < 4; 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
+ {
+ for (d = 0, n = rnd(navail) + 1; n; n--)
+ while (used[d])
+ d++;
+
+ assert(d <= 4);
+
+ used[d] = FALSE;
+ 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 + 4;
+ 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: /* kill squares not caught on first pass */
+ 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;
+ }
+
+ /* check for continuation and/or winner */
+ if (salvo)
+ {
+ (void)refresh();
+ (void)sleep(1);
+ }
+ if (awinna() != -1)
+ return(FALSE);
+
+#ifdef DEBUG
+ (void) 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]);
+ (void)addch((chtype)ss->symbol);
+ }
+
+ if(awinna())
+ ++cpuwon;
+ else
+ ++plywon;
+ j = 18 + strlen(name);
+ if(plywon >= 10)
+ ++j;
+ if(cpuwon >= 10)
+ ++j;
+ (void) mvprintw(1,(COLWIDTH-j)/2,
+ "%s: %d Computer: %d",name,plywon,cpuwon);
+
+ prompt(2, (awinna()) ? "Want to be humiliated again, %s [yn]? "
+ : "Going to give me a chance for revenge, %s [yn]? ",name);
+ return(sgetc("YN") == 'Y');
+}
+
+static void do_options(int c, char *op[])
+{
+ register int i;
+
+ if (c > 1)
+ {
+ for (i=1; i<c; i++)
+ {
+ switch(op[i][0])
+ {
+ default:
+ case '?':
+ (void) fprintf(stderr, "Usage: battle [-s | -b] [-c]\n");
+ (void) fprintf(stderr, "\tWhere the options are:\n");
+ (void) fprintf(stderr, "\t-s : play a salvo game\n");
+ (void) fprintf(stderr, "\t-b : play a blitz game\n");
+ (void) fprintf(stderr, "\t-c : ships may be adjacent\n");
+ exit(EXIT_FAILURE);
+ break;
+ case '-':
+ switch(op[i][1])
+ {
+ case 'b':
+ blitz = 1;
+ if (salvo == 1)
+ {
+ (void) fprintf(stderr,
+ "Bad Arg: -b and -s are mutually exclusive\n");
+ exit(EXIT_FAILURE);
+ }
+ break;
+ case 's':
+ salvo = 1;
+ if (blitz == 1)
+ {
+ (void) fprintf(stderr,
+ "Bad Arg: -s and -b are mutually exclusive\n");
+ exit(EXIT_FAILURE);
+ }
+ break;
+ case 'c':
+ closepack = 1;
+ break;
+ default:
+ (void) fprintf(stderr,
+ "Bad arg: type \"%s ?\" for usage message\n", op[0]);
+ exit(EXIT_FAILURE);
+ }
+ }
+ }
+ }
+}
+
+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);
+}
+
+int main(int argc, char *argv[])
+{
+ do_options(argc, argv);
+
+ 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())
+ continue;
+ turn = OTHER;
+ }
+ } while
+ (playagain());
+ uninitgame(0);
+ /*NOTREACHED*/
+}
+
+/* bs.c ends here */
diff --git a/contrib/ncurses/test/cardfile.c b/contrib/ncurses/test/cardfile.c
new file mode 100644
index 000000000000..bc2e1adb14cc
--- /dev/null
+++ b/contrib/ncurses/test/cardfile.c
@@ -0,0 +1,420 @@
+/****************************************************************************
+ * Copyright (c) 1999 Free Software Foundation, Inc. *
+ * *
+ * Permission is hereby granted, free of charge, to any person obtaining a *
+ * copy of this software and associated documentation files (the *
+ * "Software"), to deal in the Software without restriction, including *
+ * without limitation the rights to use, copy, modify, merge, publish, *
+ * distribute, distribute with modifications, sublicense, and/or sell *
+ * copies of the Software, and to permit persons to whom the Software is *
+ * furnished to do so, subject to the following conditions: *
+ * *
+ * The above copyright notice and this permission notice shall be included *
+ * in all copies or substantial portions of the Software. *
+ * *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
+ * *
+ * Except as contained in this notice, the name(s) of the above copyright *
+ * holders 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: cardfile.c,v 1.2 1999/06/16 00:41:57 tom Exp $
+ *
+ * File format: text beginning in column 1 is a title; other text forms the content.
+ */
+
+#include <test.priv.h>
+
+#include <form.h>
+#include <panel.h>
+
+#include <string.h>
+#include <ctype.h>
+
+#define VISIBLE_CARDS 10
+#define OFFSET_CARD 2
+
+#ifndef CTRL
+#define CTRL(x) ((x) & 0x1f)
+#endif
+
+typedef struct _card {
+ struct _card *link;
+ PANEL *panel;
+ FORM *form;
+ char *title;
+ char *content;
+} CARD;
+
+static CARD *all_cards;
+static char default_name[] = "cardfile.dat";
+
+#if !HAVE_STRDUP
+#define strdup my_strdup
+static char *strdup (char *s)
+{
+ char *p = (char *)malloc(strlen(s)+1);
+ if (p)
+ strcpy(p, s);
+ return(p);
+}
+#endif /* not HAVE_STRDUP */
+
+static char *skip(char *buffer)
+{
+ while (isspace(*buffer))
+ buffer++;
+ return buffer;
+}
+
+static void trim(char *buffer)
+{
+ unsigned n = strlen(buffer);
+ while (n-- && isspace(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 = (CARD *)calloc(1, sizeof(CARD));
+ 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, char *content)
+{
+ unsigned total, offset;
+
+ content = skip(content);
+ if ((total = strlen(content)) != 0)
+ {
+ if ((offset = strlen(card->content)) != 0)
+ {
+ total += 1 + offset;
+ card->content = (char *)realloc(card->content, total + 1);
+ strcpy(card->content + offset++, " ");
+ }
+ else
+ {
+ card->content = (char *)malloc(total + 1);
+ }
+ strcpy(card->content + offset, content);
+ }
+}
+
+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;
+ CARD *card = 0;
+ char buffer[BUFSIZ];
+
+ if ((fp = fopen(fname, "r")) != 0)
+ {
+ while (fgets(buffer, sizeof(buffer), fp))
+ {
+ trim(buffer);
+ if (isspace(*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;
+ CARD *p = 0;
+ int n;
+
+ if (!strcmp(fname, default_name))
+ fname = "cardfile.out";
+
+ if ((fp = fopen(fname, "w")) != 0)
+ {
+ for (p = all_cards; p != 0; p = p->link)
+ {
+ FIELD **f = form_fields(p->form);
+ 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);
+ top_panel(first->panel);
+ }
+}
+
+/*
+ * Return the next card in the list
+ */
+static CARD *next_card(CARD *now)
+{
+ if (now->link)
+ now = now->link;
+ 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)
+ return p;
+ return now;
+}
+
+
+/*******************************************************************************/
+
+static int form_virtualize(WINDOW *w)
+{
+ int c = wgetch(w);
+
+ switch(c)
+ {
+ case CTRL('W'):
+ return(MAX_FORM_COMMAND + 4);
+ case CTRL('N'):
+ return(MAX_FORM_COMMAND + 3);
+ case CTRL('P'):
+ return(MAX_FORM_COMMAND + 2);
+ case CTRL('Q'):
+ case 033:
+ return(MAX_FORM_COMMAND + 1);
+
+ 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 void cardfile(char *fname)
+{
+ WINDOW *win;
+ CARD *p;
+ CARD *top_card;
+ int visible_cards = count_cards();
+ int panel_wide = COLS - (visible_cards * OFFSET_CARD);
+ int panel_high = LINES - (visible_cards * OFFSET_CARD) - 5;
+ int form_wide = panel_wide - 2;
+ int form_high = panel_high - 2;
+ int x = (visible_cards - 1) * OFFSET_CARD;
+ int y = 0;
+ int ch;
+ int finished = FALSE;
+
+ 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");
+
+ /* make a panel for each CARD */
+ for (p = all_cards; p != 0; p = p->link)
+ {
+ FIELD **f = (FIELD **)calloc(3, sizeof(FIELD *));
+
+ win = newwin(panel_high, panel_wide, x, y);
+ keypad(win, TRUE);
+ p->panel = new_panel(win);
+ box(win, 0, 0);
+
+ /* ...and a form in each panel */
+ 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);
+
+ 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);
+
+ f[2] = 0;
+
+ p->form = new_form(f);
+ set_form_win(p->form, win);
+ set_form_sub(p->form, derwin(win, form_high, form_wide, 1, 1));
+ post_form(p->form);
+
+ x -= OFFSET_CARD;
+ y += OFFSET_CARD;
+ }
+
+ order_cards(top_card = all_cards, visible_cards);
+
+ update_panels();
+
+ while (!finished)
+ {
+ update_panels();
+ doupdate();
+
+ switch(form_driver(top_card->form, ch = form_virtualize(panel_window(top_card->panel))))
+ {
+ case E_OK:
+ break;
+ case E_UNKNOWN_COMMAND:
+ switch (ch) {
+ case MAX_FORM_COMMAND+1:
+ finished = TRUE;
+ break;
+ case MAX_FORM_COMMAND+2:
+ top_card = prev_card(top_card);
+ order_cards(top_card, visible_cards);
+ break;
+ case MAX_FORM_COMMAND+3:
+ top_card = next_card(top_card);
+ order_cards(top_card, visible_cards);
+ break;
+ case MAX_FORM_COMMAND+4:
+ write_data(fname);
+ break;
+ default:
+ beep();
+ break;
+ }
+ break;
+ default:
+ flash();
+ break;
+ }
+ }
+}
+
+/*******************************************************************************/
+
+int main(int argc, char *argv[])
+{
+ int n;
+
+ initscr();
+ cbreak();
+ noecho();
+
+ if (argc > 1)
+ {
+ for (n = 1; n < argc; n++)
+ read_data(argv[n]);
+ cardfile(argv[1]);
+ }
+ else
+ {
+ read_data(default_name);
+ cardfile(default_name);
+ }
+
+ endwin();
+
+ return EXIT_SUCCESS;
+}
diff --git a/contrib/ncurses/test/cardfile.dat b/contrib/ncurses/test/cardfile.dat
new file mode 100644
index 000000000000..deb4b76a7d85
--- /dev/null
+++ b/contrib/ncurses/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/contrib/ncurses/test/configure.in b/contrib/ncurses/test/configure.in
new file mode 100644
index 000000000000..acbad8a55bea
--- /dev/null
+++ b/contrib/ncurses/test/configure.in
@@ -0,0 +1,176 @@
+dnl***************************************************************************
+dnl Copyright (c) 1998 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 <dickey@clark.net> 1996,1997,1998
+dnl
+dnl $Id: configure.in,v 1.24 1998/05/16 20:48:14 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 dickey@clark.net (Thomas Dickey)
+AC_PREREQ(2.12)
+AC_INIT(ncurses.c)
+AC_CONFIG_HEADER(ncurses_cfg.h:ncurses_tst.hin)
+
+AC_PROG_CC
+
+dnl Things that we don't need (or must override) if we're not building ncurses
+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)
+ECHO_LINK='@ echo linking $@ ... ;' AC_SUBST(ECHO_LINK)
+EXTRA_LIBS="" AC_SUBST(EXTRA_LIBS)
+LD="ld" AC_SUBST(LD)
+LD_MODEL="" AC_SUBST(LD_MODEL)
+LDFLAGS_SHARED="" AC_SUBST(LDFLAGS_SHARED)
+LIB_NAME=curses AC_SUBST(LIB_NAME)
+LIB_PREFIX="-l" AC_SUBST(LIB_PREFIX)
+LINK_TESTS="" AC_SUBST(LINK_TESTS)
+LINT=lint AC_SUBST(LINT)
+LINT_OPTS="" AC_SUBST(LINT_OPTS)
+LOCAL_LDFLAGS="" AC_SUBST(LOCAL_LDFLAGS)
+MATH_LIB="-lm" AC_SUBST(MATH_LIB)
+PROG_EXT="" AC_SUBST(PROG_EXT)
+TEST_ARGS="" AC_SUBST(TEST_ARGS)
+TEST_DEPS="" AC_SUBST(TEST_DEPS)
+cf_cv_abi_version="" AC_SUBST(cf_cv_abi_version)
+cf_cv_rel_version="" AC_SUBST(cf_cv_rel_version)
+
+dnl SunOS 4.x
+AC_ARG_WITH(5lib,
+ [ --with-5lib use SunOS sysv-libraries],
+ [LIBS="-L/usr/5lib $LIBS"
+ CPPFLAGS="$CPPFLAGS -I/usr/5include"])
+
+dnl Ncurses, installed in conventional location
+AC_ARG_WITH(ncurses,
+ [ --with-ncurses use ncurses-libraries (installed)],
+ [AC_CHECK_FUNC(initscr,,[
+ AC_CHECK_LIB(gpm,Gpm_Open)
+ LIB_NAME=ncurses
+ for p in $HOME /usr/local /usr
+ do
+ if test -f $p/include/ncurses/curses.h
+ then
+ CPPFLAGS="$CPPFLAGS -I$p/include/ncurses"
+ test $p != /usr && LIBS="-L$p/lib $LIBS"
+ break
+ elif test $p != /usr
+ then
+ if test -f $p/include/curses.h
+ then
+ CPPFLAGS="$CPPFLAGS -I$p/include"
+ LIBS="-L$p/lib $LIBS"
+ break
+ fi
+ fi
+ done
+ ],[test -d /usr/ccs/lib && LIBS="-L/usr/ccs/lib $LIBS"])])
+
+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
+
+AC_CHECK_FUNC(initscr,,[
+AC_CHECK_LIB($LIB_NAME,initscr)])
+AC_CHECK_LIB(form,form_driver)
+AC_CHECK_LIB(menu,menu_driver)
+AC_CHECK_LIB(panel,new_panel)
+
+AC_TYPE_SIGNAL
+
+AC_STDC_HEADERS
+AC_HEADER_TIME
+AC_CHECK_HEADERS( \
+form.h \
+getopt.h \
+menu.h \
+nc_alloc.h \
+panel.h \
+sys/ioctl.h \
+sys/select.h \
+sys/time.h \
+termios.h \
+unistd.h \
+)
+
+AC_CHECK_FUNCS( \
+gettimeofday \
+napms \
+resizeterm \
+strdup \
+vsscanf \
+)
+
+dnl ---------------------------------------------------------------------------
+dnl [CF_SYS_TIME_SELECT]
+AC_MSG_CHECKING(if sys/time.h conflicts with sys/select.h)
+AC_CACHE_VAL(cf_cv_sys_time_select,[
+AC_TRY_COMPILE([
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#if 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)
+dnl ---------------------------------------------------------------------------
+
+AC_OUTPUT(Makefile,[
+ 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=`make echo_tests`
+LAST=`make echo_suffix`
+for n in $LIST
+do
+ N=`echo $n | sed -e s/${LAST}\$//`
+ cat >>Makefile <<TEST_EOF
+
+\$(MODEL)/$N.o : $N.c \\
+ test.priv.h \\
+ ncurses_cfg.h
+ @echo compiling $N; \$(CC) -c \$(CFLAGS_DEFAULT) $N.c
+TEST_EOF
+done
+],[],sort)
diff --git a/contrib/ncurses/test/ditto.c b/contrib/ncurses/test/ditto.c
new file mode 100644
index 000000000000..8ceafe5de11a
--- /dev/null
+++ b/contrib/ncurses/test/ditto.c
@@ -0,0 +1,148 @@
+/****************************************************************************
+ * Copyright (c) 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: ditto.c,v 1.3 1998/08/15 23:39:34 tom Exp $
+ *
+ * The program illustrates how to set up multiple screens from a single
+ * program. 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>
+#include <errno.h>
+
+typedef struct {
+ FILE *input;
+ FILE *output;
+ SCREEN *screen;
+} DITTO;
+
+static void
+failed(const char *s)
+{
+ perror(s);
+ exit(EXIT_FAILURE);
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: ditto [terminal1 ...]\n");
+ exit(EXIT_FAILURE);
+}
+
+static FILE *
+open_tty(char *path)
+{
+ FILE *fp;
+ struct stat sb;
+
+ if (stat(path, &sb) < 0)
+ failed(path);
+ if ((sb.st_mode & S_IFMT) != S_IFCHR) {
+ errno = ENOTTY;
+ failed(path);
+ }
+ fp = fopen(path, "a+");
+ if (fp == 0)
+ failed(path);
+ printf("opened %s\n", path);
+ return fp;
+}
+
+int
+main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ int j;
+ int active_tty = 0;
+ DITTO *data;
+
+ if (argc <= 1)
+ usage();
+
+ if ((data = (DITTO *)calloc(argc, sizeof(DITTO))) == 0)
+ failed("calloc data");
+
+ data[0].input = stdin;
+ data[0].output = stdout;
+ for (j = 1; j < argc; j++) {
+ data[j].input =
+ data[j].output = open_tty(argv[j]);
+ }
+
+ /*
+ * If we got this far, we have open connection(s) to the terminal(s).
+ * Set up the screens.
+ */
+ for (j = 0; j < argc; j++) {
+ active_tty++;
+ data[j].screen = newterm(
+ (char *)0, /* assume $TERM is the same */
+ data[j].output,
+ data[j].input);
+ if (data[j].screen == 0)
+ failed("newterm");
+ cbreak();
+ noecho();
+ scrollok(stdscr, TRUE);
+ }
+
+ /*
+ * Loop, reading characters from any of the inputs and writing to all
+ * of the screens.
+ */
+ for(;;) {
+ int ch;
+ set_term(data[0].screen);
+ ch = getch();
+ if (ch == ERR)
+ continue;
+ if (ch == 4)
+ break;
+ for (j = 0; j < argc; j++) {
+ set_term(data[j].screen);
+ addch(ch);
+ refresh();
+ }
+ }
+
+ /*
+ * Cleanup and exit
+ */
+ for (j = argc-1; j >= 0; j--) {
+ set_term(data[j].screen);
+ endwin();
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/contrib/ncurses/test/filter.c b/contrib/ncurses/test/filter.c
new file mode 100644
index 000000000000..6057396a89c6
--- /dev/null
+++ b/contrib/ncurses/test/filter.c
@@ -0,0 +1,109 @@
+/****************************************************************************
+ * Copyright (c) 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: filter.c,v 1.2 1998/05/10 00:39:27 tom Exp $
+ */
+#include <test.priv.h>
+
+/*
+ * 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.
+ */
+
+#ifndef NCURSES_VERSION
+#define attr_t long
+#define getnstr(s,n) getstr(s)
+#endif
+
+static int new_command(char *buffer, int length, attr_t underline)
+{
+ int code;
+
+ attron(A_BOLD);
+ printw("Command: ");
+ attron(underline);
+ code = getnstr(buffer, length);
+ attroff(underline);
+ attroff(A_BOLD);
+ printw("\n");
+
+ return code;
+}
+
+int main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ SCREEN *sp;
+ char buffer[80];
+ attr_t underline;
+
+ filter();
+ sp = newterm((char *)0, stdout, stdin);
+ cbreak();
+ keypad(stdscr, TRUE);
+
+ if (has_colors()) {
+ int background = COLOR_BLACK;
+ start_color();
+#ifdef NCURSES_VERSION
+ if (use_default_colors () != ERR)
+ background = -1;
+#endif
+ init_pair(1, COLOR_CYAN, background);
+ underline = COLOR_PAIR(1);
+ } else {
+ underline = A_UNDERLINE;
+ }
+
+ while (new_command(buffer, sizeof(buffer)-1, underline) != ERR
+ && strlen(buffer) != 0) {
+ reset_shell_mode();
+ printf("\n");
+ fflush(stdout);
+ system(buffer);
+ reset_prog_mode();
+ touchwin(stdscr);
+ erase();
+ refresh();
+ }
+ printw("done");
+ refresh();
+ endwin();
+ return 0;
+}
diff --git a/contrib/ncurses/test/firework.c b/contrib/ncurses/test/firework.c
new file mode 100644
index 000000000000..1a37e0490997
--- /dev/null
+++ b/contrib/ncurses/test/firework.c
@@ -0,0 +1,154 @@
+/*
+ * $Id: firework.c,v 1.11 1997/11/01 19:36:25 tom Exp $
+ */
+#include <test.priv.h>
+
+#include <term.h> /* for tparm() */
+
+#include <signal.h>
+#include <ctype.h>
+#include <time.h>
+
+static int get_colour(chtype *);
+static void explode(int row, int col);
+static void showit(void);
+static RETSIGTYPE onsig(int sig);
+
+static int my_bg = COLOR_BLACK;
+
+int main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+int j;
+int start,end,row,diff,flag = 0,direction;
+unsigned seed;
+
+ for (j=SIGHUP;j<=SIGTERM;j++)
+ if (signal(j,SIG_IGN)!=SIG_IGN)
+ signal(j,onsig);
+
+ initscr();
+ if (has_colors()) {
+ start_color();
+#ifdef NCURSES_VERSION
+ if (use_default_colors() == OK)
+ my_bg = -1;
+#endif
+ }
+ curs_set(0);
+
+ seed = time((time_t *)0);
+ srand(seed);
+ cbreak();
+ 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);
+ attrset(A_NORMAL);
+ for (row=0;row<diff;row++) {
+ mvprintw(LINES - row,start + (row * direction),
+ (direction < 0) ? "\\" : "/");
+ if (flag++) {
+ showit();
+ erase();
+ flag = 0;
+ }
+ }
+ if (flag++) {
+ showit();
+ flag = 0;
+ }
+ seed = time((time_t *)0);
+ srand(seed);
+ explode(LINES-row,start+(diff*direction));
+ erase();
+ showit();
+ }
+}
+
+static RETSIGTYPE
+onsig(int n GCC_UNUSED)
+{
+ curs_set(1);
+ endwin();
+ exit(EXIT_FAILURE);
+}
+
+static
+void explode(int row, int col)
+{
+ chtype bold;
+ erase();
+ mvprintw(row,col,"-");
+ showit();
+
+ init_pair(1,get_colour(&bold),my_bg);
+ attrset(COLOR_PAIR(1) | bold);
+ mvprintw(row-1,col-1," - ");
+ mvprintw(row,col-1,"-+-");
+ mvprintw(row+1,col-1," - ");
+ showit();
+
+ init_pair(1,get_colour(&bold),my_bg);
+ attrset(COLOR_PAIR(1) | bold);
+ mvprintw(row-2,col-2," --- ");
+ mvprintw(row-1,col-2,"-+++-");
+ mvprintw(row, col-2,"-+#+-");
+ mvprintw(row+1,col-2,"-+++-");
+ mvprintw(row+2,col-2," --- ");
+ showit();
+
+ init_pair(1,get_colour(&bold),my_bg);
+ attrset(COLOR_PAIR(1) | bold);
+ mvprintw(row-2,col-2," +++ ");
+ mvprintw(row-1,col-2,"++#++");
+ mvprintw(row, col-2,"+# #+");
+ mvprintw(row+1,col-2,"++#++");
+ mvprintw(row+2,col-2," +++ ");
+ showit();
+
+ init_pair(1,get_colour(&bold),my_bg);
+ attrset(COLOR_PAIR(1) | bold);
+ mvprintw(row-2,col-2," # ");
+ mvprintw(row-1,col-2,"## ##");
+ mvprintw(row, col-2,"# #");
+ mvprintw(row+1,col-2,"## ##");
+ mvprintw(row+2,col-2," # ");
+ showit();
+
+ init_pair(1,get_colour(&bold),my_bg);
+ attrset(COLOR_PAIR(1) | bold);
+ mvprintw(row-2,col-2," # # ");
+ mvprintw(row-1,col-2,"# #");
+ mvprintw(row, col-2," ");
+ mvprintw(row+1,col-2,"# #");
+ mvprintw(row+2,col-2," # # ");
+ showit();
+}
+
+static
+int get_colour(chtype *bold)
+{
+ int attr;
+ attr = (rand() % 16) + 1;
+
+ *bold = A_NORMAL;
+ if (attr > 8) {
+ *bold = A_BOLD;
+ attr &= 7;
+ }
+ return(attr);
+}
+
+static void
+showit(void)
+{
+ refresh();
+ napms(120);
+}
diff --git a/contrib/ncurses/test/firstlast.c b/contrib/ncurses/test/firstlast.c
new file mode 100644
index 000000000000..f9515dcb5b38
--- /dev/null
+++ b/contrib/ncurses/test/firstlast.c
@@ -0,0 +1,89 @@
+/*
+ * This test was written by Alexander V. Lukyanov to demonstrate difference
+ * between ncurses 4.1 and SVR4 curses
+ *
+ * $Id: firstlast.c,v 1.2 1997/10/18 21:34:53 tom Exp $
+ */
+
+#include <test.priv.h>
+
+static void fill(WINDOW *w,const char *str)
+{
+ const char *s;
+ for(;;) {
+ for(s=str; *s; s++) {
+ if(waddch(w,*s)==ERR)
+ {
+ wmove(w,0,0);
+ return;
+ }
+ }
+ }
+}
+
+int main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ WINDOW *large,*small;
+ 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();
+
+ return EXIT_SUCCESS;
+}
diff --git a/contrib/ncurses/test/gdc.6 b/contrib/ncurses/test/gdc.6
new file mode 100644
index 000000000000..7fa60de9edf8
--- /dev/null
+++ b/contrib/ncurses/test/gdc.6
@@ -0,0 +1,22 @@
+.TH GDC 6
+.SH NAME
+gdc \- grand digital clock (curses)
+.SH SYNOPSIS
+.B gdc
+[-s] [
+.I n
+]
+.SH DESCRIPTION
+.I Gdc
+runs a digital clock made of reverse-video blanks on a curses
+compatible VDU screen. With an optional numeric argument
+.I n
+it stops after
+.I n
+seconds (default never).
+The optional
+.B -s
+flag makes digits scroll as they change. In this curses mode implementation,
+the scrolling option has trouble keeping up.
+.SH AUTHOR
+Amos Shapir, modified for curses by John Lupien.
diff --git a/contrib/ncurses/test/gdc.c b/contrib/ncurses/test/gdc.c
new file mode 100644
index 000000000000..ecef2bb1e1d1
--- /dev/null
+++ b/contrib/ncurses/test/gdc.c
@@ -0,0 +1,235 @@
+/*
+ * Grand digital clock for curses compatible terminals
+ * Usage: gdc [-s] [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.10 1997/10/18 20:06:06 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <time.h>
+#include <signal.h>
+#include <string.h>
+
+#define YBASE 10
+#define XBASE 10
+#define XLENGTH 54
+#define YDEPTH 5
+
+/* it won't be */
+static time_t now; /* yeah! */
+static struct tm *tm;
+
+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 char scrol;
+
+static int sigtermed = 0;
+
+static int hascolor = 0;
+
+static void set(int, int);
+static void standt(int);
+static void movto(int, int);
+
+static
+RETSIGTYPE sighndl(int signo)
+{
+ signal(signo, sighndl);
+ sigtermed=signo;
+}
+
+static void
+drawbox(void)
+{
+ chtype bottom[XLENGTH+1];
+ int n;
+
+ if(hascolor)
+ attrset(COLOR_PAIR(3));
+
+ 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);
+ mvinchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH);
+ for (n = 0; n < XLENGTH; n++)
+ bottom[n] = ACS_HLINE | (bottom[n] & (A_ATTRIBUTES | A_COLOR));
+ 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)
+ attrset(COLOR_PAIR(2));
+}
+
+int
+main(int argc, char *argv[])
+{
+long t, a;
+int i, j, s, k;
+int n = 0;
+
+ signal(SIGINT,sighndl);
+ signal(SIGTERM,sighndl);
+ signal(SIGKILL,sighndl);
+
+ initscr();
+ cbreak();
+ noecho();
+ nodelay(stdscr, 1);
+ curs_set(0);
+
+ hascolor = has_colors();
+
+ if(hascolor) {
+ int bg = COLOR_BLACK;
+ start_color();
+#ifdef NCURSES_VERSION
+ if (use_default_colors() == OK)
+ bg = -1;
+#endif
+ init_pair(1, COLOR_BLACK, COLOR_RED);
+ init_pair(2, COLOR_RED, bg);
+ init_pair(3, COLOR_WHITE, bg);
+ attrset(COLOR_PAIR(2));
+ }
+
+ clear();
+ refresh();
+ while(--argc > 0) {
+ if(**++argv == '-')
+ scrol = 1;
+ else
+ n = atoi(*argv);
+ }
+
+ drawbox();
+ do {
+ char buf[30];
+
+ mask = 0;
+ time(&now);
+ tm = localtime(&now);
+ 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(scrol) {
+ 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))) {
+ movto(YBASE + i, XBASE + 2*j);
+ }
+ addstr(" ");
+ }
+ }
+ }
+ if(!s) {
+ older[i] = newer[i];
+ }
+ }
+ if(!s) {
+ if (scrol)
+ drawbox();
+ refresh();
+ if (scrol)
+ napms(150);
+ }
+ }
+ }
+
+ /* this depends on the detailed format of ctime(3) */
+ (void) strcpy(buf, ctime(&now));
+ (void) strcpy(buf + 10, buf + 19);
+ mvaddstr(16, 30, buf);
+
+ movto(6, 0);
+ drawbox();
+ refresh();
+ sleep(1);
+ while(wgetch(stdscr) != ERR)
+ continue;
+ if (sigtermed) {
+ standend();
+ clear();
+ refresh();
+ curs_set(1);
+ endwin();
+ fprintf(stderr, "gdc terminated by signal %d\n", sigtermed);
+ return EXIT_FAILURE;
+ }
+ } while(--n);
+ standend();
+ clear();
+ refresh();
+ curs_set(1);
+ endwin();
+ return EXIT_SUCCESS;
+}
+
+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
+standt(int on)
+{
+ if (on) {
+ if(hascolor) {
+ attron(COLOR_PAIR(1));
+ } else {
+ attron(A_STANDOUT);
+ }
+ } else {
+ if(hascolor) {
+ attron(COLOR_PAIR(2));
+ } else {
+ attroff(A_STANDOUT);
+ }
+ }
+}
+
+static void
+movto(int line, int col)
+{
+ move(line, col);
+}
diff --git a/contrib/ncurses/test/hanoi.c b/contrib/ncurses/test/hanoi.c
new file mode 100644
index 000000000000..25d906ea04a7
--- /dev/null
+++ b/contrib/ncurses/test/hanoi.c
@@ -0,0 +1,297 @@
+/*
+ * 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.15 1997/10/18 20:11:20 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <string.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) (((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 int 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 NMoves = 0;
+
+static void InitTiles(int NTiles);
+static void DisplayTiles(void);
+static void MakeMove(int From, int To);
+static void AutoMove(int From, int To, int Num);
+static void Usage(void);
+static int Solved(int NumTiles);
+static int GetMove(int *From, int *To);
+static int InvalidMove(int From, int To);
+
+int
+main(int argc, char **argv)
+{
+int NTiles, FromCol, ToCol;
+unsigned char AutoFlag = 0;
+
+ switch(argc) {
+ case 1:
+ NTiles = DEFAULTTILES;
+ break;
+ case 2:
+ NTiles = atoi(argv[1]);
+ if (NTiles > MAXTILES || NTiles < MINTILES) {
+ fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
+ return EXIT_FAILURE;
+ }
+ break;
+ case 3:
+ if (strcmp(argv[2], "a")) {
+ Usage();
+ return EXIT_FAILURE;
+ }
+ NTiles = atoi(argv[1]);
+ if (NTiles > MAXTILES || NTiles < MINTILES) {
+ fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
+ return EXIT_FAILURE;
+ }
+ AutoFlag = TRUE;
+ break;
+ default:
+ Usage();
+ return EXIT_FAILURE;
+ }
+#ifdef NCURSES_VERSION
+ trace(TRACE_MAXIMUM);
+#endif
+ initscr();
+ if (has_colors()) {
+ int i;
+ int bg = COLOR_BLACK;
+ start_color();
+#ifdef NCURSES_VERSION
+ if (use_default_colors() == OK)
+ bg = -1;
+#endif
+ for (i = 0; i < 9; i++)
+ init_pair(i+1, bg, TileColour[i]);
+ }
+ cbreak();
+ if (LINES < 24) {
+ endwin();
+ fprintf(stderr, "Min screen length 24 lines\n");
+ return EXIT_FAILURE;
+ }
+ if(AutoFlag)
+ leaveok(stdscr, TRUE); /* Attempt to remove cursor */
+ InitTiles(NTiles);
+ 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;
+ }
+ }
+ }
+ curs_set(1);
+ endwin();
+ return EXIT_SUCCESS;
+}
+
+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(int NTiles)
+{
+ int Size, SlotNo;
+
+ for(Size=NTiles*2+1, SlotNo=0; Size>=3; Size-=2)
+ Pegs[0].Length[SlotNo++] = Size;
+
+ Pegs[0].Count = NTiles;
+ Pegs[1].Count = 0;
+ Pegs[2].Count = 0;
+}
+
+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", NMoves);
+ 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');
+ attrset(A_NORMAL);
+
+ /* Draw tiles */
+ for(peg=0; peg<NPEGS; peg++) {
+ for(SlotNo=0; SlotNo<Pegs[peg].Count; SlotNo++) {
+ memset(TileBuf, ' ', Pegs[peg].Length[SlotNo]);
+ TileBuf[Pegs[peg].Length[SlotNo]] = '\0';
+ if (has_colors())
+ attrset(COLOR_PAIR(LENTOIND(Pegs[peg].Length[SlotNo])));
+ else
+ attrset(A_REVERSE);
+ mvaddstr(BASELINE-(SlotNo+1),
+ (int)(PegPos[peg] - Pegs[peg].Length[SlotNo]/2),
+ TileBuf);
+ }
+ }
+ 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();
+ 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);
+ return;
+ }
+ 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()
+{
+ fprintf(stderr, "Usage: hanoi [<No Of Tiles>] [a]\n");
+ fprintf(stderr, "The 'a' option causes the tower to be solved automatically\n");
+}
diff --git a/contrib/ncurses/test/hashtest.c b/contrib/ncurses/test/hashtest.c
new file mode 100644
index 000000000000..514ac89656ab
--- /dev/null
+++ b/contrib/ncurses/test/hashtest.c
@@ -0,0 +1,219 @@
+/*
+ * hashtest.c -- test hash mapping
+ *
+ * Generate timing statistics for vertical-motion optimization.
+ *
+ * $Id: hashtest.c,v 1.14 1998/06/13 22:45:39 tom Exp $
+ */
+
+#ifdef TRACE
+#define Trace(p) _tracef p
+#define USE_TRACE 1
+#else
+#define Trace(p) /* nothing */
+#endif
+
+#include <test.priv.h>
+
+#include <string.h>
+#include <ctype.h>
+#include <signal.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 RETSIGTYPE finish(int sig GCC_UNUSED)
+{
+ cleanup();
+ exit(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((j % 8 == 0) ? ('A' + j/8) : '-');
+
+ move(head_lines, 0);
+ for (i = head_lines; i < LINES - foot_lines; i++) {
+ int c = (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((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)
+{
+ 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 = hi; ch >= lo; ch--)
+ one_cycle(ch);
+ else
+ for (ch = lo; ch <= hi; ch++)
+ one_cycle(ch);
+}
+
+static void usage(void)
+{
+ static const char *const tbl[] = {
+ "Usage: hashtest [options]"
+ ,""
+ ,"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)/sizeof(tbl[0]); n++)
+ fprintf(stderr, "%s\n", tbl[n]);
+ exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[])
+{
+ int c;
+ int test_loops = 1;
+ int test_normal = FALSE;
+ int test_optimize = FALSE;
+
+ while ((c = getopt(argc, argv, "cf:h:l:norsx")) != EOF) {
+ switch (c) {
+ 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);
+ 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;
+ default:
+ usage();
+ }
+ }
+ if (!test_normal && !test_optimize) {
+ test_normal = TRUE;
+ test_optimize = TRUE;
+ }
+#if USE_TRACE
+ trace(TRACE_TIMES);
+#endif
+
+ (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) 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 */
+ return(EXIT_SUCCESS);
+}
+/* hashtest.c ends here */
diff --git a/contrib/ncurses/test/keynames.c b/contrib/ncurses/test/keynames.c
new file mode 100644
index 000000000000..88cadd2f8a84
--- /dev/null
+++ b/contrib/ncurses/test/keynames.c
@@ -0,0 +1,14 @@
+/*
+ * $Id: keynames.c,v 1.2 1998/06/06 22:45:13 tom Exp $
+ */
+
+#include <test.priv.h>
+
+int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED)
+{
+ int n;
+ for (n = -1; n < 512; n++) {
+ printf("%d(%5o):%s\n", n, n, keyname(n));
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/contrib/ncurses/test/knight.c b/contrib/ncurses/test/knight.c
new file mode 100644
index 000000000000..fe3101198776
--- /dev/null
+++ b/contrib/ncurses/test/knight.c
@@ -0,0 +1,565 @@
+/*
+ * 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.14 1997/08/20 16:22:38 hjl Exp $
+ */
+
+#include <test.priv.h>
+
+#include <ctype.h>
+#include <signal.h>
+#include <string.h>
+
+/* board size */
+#define BDEPTH 8
+#define BWIDTH 8
+
+/* 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
+{
+ short x, y;
+}
+cell;
+
+static short board[BDEPTH][BWIDTH]; /* the squares */
+static int rw,col; /* current row and column */
+static int lastrow,lastcol; /* last location visited */
+static cell history[BDEPTH*BWIDTH]; /* choice history */
+static int movecount; /* count of moves so far */
+static WINDOW *boardwin; /* the board window */
+static WINDOW *helpwin; /* the help window */
+static WINDOW *msgwin; /* the message window */
+static chtype trail = '#'; /* trail character */
+static chtype plus = '+'; /* cursor hot-spot character */
+static chtype minus = '-'; /* possible-move character */
+static chtype oldch;
+
+static void init(void);
+static void play(void);
+static void dosquares(void);
+static void drawmove(char, int, int, int, int);
+static bool evalmove(int, int);
+static bool chkmoves(void);
+static bool chksqr(int, int);
+static int iabs(int);
+
+int main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ init();
+
+ play();
+
+ endwin();
+ return EXIT_SUCCESS;
+}
+
+static void init (void)
+{
+ srand ((unsigned)getpid());
+ initscr ();
+ cbreak (); /* immediate char return */
+ noecho (); /* no immediate echo */
+ boardwin = newwin(BDEPTH * 2 + 1, BWIDTH * 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();
+#ifdef NCURSES_VERSION
+ if (use_default_colors() == OK)
+ bg = -1;
+#endif
+
+ (void) init_pair(TRAIL_COLOR, COLOR_CYAN, bg);
+ (void) init_pair(PLUS_COLOR, COLOR_RED, bg);
+ (void) init_pair(MINUS_COLOR, COLOR_GREEN, bg);
+
+ trail |= COLOR_PAIR(TRAIL_COLOR);
+ plus |= COLOR_PAIR(PLUS_COLOR);
+ minus |= COLOR_PAIR(MINUS_COLOR);
+ }
+
+#ifdef NCURSES_MOUSE_VERSION
+ (void) mousemask(BUTTON1_CLICKED, (mmask_t *)NULL);
+#endif /* NCURSES_MOUSE_VERSION*/
+
+ 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");
+
+ (void)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, "u -- undo move h-+-l 4-+-6\n");
+ (void)waddstr(helpwin, " /|\\ /|\\ \n");
+ (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. You can quit with `x' or `q'.\n");
+
+ (void)mvwaddstr(helpwin, NOTIFYY-INSTRY, 0,
+ "Press `?' to go to game explanation");
+}
+
+static void play (void)
+/* play the game */
+{
+ bool keyhelp; /* TRUE if keystroke help is up */
+ int c, ny = 0, nx = 0;
+ int i, j, count;
+
+ do {
+ /* clear screen and draw board */
+ werase(boardwin);
+ werase(helpwin);
+ werase(msgwin);
+ dosquares();
+ help1();
+ wnoutrefresh(stdscr);
+ wnoutrefresh(helpwin);
+ wnoutrefresh(msgwin);
+ wnoutrefresh(boardwin);
+ doupdate();
+
+ for (i = 0; i < BDEPTH; i++)
+ for (j = 0; j < BWIDTH; j++)
+ {
+ board[i][j] = FALSE;
+ cellmove(i, j);
+ waddch(boardwin, minus);
+ }
+ memset(history, '\0', sizeof(history));
+ history[0].y = history[0].x = -1;
+ lastrow = lastcol = -2;
+ movecount = 1;
+ keyhelp = FALSE;
+
+ for (;;)
+ {
+ if (rw != lastrow || col != lastcol)
+ {
+ if (lastrow >= 0 && lastcol >= 0)
+ {
+ cellmove(lastrow, lastcol);
+ if (board[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);
+
+ c = wgetch(boardwin);
+
+ werase(msgwin);
+
+ switch (c)
+ {
+ case 'k': case '8':
+ case KEY_UP:
+ ny = rw+BDEPTH-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+BWIDTH-1;
+ break;
+ case 'l': case '6':
+ case KEY_RIGHT:
+ ny = rw; nx = col+1;
+ break;
+ case 'y': case '7':
+ case KEY_A1:
+ ny = rw+BDEPTH-1; nx = col+BWIDTH-1;
+ break;
+ case 'b': case '1':
+ case KEY_C1:
+ ny = rw+1; nx = col+BWIDTH-1;
+ break;
+ case 'u': case '9':
+ case KEY_A3:
+ ny = rw+BDEPTH-1; nx = col+1;
+ break;
+ case 'n': case '3':
+ case KEY_C3:
+ ny = rw+1; nx = col+1;
+ break;
+
+#ifdef NCURSES_MOUSE_VERSION
+ case KEY_MOUSE:
+ {
+ MEVENT myevent;
+
+ getmouse(&myevent);
+ if (myevent.y >= CY(0) && myevent.y <= CY(BDEPTH)
+ && myevent.x >= CX(0) && myevent.x <= CX(BWIDTH))
+ {
+ nx = CXINV(myevent.x);
+ ny = CYINV(myevent.y);
+ ungetch('\n');
+ break;
+ }
+ else
+ {
+ beep();
+ continue;
+ }
+ }
+#endif /* NCURSES_MOUSE_VERSION */
+
+ case KEY_B2:
+ case '\n':
+ case ' ':
+ if (evalmove(rw, col))
+ {
+ drawmove(trail,
+ history[movecount-1].y, history[movecount-1].x,
+ rw, col);
+ history[movecount].y = rw;
+ history[movecount].x = col;
+ movecount++;
+
+ if (!chkmoves())
+ goto dropout;
+ }
+ else
+ beep();
+ break;
+
+ case KEY_REDO:
+ case '\f':
+ case 'r':
+ clearok(curscr, TRUE);
+ wnoutrefresh(stdscr);
+ wnoutrefresh(boardwin);
+ wnoutrefresh(msgwin);
+ wnoutrefresh(helpwin);
+ doupdate();
+ break;
+
+ case KEY_UNDO:
+ case KEY_BACKSPACE:
+ case '\b':
+ if (movecount == 1)
+ {
+ ny = lastrow;
+ nx = lastcol;
+ waddstr(msgwin, "\nNo previous move.");
+ beep();
+ }
+ else
+ {
+ int oldy = history[movecount-1].y;
+ int oldx = history[movecount-1].x;
+
+ board[oldy][oldx] = FALSE;
+ --movecount;
+ ny = history[movecount-1].y;
+ nx = history[movecount-1].x;
+ drawmove(' ', oldy, oldx, ny, nx);
+
+ /* avoid problems if we just changed the current cell */
+ cellmove(lastrow, lastcol);
+ oldch = winch(boardwin);
+ }
+ break;
+
+ case 'q':
+ case 'x':
+ goto dropout;
+
+ case '?':
+ werase(helpwin);
+ if (keyhelp)
+ {
+ help1();
+ keyhelp = FALSE;
+ }
+ else
+ {
+ help2();
+ keyhelp = TRUE;
+ }
+ wrefresh(helpwin);
+ break;
+
+ default:
+ beep();
+ break;
+ }
+
+ col = nx % BWIDTH;
+ rw = ny % BDEPTH;
+ }
+
+ dropout:
+ count = 0;
+ for (i = 0; i < BDEPTH; i++)
+ for (j = 0; j < BWIDTH; j++)
+ if (board[i][j] != 0)
+ count += 1;
+ if (count == (BWIDTH * BDEPTH))
+ wprintw(msgwin, "\nYou won. Care to try again? ");
+ else
+ wprintw(msgwin, "\n%d squares filled. Try again? ", count);
+ } while
+ (tolower(wgetch(msgwin)) == 'y');
+}
+
+static void dosquares (void)
+{
+ int i, j;
+
+ mvaddstr(0, 20, "KNIGHT'S MOVE -- a logical solitaire");
+
+ move(BOARDY,BOARDX);
+ waddch(boardwin, ACS_ULCORNER);
+ for (j = 0; j < 7; 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 < BDEPTH; i++)
+ {
+ move(BOARDY + i * 2 - 1, BOARDX);
+ waddch(boardwin, ACS_VLINE);
+ for (j = 0; j < BWIDTH; j++)
+ {
+ waddch(boardwin, ' ');
+ waddch(boardwin, ' ');
+ waddch(boardwin, ' ');
+ waddch(boardwin, ACS_VLINE);
+ }
+ move(BOARDY + i * 2, BOARDX);
+ waddch(boardwin, ACS_LTEE);
+ for (j = 0; j < BWIDTH - 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 < BWIDTH; j++)
+ {
+ waddch(boardwin, ' ');
+ waddch(boardwin, ' ');
+ waddch(boardwin, ' ');
+ waddch(boardwin, ACS_VLINE);
+ }
+
+ move(BOARDY + i * 2, BOARDX);
+ waddch(boardwin, ACS_LLCORNER);
+ for (j = 0; j < BWIDTH - 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(int prow, int pcol, chtype mark)
+{
+ if (chksqr(prow+2,pcol+1)){cellmove(prow+2,pcol+1);waddch(boardwin,mark);};
+ if (chksqr(prow+2,pcol-1)){cellmove(prow+2,pcol-1);waddch(boardwin,mark);};
+ if (chksqr(prow-2,pcol+1)){cellmove(prow-2,pcol+1);waddch(boardwin,mark);};
+ if (chksqr(prow-2,pcol-1)){cellmove(prow-2,pcol-1);waddch(boardwin,mark);};
+ if (chksqr(prow+1,pcol+2)){cellmove(prow+1,pcol+2);waddch(boardwin,mark);};
+ if (chksqr(prow+1,pcol-2)){cellmove(prow+1,pcol-2);waddch(boardwin,mark);};
+ if (chksqr(prow-1,pcol+2)){cellmove(prow-1,pcol+2);waddch(boardwin,mark);};
+ if (chksqr(prow-1,pcol-2)){cellmove(prow-1,pcol-2);waddch(boardwin,mark);};
+}
+
+static void drawmove(char tchar, int oldy, int oldx, int row, int column)
+/* place the stars, update board & currents */
+{
+ if (movecount <= 1)
+ {
+ int i, j;
+
+ for (i = 0; i < BDEPTH; i++)
+ for (j = 0; j < BWIDTH; j++)
+ {
+ cellmove(i, j);
+ if (winch(boardwin) == minus)
+ waddch(boardwin, movecount ? ' ' : minus);
+ }
+ }
+ else
+ {
+ cellmove(oldy, oldx);
+ waddch(boardwin, '\b');
+ waddch(boardwin, tchar);
+ waddch(boardwin, tchar);
+ waddch(boardwin, tchar);
+ mark_possibles(oldy, oldx, ' ');
+ }
+
+ if (row != -1 && column != -1)
+ {
+ cellmove(row, column);
+ waddch(boardwin, '\b');
+ waddch(boardwin, trail);
+ waddch(boardwin, trail);
+ waddch(boardwin, trail);
+ mark_possibles(row, column, minus);
+ board[row][column] = TRUE;
+ }
+
+ wprintw(msgwin, "\nMove %d", movecount);
+}
+
+static bool evalmove(int row, int column)
+/* evaluate move */
+{
+ if (movecount == 1)
+ return(TRUE);
+ else if (board[row][column] == TRUE)
+ {
+ waddstr(msgwin, "\nYou've already been there.");
+ return(FALSE);
+ }
+ else
+ {
+ int rdif = iabs(row - history[movecount-1].y);
+ int cdif = iabs(column - history[movecount-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 bool chkmoves (void)
+/* check to see if valid moves are available */
+{
+ if (chksqr(rw+2,col+1)) return(TRUE);
+ if (chksqr(rw+2,col-1)) return(TRUE);
+ if (chksqr(rw-2,col+1)) return(TRUE);
+ if (chksqr(rw-2,col-1)) return(TRUE);
+ if (chksqr(rw+1,col+2)) return(TRUE);
+ if (chksqr(rw+1,col-2)) return(TRUE);
+ if (chksqr(rw-1,col+2)) return(TRUE);
+ if (chksqr(rw-1,col-2)) return(TRUE);
+ return (FALSE);
+}
+
+static int iabs(int num)
+{
+ if (num < 0) return (-num);
+ else return (num);
+}
+
+static bool chksqr (int r1, int c1)
+{
+ if ((r1 < 0) || (r1 > BDEPTH - 1))
+ return(FALSE);
+ if ((c1 < 0) || (c1 > BWIDTH - 1))
+ return(FALSE);
+ return ((!board[r1][c1]) ? TRUE : FALSE);
+}
+
+/* knight.c ends here */
diff --git a/contrib/ncurses/test/lrtest.c b/contrib/ncurses/test/lrtest.c
new file mode 100644
index 000000000000..893e1cde9e7c
--- /dev/null
+++ b/contrib/ncurses/test/lrtest.c
@@ -0,0 +1,49 @@
+/*
+ * Test lower-right-hand corner access
+ *
+ * by Eric S. Raymond <esr@thyrsus.com>
+ *
+ * This can't be part of the ncurses test-program, because ncurses rips off the
+ * bottom line to do labels.
+ *
+ * $Id: lrtest.c,v 0.7 1998/02/12 23:49:11 tom Exp $
+ */
+
+#include <test.priv.h>
+
+int
+main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ initscr();
+
+ move(LINES/2-1, 4);
+ if (!has_ic())
+ {
+ 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");
+ }
+
+ box(stdscr, 0, 0);
+ move(LINES-1, COLS-1);
+
+ refresh();
+
+ getch();
+ endwin();
+ return 0;
+}
+
+/* lrtest.c ends here */
diff --git a/contrib/ncurses/test/modules b/contrib/ncurses/test/modules
new file mode 100644
index 000000000000..3e70d49b2bea
--- /dev/null
+++ b/contrib/ncurses/test/modules
@@ -0,0 +1,57 @@
+# Test-Program modules
+# $Id: modules,v 1.10 1999/04/10 21:36:00 tom Exp $
+##############################################################################
+# Copyright (c) 1999 Free Software Foundation, Inc. #
+# #
+# Permission is hereby granted, free of charge, to any person obtaining a #
+# copy of this software and associated documentation files (the "Software"), #
+# to deal in the Software without restriction, including without limitation #
+# the rights to use, copy, modify, merge, publish, distribute, distribute #
+# with modifications, sublicense, and/or sell copies of the Software, and to #
+# permit persons to whom the Software is furnished to do so, subject to the #
+# following conditions: #
+# #
+# The above copyright notice and this permission notice shall be included in #
+# all copies or substantial portions of the Software. #
+# #
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL #
+# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING #
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER #
+# DEALINGS IN THE SOFTWARE. #
+# #
+# Except as contained in this notice, the name(s) of the above copyright #
+# holders 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
+#
+
+@ base
+blue progs $(srcdir) ../include/term.h
+bs progs $(srcdir)
+cardfile progs $(srcdir) ../include/panel.h ../include/menu.h ../include/form.h
+ditto progs $(srcdir)
+filter progs $(srcdir)
+firework progs $(srcdir) ../include/term.h
+firstlast progs $(srcdir)
+gdc progs $(srcdir)
+hanoi progs $(srcdir)
+hashtest progs $(srcdir)
+keynames progs $(srcdir)
+knight progs $(srcdir)
+lrtest progs $(srcdir)
+ncurses progs $(srcdir) ../include/panel.h ../include/menu.h ../include/form.h
+newdemo progs $(srcdir)
+rain progs $(srcdir) ../include/term.h
+tclock progs $(srcdir)
+testaddch progs $(srcdir)
+testcurs progs $(srcdir)
+testscanw progs $(srcdir)
+view progs $(srcdir)
+worm progs $(srcdir)
+xmas progs $(srcdir)
diff --git a/contrib/ncurses/test/ncurses.c b/contrib/ncurses/test/ncurses.c
new file mode 100644
index 000000000000..667d2ef6ffc9
--- /dev/null
+++ b/contrib/ncurses/test/ncurses.c
@@ -0,0 +1,3270 @@
+/****************************************************************************
+ * Copyright (c) 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. *
+ ****************************************************************************/
+/****************************************************************************
+
+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
+
+$Id: ncurses.c,v 1.118 1999/08/10 00:37:30 tom Exp $
+
+***************************************************************************/
+
+#include <test.priv.h>
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <signal.h>
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#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 HAVE_PANEL_H
+#define USE_LIBPANEL 1
+#include <panel.h>
+#else
+#define USE_LIBPANEL 0
+#endif
+
+#if HAVE_MENU_H && HAVE_LIBMENU
+#define USE_LIBMENU 1
+#include <menu.h>
+#else
+#define USE_LIBMENU 0
+#endif
+
+#if HAVE_FORM_H && HAVE_LIBFORM
+#define USE_LIBFORM 1
+#include <form.h>
+#else
+#define USE_LIBFORM 0
+#endif
+
+#ifdef NCURSES_VERSION
+
+#ifdef TRACE
+static int save_trace = TRACE_ORDINARY|TRACE_CALLS;
+extern int _nc_tracing;
+#endif
+
+#if !HAVE_NAPMS
+#define HAVE_NAPMS 1
+#endif
+
+#else
+
+#define mmask_t chtype /* not specified in XSI */
+#define attr_t chtype /* not specified in XSI */
+#define ACS_S3 (acs_map['p']) /* scan line 3 */
+#define ACS_S7 (acs_map['r']) /* scan line 7 */
+#define ACS_LEQUAL (acs_map['y']) /* less/equal */
+#define ACS_GEQUAL (acs_map['z']) /* greater/equal */
+#define ACS_PI (acs_map['{']) /* Pi */
+#define ACS_NEQUAL (acs_map['|']) /* not equal */
+#define ACS_STERLING (acs_map['}']) /* UK pound sign */
+
+#endif
+
+#define P(string) printw("%s\n", string)
+#ifndef CTRL
+#define CTRL(x) ((x) & 0x1f)
+#endif
+
+#define QUIT CTRL('Q')
+#define ESCAPE CTRL('[')
+#define BLANK ' ' /* this is the background character */
+
+/* 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));
+}
+
+/* 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;
+ _tracef("TOGGLE-TRACING OFF");
+ _nc_tracing = 0;
+ } else {
+ _nc_tracing = save_trace;
+ }
+ trace(_nc_tracing);
+ if (_nc_tracing)
+ _tracef("TOGGLE-TRACING ON");
+ }
+#else
+ c = wgetch(win);
+#endif
+ return c;
+}
+#define Getchar() wGetchar(stdscr)
+
+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();
+}
+
+static void ShellOut(bool message)
+{
+ if (message)
+ addstr("Shelling out...");
+ def_prog_mode();
+ endwin();
+ system("sh");
+ if (message)
+ addstr("returned from shellout.\n");
+ refresh();
+}
+
+#ifdef NCURSES_MOUSE_VERSION
+static const char *mouse_decode(MEVENT const *ep)
+{
+ static char buf[80];
+
+ (void) sprintf(buf, "id %2d at (%2d, %2d, %2d) state %4lx = {",
+ ep->id, ep->x, ep->y, ep->z, ep->bstate);
+
+#define SHOW(m, s) if ((ep->bstate & m)==m) {strcat(buf,s); strcat(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")
+ SHOW(BUTTON1_RESERVED_EVENT, "reserved-1")
+ 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")
+ SHOW(BUTTON2_RESERVED_EVENT, "reserved-2")
+ 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")
+ SHOW(BUTTON3_RESERVED_EVENT, "reserved-3")
+ 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")
+ SHOW(BUTTON4_RESERVED_EVENT, "reserved-4")
+ 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';
+ (void) strcat(buf, "}");
+ return(buf);
+}
+#endif /* NCURSES_MOUSE_VERSION */
+
+/****************************************************************************
+ *
+ * Character input test
+ *
+ ****************************************************************************/
+
+static void getch_test(void)
+/* test the keypad feature */
+{
+char buf[BUFSIZ];
+int c;
+int incount = 0, firsttime = 0;
+bool blocking = TRUE;
+int y, x;
+
+ refresh();
+
+#ifdef NCURSES_MOUSE_VERSION
+ mousemask(ALL_MOUSE_EVENTS, (mmask_t *)0);
+#endif
+
+ (void) printw("Delay in 10ths of a second (<CR> for blocking input)? ");
+ echo();
+ getstr(buf);
+ noecho();
+ nonl();
+
+ if (isdigit(buf[0]))
+ {
+ timeout(atoi(buf) * 100);
+ blocking = FALSE;
+ }
+
+ c = '?';
+ raw();
+ for (;;)
+ {
+ if (firsttime++)
+ {
+ printw("Key pressed: %04o ", c);
+#ifdef NCURSES_MOUSE_VERSION
+ if (c == KEY_MOUSE)
+ {
+ MEVENT event;
+
+ getmouse(&event);
+ printw("KEY_MOUSE, %s\n", mouse_decode(&event));
+ }
+ else
+#endif /* NCURSES_MOUSE_VERSION */
+ if (c >= KEY_MIN)
+ {
+ (void) addstr(keyname(c));
+ addch('\n');
+ }
+ else if (c > 0x80)
+ {
+ int c2 = (c & 0x7f);
+ if (isprint(c2))
+ (void) printw("M-%c", c2);
+ else
+ (void) printw("M-%s", unctrl(c2));
+ addstr(" (high-half character)\n");
+ }
+ else
+ {
+ if (isprint(c))
+ (void) printw("%c (ASCII printable character)\n", c);
+ else
+ (void) printw("%s (ASCII control character)\n", unctrl(c));
+ }
+ getyx(stdscr, y, x);
+ if (y >= LINES-1)
+ move(0,0);
+ clrtoeol();
+ }
+
+ if (c == 'g')
+ {
+ addstr("getstr test: ");
+ echo(); getstr(buf); noecho();
+ printw("I saw `%s'.\n", buf);
+ }
+ if (c == 's')
+ {
+ ShellOut(TRUE);
+ }
+ if (c == 'x' || c == 'q' || (c == ERR && blocking))
+ break;
+ if (c == '?')
+ {
+ addstr("Type any key to see its keypad value. Also:\n");
+ addstr("g -- triggers a getstr test\n");
+ addstr("s -- shell out\n");
+ addstr("q -- quit\n");
+ addstr("? -- repeats this help message\n");
+ }
+
+ while ((c = Getchar()) == ERR)
+ if (!blocking)
+ (void) printw("%05d: input timed out\n", incount++);
+ else {
+ (void) printw("%05d: input error\n", incount++);
+ break;
+ }
+ }
+
+#ifdef NCURSES_MOUSE_VERSION
+ mousemask(0, (mmask_t *)0);
+#endif
+ timeout(-1);
+ erase();
+ noraw();
+ nl();
+ endwin();
+}
+
+static int show_attr(int row, int skip, chtype attr, const char *name, bool once)
+{
+ int ncv = tigetnum("ncv");
+
+ mvprintw(row, 8, "%s mode:", name);
+ mvprintw(row, 24, "|");
+ if (skip) printw("%*s", skip, " ");
+ if (once)
+ attron(attr);
+ else
+ attrset(attr);
+ addstr("abcde fghij klmno pqrst uvwxy z");
+ if (once)
+ attroff(attr);
+ if (skip) printw("%*s", skip, " ");
+ printw("|");
+ if (attr != A_NORMAL) {
+ if (!(termattrs() & attr)) {
+ printw(" (N/A)");
+ } else if (ncv > 0 && (getbkgd(stdscr) & A_COLOR)) {
+ static const attr_t table[] = {
+ A_STANDOUT,
+ A_UNDERLINE,
+ A_REVERSE,
+ A_BLINK,
+ A_DIM,
+ A_BOLD,
+ A_INVIS,
+ A_PROTECT,
+ A_ALTCHARSET
+ };
+ unsigned n;
+ bool found = FALSE;
+ for (n = 0; n < sizeof(table)/sizeof(table[0]); n++) {
+ if ((table[n] & attr) != 0
+ && ((1 << n) & ncv) != 0) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (found)
+ printw(" (NCV)");
+ }
+ }
+ return row + 2;
+}
+
+static bool attr_getc(int *skip, int *fg, int *bg)
+{
+ int ch = Getchar();
+
+ if (isdigit(ch)) {
+ *skip = (ch - '0');
+ return TRUE;
+ } else if (ch == CTRL('L')) {
+ touchwin(stdscr);
+ touchwin(curscr);
+ return TRUE;
+ } else if (has_colors()) {
+ switch (ch) {
+ case 'f': *fg = (*fg + 1); break;
+ case 'F': *fg = (*fg - 1); break;
+ case 'b': *bg = (*bg + 1); break;
+ case 'B': *bg = (*bg - 1); break;
+ default:
+ return FALSE;
+ }
+ if (*fg >= COLORS) *fg = 0;
+ if (*fg < 0) *fg = COLORS - 1;
+ if (*bg >= COLORS) *bg = 0;
+ if (*bg < 0) *bg = COLORS - 1;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void attr_test(void)
+/* test text attributes */
+{
+ int n;
+ int skip = tigetnum("xmc");
+ int fg = COLOR_BLACK; /* color pair 0 is special */
+ int bg = COLOR_BLACK;
+ bool *pairs = (bool *)calloc(COLOR_PAIRS, sizeof(bool));
+ pairs[0] = TRUE;
+
+ if (skip < 0)
+ skip = 0;
+
+ n = skip; /* make it easy */
+
+ do {
+ int row = 2;
+ int normal = A_NORMAL | BLANK;
+
+ if (has_colors()) {
+ int pair = (fg * COLORS) + bg;
+ if (!pairs[pair]) {
+ init_pair(pair, fg, bg);
+ pairs[pair] = TRUE;
+ }
+ normal |= COLOR_PAIR(pair);
+ }
+ bkgdset(normal);
+ erase();
+
+ mvaddstr(0, 20, "Character attribute test display");
+
+ row = show_attr(row, n, A_STANDOUT, "STANDOUT", TRUE);
+ row = show_attr(row, n, A_REVERSE, "REVERSE", TRUE);
+ row = show_attr(row, n, A_BOLD, "BOLD", TRUE);
+ row = show_attr(row, n, A_UNDERLINE, "UNDERLINE", TRUE);
+ row = show_attr(row, n, A_DIM, "DIM", TRUE);
+ row = show_attr(row, n, A_BLINK, "BLINK", TRUE);
+ row = show_attr(row, n, A_PROTECT, "PROTECT", TRUE);
+ row = show_attr(row, n, A_INVIS, "INVISIBLE", TRUE);
+ row = show_attr(row, n, A_NORMAL, "NORMAL", FALSE);
+
+ mvprintw(row, 8,
+ "This terminal does %shave the magic-cookie glitch",
+ tigetnum("xmc") > -1 ? "" : "not ");
+ mvprintw(row+1, 8,
+ "Enter a digit to set gaps on each side of displayed attributes");
+ mvprintw(row+2, 8,
+ "^L = repaint");
+ if (has_colors())
+ printw(". f/F/b/F toggle colors (now %d/%d)", fg, bg);
+
+ refresh();
+ } while (attr_getc(&n, &fg, &bg));
+
+ free((char *)pairs);
+ bkgdset(A_NORMAL | BLANK);
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Color support tests
+ *
+ ****************************************************************************/
+
+static NCURSES_CONST char *color_names[] =
+{
+ "black",
+ "red",
+ "green",
+ "yellow",
+ "blue",
+ "magenta",
+ "cyan",
+ "white"
+};
+
+static void show_color_name(int y, int x, int color)
+{
+ if (COLORS > 8)
+ mvprintw(y, x, "%02d ", color);
+ else
+ mvaddstr(y, x, color_names[color]);
+}
+
+static void color_test(void)
+/* generate a color test pattern */
+{
+ int i;
+ int base, top, width;
+ NCURSES_CONST char *hello;
+
+ refresh();
+ (void) printw("There are %d color pairs\n", COLOR_PAIRS);
+
+ width = (COLORS > 8) ? 4 : 8;
+ hello = (COLORS > 8) ? "Test" : "Hello";
+
+ for (base = 0; base < 2; base++)
+ {
+ top = (COLORS > 8) ? 0 : base * (COLORS+3);
+ clrtobot();
+ (void) mvprintw(top + 1, 0,
+ "%dx%d matrix of foreground/background colors, bright *%s*\n",
+ COLORS, COLORS,
+ base ? "on" : "off");
+ for (i = 0; i < COLORS; i++)
+ show_color_name(top + 2, (i+1) * width, i);
+ for (i = 0; i < COLORS; i++)
+ show_color_name(top + 3 + i, 0, i);
+ for (i = 1; i < COLOR_PAIRS; i++)
+ {
+ init_pair(i, i % COLORS, i / COLORS);
+ attron((attr_t)COLOR_PAIR(i));
+ if (base)
+ attron((attr_t)A_BOLD);
+ mvaddstr(top + 3 + (i / COLORS), (i % COLORS + 1) * width, hello);
+ attrset(A_NORMAL);
+ }
+ if ((COLORS > 8) || base)
+ Pause();
+ }
+
+ erase();
+ endwin();
+}
+
+static void change_color(int current, int field, int value, int usebase)
+{
+ short red, green, blue;
+
+ if (usebase)
+ color_content(current, &red, &green, &blue);
+ else
+ red = green = blue = 0;
+
+ switch (field) {
+ case 0:
+ red += value;
+ break;
+ case 1:
+ green += value;
+ break;
+ case 2:
+ blue += value;
+ break;
+ }
+
+ if (init_color(current, red, green, blue) == ERR)
+ beep();
+}
+
+static void color_edit(void)
+/* display the color test pattern, without trying to edit colors */
+{
+ int i, this_c = 0, value = 0, current = 0, field = 0;
+ int last_c;
+
+ refresh();
+
+ for (i = 0; i < COLORS; i++)
+ init_pair(i, COLOR_WHITE, i);
+
+ mvprintw(LINES-2, 0, "Number: %d", value);
+
+ do {
+ short red, green, blue;
+
+ attron(A_BOLD);
+ mvaddstr(0, 20, "Color RGB Value Editing");
+ attroff(A_BOLD);
+
+ for (i = 0; i < COLORS; i++)
+ {
+ mvprintw(2 + i, 0, "%c %-8s:",
+ (i == current ? '>' : ' '),
+ (i < (int) SIZEOF(color_names)
+ ? color_names[i] : ""));
+ attrset(COLOR_PAIR(i));
+ addstr(" ");
+ attrset(A_NORMAL);
+
+ /*
+ * Note: this refresh should *not* be necessary! It works around
+ * a bug in attribute handling that apparently causes the A_NORMAL
+ * attribute sets to interfere with the actual emission of the
+ * color setting somehow. This needs to be fixed.
+ */
+ refresh();
+
+ color_content(i, &red, &green, &blue);
+ addstr(" R = ");
+ if (current == i && field == 0) attron(A_STANDOUT);
+ printw("%04d", red);
+ if (current == i && field == 0) attrset(A_NORMAL);
+ addstr(", G = ");
+ if (current == i && field == 1) attron(A_STANDOUT);
+ printw("%04d", green);
+ if (current == i && field == 1) attrset(A_NORMAL);
+ addstr(", B = ");
+ if (current == i && field == 2) attron(A_STANDOUT);
+ printw("%04d", blue);
+ if (current == i && field == 2) attrset(A_NORMAL);
+ attrset(A_NORMAL);
+ addstr(")");
+ }
+
+ mvaddstr(COLORS + 3, 0,
+ "Use up/down to select a color, left/right to change fields.");
+ mvaddstr(COLORS + 4, 0,
+ "Modify field by typing nnn=, nnn-, or nnn+. ? for help.");
+
+ move(2 + current, 0);
+
+ last_c = this_c;
+ this_c = Getchar();
+ if (isdigit(this_c) && !isdigit(last_c))
+ value = 0;
+
+ switch (this_c)
+ {
+ case KEY_UP:
+ current = (current == 0 ? (COLORS - 1) : current - 1);
+ break;
+
+ case KEY_DOWN:
+ current = (current == (COLORS - 1) ? 0 : current + 1);
+ break;
+
+ case KEY_RIGHT:
+ field = (field == 2 ? 0 : field + 1);
+ break;
+
+ 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(current, field, value, 1);
+ break;
+
+ case '-':
+ change_color(current, field, -value, 1);
+ break;
+
+ case '=':
+ change_color(current, field, value, 0);
+ break;
+
+ case '?':
+ 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();
+ break;
+
+ case 'x':
+ case 'q':
+ break;
+
+ default:
+ beep();
+ break;
+ }
+ mvprintw(LINES-2, 0, "Number: %d", value);
+ clrtoeol();
+ } while
+ (this_c != 'x' && this_c != 'q');
+
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Soft-key label test
+ *
+ ****************************************************************************/
+
+static void slk_test(void)
+/* exercise the soft keys */
+{
+ int c, fmt = 1;
+ char buf[9];
+
+ c = CTRL('l');
+ do {
+ move(0, 0);
+ switch(c)
+ {
+ case CTRL('l'):
+ erase();
+ attron(A_BOLD);
+ mvaddstr(0, 20, "Soft Key Exerciser");
+ attroff(A_BOLD);
+
+ move(2, 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();
+ /* fall through */
+
+ case 'a':
+ slk_restore();
+ break;
+
+ case 'e':
+ wclear(stdscr);
+ break;
+
+ case 's':
+ mvprintw(20, 0, "Press Q to stop the scrolling-test: ");
+ while ((c = Getchar()) != 'Q' && (c != ERR))
+ addch((chtype)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':
+ (void) mvaddstr(20, 0, "Please enter the label value: ");
+ echo();
+ wgetnstr(stdscr, buf, 8);
+ noecho();
+ slk_set((c - '0'), buf, fmt);
+ slk_refresh();
+ move(20, 0); clrtoeol();
+ break;
+
+ case 'x':
+ case 'q':
+ goto done;
+
+ default:
+ beep();
+ }
+ } while
+ ((c = Getchar()) != EOF);
+
+ done:
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Alternate character-set stuff
+ *
+ ****************************************************************************/
+
+/* 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 first)
+{
+ bool C1 = (first == 128);
+ int code;
+ int last = first + 31;
+ 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 row = 4 + ((code - first) % 16);
+ int col = ((code - first) / 16) * COLS / 2;
+ char tmp[80];
+ sprintf(tmp, "%3d (0x%x)", code, code);
+ mvprintw(row, col, "%*s: ", COLS/4, tmp);
+ if (C1)
+ nodelay(stdscr, TRUE);
+ echochar(code);
+ if (C1) {
+ /* (yes, this _is_ crude) */
+ while ((reply = Getchar()) != ERR) {
+ addch(reply);
+ napms(10);
+ }
+ nodelay(stdscr, FALSE);
+ }
+ }
+}
+
+static int show_1_acs(int n, const char *name, chtype code)
+{
+ const int height = 16;
+ int row = 4 + (n % height);
+ int col = (n / height) * COLS / 2;
+ mvprintw(row, col, "%*s : ", COLS/4, name);
+ addch(code);
+ return n + 1;
+}
+
+static void show_acs_chars(void)
+/* display the ACS character set */
+{
+ int n;
+
+#define BOTH(name) #name, name
+
+ erase();
+ attron(A_BOLD);
+ mvaddstr(0, 20, "Display of the ACS Character Set");
+ attroff(A_BOLD);
+ refresh();
+
+ n = show_1_acs(0, BOTH(ACS_ULCORNER));
+ n = show_1_acs(n, BOTH(ACS_LLCORNER));
+ n = show_1_acs(n, BOTH(ACS_URCORNER));
+ n = show_1_acs(n, BOTH(ACS_LRCORNER));
+ n = show_1_acs(n, BOTH(ACS_RTEE));
+ n = show_1_acs(n, BOTH(ACS_LTEE));
+ n = show_1_acs(n, BOTH(ACS_BTEE));
+ n = show_1_acs(n, BOTH(ACS_TTEE));
+ n = show_1_acs(n, BOTH(ACS_HLINE));
+ n = show_1_acs(n, BOTH(ACS_VLINE));
+ n = show_1_acs(n, BOTH(ACS_PLUS));
+ n = show_1_acs(n, BOTH(ACS_S1));
+ n = show_1_acs(n, BOTH(ACS_S9));
+ n = show_1_acs(n, BOTH(ACS_DIAMOND));
+ n = show_1_acs(n, BOTH(ACS_CKBOARD));
+ n = show_1_acs(n, BOTH(ACS_DEGREE));
+ n = show_1_acs(n, BOTH(ACS_PLMINUS));
+ n = show_1_acs(n, BOTH(ACS_BULLET));
+ n = show_1_acs(n, BOTH(ACS_LARROW));
+ n = show_1_acs(n, BOTH(ACS_RARROW));
+ n = show_1_acs(n, BOTH(ACS_DARROW));
+ n = show_1_acs(n, BOTH(ACS_UARROW));
+ n = show_1_acs(n, BOTH(ACS_BOARD));
+ n = show_1_acs(n, BOTH(ACS_LANTERN));
+ n = show_1_acs(n, BOTH(ACS_BLOCK));
+ n = show_1_acs(n, BOTH(ACS_S3));
+ n = show_1_acs(n, BOTH(ACS_S7));
+ n = show_1_acs(n, BOTH(ACS_LEQUAL));
+ n = show_1_acs(n, BOTH(ACS_GEQUAL));
+ n = show_1_acs(n, BOTH(ACS_PI));
+ n = show_1_acs(n, BOTH(ACS_NEQUAL));
+ n = show_1_acs(n, BOTH(ACS_STERLING));
+}
+
+static void acs_display(void)
+{
+ int c = 'a';
+
+ do {
+ switch (c) {
+ case 'a':
+ show_acs_chars();
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ show_upper_chars((c - '0') * 32 + 128);
+ break;
+ }
+ mvprintw(LINES-3,0, "Note: ANSI terminals may not display C1 characters.");
+ mvprintw(LINES-2,0, "Select: a=ACS, 0=C1, 1,2,3=GR characters, q=quit");
+ refresh();
+ } while ((c = Getchar()) != 'x' && c != 'q');
+
+ Pause();
+ erase();
+ endwin();
+}
+
+/*
+ * Graphic-rendition test (adapted from vttest)
+ */
+static void
+test_sgr_attributes(void)
+{
+ int pass;
+
+ for (pass = 0; pass < 2; pass++) {
+ int normal = ((pass == 0 ? A_NORMAL : A_REVERSE)) | BLANK;
+
+ /* Use non-default colors if possible to exercise bce a little */
+ if (has_colors()) {
+ init_pair(1, COLOR_WHITE, COLOR_BLUE);
+ normal |= 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();
+}
+
+/****************************************************************************
+ *
+ * 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;
+};
+
+/* 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.
+ */
+static bool HaveKeypad(FRAME *curp)
+{
+ WINDOW *win = (curp ? curp->wind : stdscr);
+ return win->_use_keypad;
+}
+
+static bool HaveScroll(FRAME *curp)
+{
+ WINDOW *win = (curp ? curp->wind : stdscr);
+ return win->_scroll;
+}
+
+static void newwin_legend(FRAME *curp)
+{
+ static const struct {
+ const char *msg;
+ int code;
+ } legend[] = {
+ { "^C = create window", 0 },
+ { "^N = next window", 0 },
+ { "^P = previous window", 0 },
+ { "^F = scroll forward", 0 },
+ { "^B = scroll backward", 0 },
+ { "^K = keypad(%s)", 1 },
+ { "^S = scrollok(%s)", 2 },
+ { "^W = save window to file", 0 },
+ { "^R = restore window", 0 },
+#ifdef NCURSES_VERSION
+ { "^X = resize", 0 },
+#endif
+ { "^Q%s = exit", 3 }
+ };
+ size_t n;
+ int y, x;
+ bool do_keypad = HaveKeypad(curp);
+ bool do_scroll = HaveScroll(curp);
+ char buf[BUFSIZ];
+
+ move(LINES-4, 0);
+ for (n = 0; n < SIZEOF(legend); n++) {
+ switch (legend[n].code) {
+ default:
+ strcpy(buf, legend[n].msg);
+ break;
+ case 1:
+ sprintf(buf, legend[n].msg, do_keypad ? "yes" : "no");
+ break;
+ case 2:
+ sprintf(buf, legend[n].msg, do_scroll ? "yes" : "no");
+ break;
+ case 3:
+ sprintf(buf, legend[n].msg, do_keypad ? "/ESC" : "");
+ break;
+ }
+ getyx(stdscr, y, x);
+ 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 = (curp != 0) ? curp->wind : stdscr;
+ 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 QUIT:
+ case ESCAPE: 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;
+ }
+ }
+ /* FALLTHRU */
+#endif
+ 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();
+
+ wrefresh(rwindow);
+
+ move(0, 0); clrtoeol();
+ return(rwindow);
+}
+
+static void newwin_move(FRAME *curp, int dy, int dx)
+{
+ WINDOW *win = (curp != 0) ? curp->wind : stdscr;
+ 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;
+
+ 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) ? 0 : fp->next;
+ free(fp);
+ return np;
+}
+
+static void acs_and_scroll(void)
+/* Demonstrate windows */
+{
+ int c, i;
+ FILE *fp;
+ FRAME *current = (FRAME *)0, *neww;
+ WINDOW *usescr = stdscr;
+
+#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'):
+ neww = (FRAME *) calloc(1, sizeof(FRAME));
+ if ((neww->wind = getwindow()) == (WINDOW *)0)
+ 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(current->wind, 1);
+ break;
+
+ case CTRL('B'): /* scroll current window backwards */
+ if (current)
+ wscrl(current->wind, -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;
+
+ case CTRL('W'): /* save and delete window */
+ if (current == current->next)
+ break;
+ if ((fp = fopen(DUMPFILE, "w")) == (FILE *)0)
+ transient(current, "Can't open screen dump file");
+ else
+ {
+ (void) putwin(current->wind, fp);
+ (void) fclose(fp);
+
+ current = delete_framed(current, TRUE);
+ }
+ break;
+
+ case CTRL('R'): /* restore window */
+ if ((fp = fopen(DUMPFILE, "r")) == (FILE *)0)
+ transient(current, "Can't open screen dump file");
+ else
+ {
+ neww = (FRAME *) calloc(1, sizeof(FRAME));
+
+ neww->next = current->next;
+ neww->last = current;
+ neww->last->next = neww;
+ neww->next->last = neww;
+
+ neww->wind = getwin(fp);
+ (void) fclose(fp);
+
+ wrefresh(neww->wind);
+ }
+ break;
+
+#ifdef NCURSES_VERSION
+ 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)
+ 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 /* NCURSES_VERSION */
+
+ case KEY_F(10): /* undocumented --- use this to test area clears */
+ selectcell(0, 0, LINES - 1, COLS - 1);
+ clrtobot();
+ refresh();
+ break;
+
+ 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(current->wind, y, x);
+ if (--x < 0) {
+ if (--y < 0)
+ break;
+ x = getmaxx(current->wind) - 1;
+ }
+ mvwdelch(current->wind, y, x);
+ }
+ break;
+
+ case '\r':
+ c = '\n';
+ /* FALLTHROUGH */
+
+ default:
+ if (current)
+ waddch(current->wind, (chtype)c);
+ else
+ beep();
+ break;
+ }
+ newwin_report(current);
+ usescr = (current ? current->wind : stdscr);
+ wrefresh(usescr);
+ } while
+ ((c = wGetchar(usescr)) != QUIT
+ && !((c == ESCAPE) && (usescr->_use_keypad))
+ && (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();
+}
+
+/****************************************************************************
+ *
+ * Panels tester
+ *
+ ****************************************************************************/
+
+#if USE_LIBPANEL
+static unsigned long nap_msec = 1;
+
+static NCURSES_CONST char *mod[] =
+{
+ "test ",
+ "TEST ",
+ "(**) ",
+ "*()* ",
+ "<--> ",
+ "LAST "
+};
+
+/*+-------------------------------------------------------------------------
+ wait_a_while(msec)
+--------------------------------------------------------------------------*/
+static void
+wait_a_while(unsigned long 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 > 1000L)
+ sleep((int)msec/1000L);
+ 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);
+ waddstr(stdscr, text);
+} /* end of saywhat */
+
+/*+-------------------------------------------------------------------------
+ mkpanel(rows,cols,tly,tlx) - alloc a win and panel and associate them
+--------------------------------------------------------------------------*/
+static PANEL *
+mkpanel(int 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 (has_colors()) {
+ int fg = (color == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK;
+ int bg = color;
+ init_pair(color, fg, bg);
+ wbkgdset(win, 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
+fill_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,num);
+ }
+ }
+} /* end of fill_panel */
+
+static void demo_panels(void)
+{
+int itmp;
+register int y,x;
+
+ refresh();
+
+ for(y = 0; y < LINES - 1; y++)
+ {
+ for(x = 0; x < COLS; x++)
+ wprintw(stdscr,"%d",(y + x) % 10);
+ }
+ for(y = 0; y < 5; y++)
+ {
+ PANEL *p1;
+ PANEL *p2;
+ PANEL *p3;
+ PANEL *p4;
+ PANEL *p5;
+
+ p1 = mkpanel(COLOR_RED, LINES/2 - 2, COLS/8 + 1, 0, 0);
+ set_panel_userptr(p1,"p1");
+
+ p2 = mkpanel(COLOR_GREEN, LINES/2 + 1, COLS/7, LINES/4, COLS/10);
+ set_panel_userptr(p2,"p2");
+
+ p3 = mkpanel(COLOR_YELLOW, LINES/4, COLS/10, LINES/2, COLS/9);
+ set_panel_userptr(p3,"p3");
+
+ p4 = mkpanel(COLOR_BLUE, LINES/2 - 2, COLS/8, LINES/2 - 2, COLS/3);
+ set_panel_userptr(p4,"p4");
+
+ p5 = mkpanel(COLOR_MAGENTA, LINES/2 - 2, COLS/8, LINES/2, COLS/2 - 2);
+ set_panel_userptr(p5,"p5");
+
+ fill_panel(p1);
+ fill_panel(p2);
+ fill_panel(p3);
+ fill_panel(p4);
+ fill_panel(p5);
+ hide_panel(p4);
+ hide_panel(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_panel(p1,0,0);
+ hide_panel(p3);
+ show_panel(p1);
+ show_panel(p2);
+ show_panel(p4);
+ show_panel(p5);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("s1; press any key to continue");
+ show_panel(p1);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("s2; press any key to continue");
+ show_panel(p2);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("m2; press any key to continue");
+ move_panel(p2, LINES/3 + 1, COLS / 8);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("s3;");
+ show_panel(p3);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("m3; press any key to continue");
+ move_panel(p3, LINES/4 + 1, COLS / 15);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("b3; press any key to continue");
+ bottom_panel(p3);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("s4; press any key to continue");
+ show_panel(p4);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("s5; press any key to continue");
+ show_panel(p5);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t3; press any key to continue");
+ top_panel(p3);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t1; press any key to continue");
+ top_panel(p1);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t2; press any key to continue");
+ top_panel(p2);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t3; press any key to continue");
+ top_panel(p3);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t4; press any key to continue");
+ top_panel(p4);
+ pflush();
+ wait_a_while(nap_msec);
+
+ for(itmp = 0; itmp < 6; itmp++)
+ {
+ WINDOW *w4 = panel_window(p4);
+ WINDOW *w5 = panel_window(p5);
+
+ saywhat("m4; press any key to continue");
+ wmove(w4, LINES/8, 1);
+ waddstr(w4,mod[itmp]);
+ move_panel(p4, LINES/6, itmp*(COLS/8));
+ wmove(w5, LINES/6, 1);
+ waddstr(w5,mod[itmp]);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("m5; press any key to continue");
+ wmove(w4, LINES/6, 1);
+ waddstr(w4,mod[itmp]);
+ move_panel(p5, LINES/3 - 1,(itmp*10) + 6);
+ wmove(w5, LINES/8, 1);
+ waddstr(w5,mod[itmp]);
+ pflush();
+ wait_a_while(nap_msec);
+ }
+
+ saywhat("m4; press any key to continue");
+ move_panel(p4, LINES/6, itmp*(COLS/8));
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t5; press any key to continue");
+ top_panel(p5);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t2; press any key to continue");
+ top_panel(p2);
+ pflush();
+ wait_a_while(nap_msec);
+
+ saywhat("t1; press any key to continue");
+ top_panel(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_panel(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)
+ break;
+ nap_msec = 100L;
+ }
+
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Pad tester
+ *
+ ****************************************************************************/
+
+#define GRIDSIZE 3
+
+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, 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."
+ };
+ int n = (SIZEOF(legend) - (LINES - line));
+ if (line < LINES && (n >= 0)) {
+ move(line, 0);
+ 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 panner(WINDOW *pad,
+ int top_x, int top_y, int porty, int portx,
+ int (*pgetc)(WINDOW *))
+{
+#if HAVE_GETTIMEOFDAY
+ struct timeval before, after;
+ bool timing = TRUE;
+#endif
+ 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 '?':
+ if (c == '?')
+ show_panner_legend = !show_panner_legend;
+ panner_legend(LINES - 4);
+ panner_legend(LINES - 3);
+ panner_legend(LINES - 2);
+ panner_legend(LINES - 1);
+ 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;
+
+ 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)(top_x + (basex * ratio));
+ highend = (int)(top_x + ((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)(top_y + (basey * ratio));
+ highend = (int)(top_y + ((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 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
+ if (timing) {
+ double elapsed;
+ gettimeofday(&after, 0);
+ elapsed = (after.tv_sec + after.tv_usec / 1.0e6)
+ - (before.tv_sec + before.tv_usec / 1.0e6);
+ move(LINES-1, COLS-20);
+ 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)
+{
+ int c;
+
+ switch(c = wGetchar(win))
+ {
+ case '!': ShellOut(FALSE); return KEY_REFRESH;
+ case CTRL('r'): endwin(); refresh(); return KEY_REFRESH;
+ case CTRL('l'): return KEY_REFRESH;
+ case 'U': return(KEY_UP);
+ case 'D': return(KEY_DOWN);
+ case 'R': return(KEY_RIGHT);
+ case 'L': return(KEY_LEFT);
+ case '+': return(KEY_IL);
+ case '-': return(KEY_DL);
+ case '>': return(KEY_IC);
+ case '<': return(KEY_DC);
+ case ERR: /* FALLTHRU */
+ case 'q': return(KEY_EXIT);
+ default: return(c);
+ }
+}
+
+static void demo_pad(void)
+/* Demonstrate pads. */
+{
+ int i, j;
+ unsigned gridcount = 0;
+ WINDOW *panpad = newpad(200, 200);
+
+ for (i = 0; i < 200; i++)
+ {
+ for (j = 0; j < 200; j++)
+ if (i % GRIDSIZE == 0 && j % GRIDSIZE == 0)
+ {
+ if (i == 0 || j == 0)
+ waddch(panpad, '+');
+ else
+ waddch(panpad, (chtype)('A' + (gridcount++ % 26)));
+ }
+ else if (i % GRIDSIZE == 0)
+ waddch(panpad, '-');
+ else if (j % GRIDSIZE == 0)
+ waddch(panpad, '|');
+ else
+ waddch(panpad, ' ');
+ }
+ 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);
+
+ delwin(panpad);
+ endwin();
+ erase();
+}
+#endif /* USE_LIBPANEL */
+
+/****************************************************************************
+ *
+ * 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 void flushinp_test(WINDOW *win)
+/* Input test, adapted from John Burnell's PDCurses tester */
+{
+ 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;
+
+#ifdef A_COLOR
+ if (has_colors())
+ {
+ init_pair(2,COLOR_CYAN,COLOR_BLUE);
+ wattrset(subWin, COLOR_PAIR(2) | A_BOLD);
+ }
+ else
+ wattrset(subWin, A_BOLD);
+#else
+ wattrset(subWin, A_BOLD);
+#endif
+ 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();
+}
+
+/****************************************************************************
+ *
+ * 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 char *animals[] =
+{
+ "Lions", "Tigers", "Bears", "(Oh my!)", "Newts", "Platypi", "Lemurs",
+ (char *)0
+};
+
+static void menu_test(void)
+{
+ MENU *m;
+ ITEM *items[SIZEOF(animals)];
+ ITEM **ip = items;
+ const 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++)
+ *ip++ = new_item(*ap, "");
+ *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_REQUEST_DENIED)
+ beep();
+ continue;
+ }
+
+ (void) 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
+}
+
+#ifdef TRACE
+#define T_TBL(name) { #name, name }
+static struct {
+ const char *name;
+ int 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_MAXIMUM),
+ { (char *)0, 0 }
+};
+
+static char *tracetrace(int tlevel)
+{
+ static char *buf;
+ int n;
+
+ if (buf == 0) {
+ size_t need = 12;
+ for (n = 0; t_tbl[n].name != 0; n++)
+ need += strlen(t_tbl[n].name) + 2;
+ buf = (char *)malloc(need);
+ }
+ sprintf(buf, "0x%02x = {", tlevel);
+ if (tlevel == 0) {
+ sprintf(buf + strlen(buf), "%s, ", t_tbl[0].name);
+ } else {
+ for (n = 1; t_tbl[n].name != 0; n++)
+ if ((tlevel & t_tbl[n].mask) == t_tbl[n].mask)
+ {
+ strcat(buf, t_tbl[n].name);
+ strcat(buf, ", ");
+ }
+ }
+ if (buf[strlen(buf) - 2] == ',')
+ buf[strlen(buf) - 2] = '\0';
+ return(strcat(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 void trace_set(void)
+/* interactively set the trace level */
+{
+ MENU *m;
+ ITEM *items[SIZEOF(t_tbl)];
+ ITEM **ip = items;
+ int mrows, mcols, 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++)
+ *ip++ = new_item(t_tbl[n].name, "");
+ *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++) {
+ int 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;
+ trace(newtrace);
+ _tracef("trace level interactively set to %s", tracetrace(_nc_tracing));
+
+ (void) 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);
+}
+#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, strlen(label), frow, fcol, 0, 0);
+
+ if (f)
+ {
+ set_field_buffer(f, 0, label);
+ set_field_opts(f, 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, nbuf;
+
+ if (field_info(me, &rows, &cols, &frow, &fcol, (int *)0, &nbuf) == E_OK
+ && nbuf > 0) {
+ char temp[80];
+ long len;
+
+ strcpy(temp, field_buffer(me, 1));
+ len = (long)(char *) field_userptr(me);
+ if (c <= KEY_MAX) {
+ if (isgraph(c)) {
+ temp[len++] = 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);
+ }
+ return c;
+}
+
+static int form_virtualize(FORM *f, WINDOW *w)
+{
+ 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 }
+ };
+
+ static int mode = REQ_INS_MODE;
+ int c = wGetchar(w);
+ unsigned n;
+ FIELD *me = current_field(f);
+
+ if (c == CTRL(']')) {
+ if (mode == REQ_INS_MODE)
+ mode = REQ_OVL_MODE;
+ else
+ mode = REQ_INS_MODE;
+ c = mode;
+ } else {
+ for (n = 0; n < sizeof(lookup)/sizeof(lookup[0]); n++) {
+ if (lookup[n].code == c) {
+ c = lookup[n].result;
+ break;
+ }
+ }
+ }
+
+ /*
+ * 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) {
+ c = edit_secure(me, c);
+ set_field_back(me, A_REVERSE);
+ } else if (c <= MAX_FORM_COMMAND) {
+ 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);
+ }
+}
+
+static void demo_forms(void)
+{
+ WINDOW *w;
+ FORM *form;
+ FIELD *f[12], *secure;
+ int finished = 0, c;
+ unsigned n = 0;
+
+ move(18, 0);
+ addstr("Defined form-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.");
+
+ mvaddstr(4, 57, "Forms Entry Test");
+
+ refresh();
+
+ /* describe the form */
+ 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);
+ f[n++] = make_label(2, 20, "First Name");
+ f[n++] = make_field(3, 20, 1, 12, FALSE);
+ f[n++] = make_label(2, 34, "Middle Name");
+ f[n++] = make_field(3, 34, 1, 12, FALSE);
+ 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);
+ f[n++] = (FIELD *)0;
+
+ form = new_form(f);
+
+ display_form(form);
+
+ w = form_win(form);
+ raw();
+ 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]);
+ noraw();
+}
+#endif /* USE_LIBFORM */
+
+/****************************************************************************
+ *
+ * Overlap test
+ *
+ ****************************************************************************/
+
+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, ch);
+ }
+}
+
+static void crosswin(WINDOW *win, char ch)
+{
+ int y, x;
+ int y1, x1;
+
+ getmaxyx(win, y1, x1);
+ for (y = 0; y < y1; y++)
+ {
+ for (x = 0; x < x1; x++)
+ if (((x > (x1 - 1) / 3) && (x <= (2 * (x1 - 1)) / 3))
+ || (((y > (y1 - 1) / 3) && (y <= (2 * (y1 - 1)) / 3))))
+ {
+ wmove(win, y, x);
+ waddch(win, ch);
+ }
+ }
+}
+
+static void overlap_test(void)
+/* test effects of overlapping windows */
+{
+ int ch;
+
+ WINDOW *win1 = newwin(9, 20, 3, 3);
+ WINDOW *win2 = newwin(9, 20, 9, 16);
+
+ raw();
+ refresh();
+ move(0, 0);
+ printw("This test shows the behavior of wnoutrefresh() with respect to\n");
+ printw("the shared region of two overlapping windows A and B. The cross\n");
+ printw("pattern in each window does not overlap the other.\n");
+
+
+ move(18, 0);
+ printw("a = refresh A, then B, then doupdate. b = refresh B, then A, then doupdaute\n");
+ printw("c = fill window A with letter A. d = fill window B with letter B.\n");
+ printw("e = cross pattern in window A. f = cross pattern in window B.\n");
+ printw("g = clear window A. h = clear window B.\n");
+ printw("i = overwrite A onto B. j = overwrite B onto A.\n");
+ printw("^Q/ESC = terminate test.");
+
+ while ((ch = Getchar()) != QUIT && ch != ESCAPE)
+ switch (ch)
+ {
+ case 'a': /* refresh window A first, then B */
+ wnoutrefresh(win1);
+ wnoutrefresh(win2);
+ doupdate();
+ break;
+
+ case 'b': /* refresh window B first, then A */
+ wnoutrefresh(win2);
+ wnoutrefresh(win1);
+ doupdate();
+ break;
+
+ case 'c': /* fill window A so it's visible */
+ fillwin(win1, 'A');
+ break;
+
+ case 'd': /* fill window B so it's visible */
+ fillwin(win2, 'B');
+ break;
+
+ case 'e': /* cross test pattern in window A */
+ crosswin(win1, 'A');
+ break;
+
+ case 'f': /* cross test pattern in window A */
+ crosswin(win2, 'B');
+ break;
+
+ case 'g': /* clear window A */
+ wclear(win1);
+ wmove(win1, 0, 0);
+ break;
+
+ case 'h': /* clear window B */
+ wclear(win2);
+ wmove(win2, 0, 0);
+ break;
+
+ case 'i': /* overwrite A onto B */
+ overwrite(win1, win2);
+ break;
+
+ case 'j': /* overwrite B onto A */
+ overwrite(win2, win1);
+ break;
+ }
+
+ delwin(win2);
+ delwin(win1);
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Main sequence
+ *
+ ****************************************************************************/
+
+static bool
+do_single_test(const char c)
+/* perform a single specified test */
+{
+ switch (c)
+ {
+ case 'a':
+ getch_test();
+ break;
+
+ case 'b':
+ attr_test();
+ break;
+
+ case 'c':
+ if (!has_colors())
+ Cannot("does not support color.");
+ else
+ color_test();
+ break;
+
+ case 'd':
+ if (!has_colors())
+ Cannot("does not support color.");
+ else if (!can_change_color())
+ Cannot("has hardwired color values.");
+ else
+ color_edit();
+ break;
+
+ case 'e':
+ slk_test();
+ break;
+
+ case 'f':
+ acs_display();
+ break;
+
+#if USE_LIBPANEL
+ case 'o':
+ demo_panels();
+ break;
+#endif
+
+ case 'g':
+ acs_and_scroll();
+ break;
+
+ case 'i':
+ flushinp_test(stdscr);
+ break;
+
+ case 'k':
+ test_sgr_attributes();
+ break;
+
+#if USE_LIBMENU
+ case 'm':
+ menu_test();
+ break;
+#endif
+
+#if USE_LIBPANEL
+ case 'p':
+ demo_pad();
+ break;
+#endif
+
+#if USE_LIBFORM
+ case 'r':
+ demo_forms();
+ break;
+#endif
+
+ case 's':
+ overlap_test();
+ break;
+
+#if USE_LIBMENU && defined(TRACE)
+ case 't':
+ trace_set();
+ break;
+#endif
+
+ case '?':
+ break;
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+usage(void)
+{
+ static const char *const tbl[] = {
+ "Usage: ncurses [options]"
+ ,""
+ ,"Options:"
+ ," -e fmt specify format for soft-keys test (e)"
+ ," -f rip-off footer line (can repeat)"
+ ," -h rip-off header line (can repeat)"
+ ," -s msec specify nominal time for panel-demo (default: 1, to hold)"
+#ifdef TRACE
+ ," -t mask specify default trace-level (may toggle with ^T)"
+#endif
+ };
+ size_t n;
+ for (n = 0; n < sizeof(tbl)/sizeof(tbl[0]); n++)
+ fprintf(stderr, "%s\n", tbl[n]);
+ exit(EXIT_FAILURE);
+}
+
+static void
+set_terminal_modes(void)
+{
+ noraw();
+ cbreak();
+ noecho();
+ scrollok(stdscr, TRUE);
+ idlok(stdscr, TRUE);
+ keypad(stdscr, TRUE);
+}
+
+#ifdef SIGUSR1
+static RETSIGTYPE announce_sig(int sig)
+{
+ (void) fprintf(stderr, "Handled signal %d\r\n", sig);
+}
+#endif
+
+static int rip_footer(WINDOW *win, int columns)
+{
+ wbkgd(win, A_REVERSE);
+ werase(win);
+ wmove(win, 0, 0);
+ wprintw(win, "footer: %d columns", columns);
+ wnoutrefresh(win);
+ return OK;
+}
+
+static int rip_header(WINDOW *win, int columns)
+{
+ wbkgd(win, A_REVERSE);
+ werase(win);
+ wmove(win, 0, 0);
+ wprintw(win, "header: %d columns", columns);
+ wnoutrefresh(win);
+ return OK;
+}
+
+/*+-------------------------------------------------------------------------
+ main(argc,argv)
+--------------------------------------------------------------------------*/
+
+int
+main(int argc, char *argv[])
+{
+ int command, c;
+ int my_e_param = 1;
+
+#if HAVE_LOCALE_H
+ setlocale(LC_CTYPE, "");
+#endif
+
+ while ((c = getopt(argc, argv, "e:fhs:t:")) != EOF) {
+ switch (c) {
+ case 'e':
+ my_e_param = atoi(optarg);
+#ifdef NCURSES_VERSION
+ if (my_e_param > 3) /* allow extended layouts */
+ usage();
+#else
+ if (my_e_param > 1)
+ usage();
+#endif
+ break;
+ case 'f':
+ ripoffline(-1, rip_footer);
+ break;
+ case 'h':
+ ripoffline(1, rip_header);
+ break;
+#if USE_LIBPANEL
+ case 's':
+ nap_msec = atol(optarg);
+ break;
+#endif
+#ifdef TRACE
+ case 't':
+ save_trace = atoi(optarg);
+ break;
+#endif
+ default:
+ usage();
+ }
+ }
+
+ /*
+ * 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
+ trace(save_trace);
+#else
+ if (!isatty(fileno(stdin)))
+ trace(save_trace);
+#endif /* USE_LIBMENU */
+#endif /* TRACE */
+
+ /* tell it we're going to play with soft keys */
+ slk_init(my_e_param);
+
+#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);
+
+ /* tests, in general, will want these modes */
+ start_color();
+ set_terminal_modes();
+ def_prog_mode();
+
+ /*
+ * Return to terminal mode, so we're guaranteed of being able to
+ * select terminal commands even if the capabilities are wrong.
+ */
+ endwin();
+
+ (void) puts("Welcome to ncurses. Press ? for help.");
+
+ do {
+ (void) puts("This is the ncurses main menu");
+ (void) puts("a = keyboard and mouse input test");
+ (void) puts("b = character attribute test");
+ (void) puts("c = color test pattern");
+ (void) puts("d = edit RGB color values");
+ (void) puts("e = exercise soft keys");
+ (void) puts("f = display ACS characters");
+ (void) puts("g = display windows and scrolling");
+ (void) puts("i = test of flushinp()");
+ (void) puts("k = display character attributes");
+#if USE_LIBMENU
+ (void) puts("m = menu code test");
+#endif
+#if USE_LIBPANEL
+ (void) puts("o = exercise panels library");
+ (void) puts("p = exercise pad features");
+ (void) puts("q = quit");
+#endif
+#if USE_LIBFORM
+ (void) puts("r = exercise forms code");
+#endif
+ (void) puts("s = overlapping-refresh test");
+#if USE_LIBMENU && defined(TRACE)
+ (void) puts("t = set trace level");
+#endif
+ (void) puts("? = repeat this command summary");
+
+ (void) fputs("> ", stdout);
+ (void) fflush(stdout); /* necessary under SVr4 curses */
+
+ /*
+ * This used to be an 'fgets()' call. However (on Linux, at least)
+ * mixing stream I/O and 'read()' (used in the library) causes the
+ * input stream to be flushed when switching between the two.
+ */
+ command = 0;
+ for(;;) {
+ char ch;
+ if (read(fileno(stdin), &ch, 1) <= 0) {
+ if (command == 0)
+ command = 'q';
+ break;
+ } else if (command == 0 && !isspace(ch)) {
+ command = ch;
+ } else if (ch == '\n' || ch == '\r') {
+ if (command != 0)
+ break;
+ (void) fputs("> ", stdout);
+ (void) fflush(stdout);
+ }
+ }
+
+ if (do_single_test(command)) {
+ /*
+ * This may be overkill; it's 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. The commands `x' or `q' will exit.");
+ }
+ continue;
+ }
+ } while
+ (command != 'q');
+
+ ExitProgram(EXIT_SUCCESS);
+}
+
+/* ncurses.c ends here */
diff --git a/contrib/ncurses/test/ncurses_tst.hin b/contrib/ncurses/test/ncurses_tst.hin
new file mode 100644
index 000000000000..1d77cbd3fee2
--- /dev/null
+++ b/contrib/ncurses/test/ncurses_tst.hin
@@ -0,0 +1,56 @@
+/****************************************************************************
+ * Copyright (c) 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.2 1998/02/11 12:14:05 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/contrib/ncurses/test/newdemo.c b/contrib/ncurses/test/newdemo.c
new file mode 100644
index 000000000000..d47d275e35a2
--- /dev/null
+++ b/contrib/ncurses/test/newdemo.c
@@ -0,0 +1,348 @@
+/*
+ * newdemo.c - A demo program using PDCurses. The program illustrate
+ * the use of colours for text output.
+ *
+ * $Id: newdemo.c,v 1.17 1997/09/20 15:11:26 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <signal.h>
+#include <time.h>
+#include <string.h>
+
+static int SubWinTest(WINDOW *win);
+static int WaitForUser(WINDOW *win);
+static int BouncingBalls(WINDOW *win);
+static RETSIGTYPE trap(int);
+
+#define delay_output(x) napms(x)
+
+/*
+ * The Australian map
+ */
+const 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
+
+NCURSES_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",
+ ""
+};
+
+/*
+ * Main driver
+ */
+int
+main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+WINDOW *win;
+int w, x, y, i, j, k;
+char buffer[200];
+const char *message;
+int width, height;
+chtype save[80];
+chtype c;
+
+ initscr();
+ start_color();
+ cbreak();
+ signal(SIGINT, trap);
+ width = 48;
+ height = 14; /* Create a drawing window */
+ win = newwin(height, width, (LINES-height)/2, (COLS-width)/2);
+ if(win == NULL)
+ { endwin();
+ return 1;
+ }
+
+ while(1)
+ { init_pair(1,COLOR_WHITE,COLOR_BLUE);
+ wattrset(win, COLOR_PAIR(1));
+ werase(win);
+
+ init_pair(2,COLOR_RED,COLOR_RED);
+ wattrset(win, COLOR_PAIR(2));
+ box(win, ACS_VLINE, ACS_HLINE);
+ wrefresh(win);
+ /* Do ramdom output of a character */
+ wattrset(win, COLOR_PAIR(1));
+ 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';
+ init_pair(3,COLOR_CYAN,COLOR_YELLOW);
+ wattron(win, COLOR_PAIR(3));
+ }
+ }
+
+ SubWinTest(win);
+ /* Erase and draw green window */
+ init_pair(4,COLOR_YELLOW,COLOR_GREEN);
+ wbkgd(win, COLOR_PAIR(4) | A_BOLD);
+ wattrset(win, COLOR_PAIR(4) | A_BOLD);
+ werase(win);
+ wrefresh(win);
+ /* Draw RED bounding box */
+ wattrset(win, COLOR_PAIR(2));
+ box(win, ' ', ' ');
+ wrefresh(win);
+ /* Display Australia map */
+ wattrset(win, COLOR_PAIR(4) | A_BOLD);
+ i = 0;
+ while(*AusMap[i])
+ { mvwaddstr(win, i+1, 8, AusMap[i]);
+ wrefresh(win);
+ delay_output(50);
+ ++i;
+ }
+
+ init_pair(5,COLOR_BLUE,COLOR_WHITE);
+ wattrset(win, COLOR_PAIR(5) | A_BLINK);
+ mvwaddstr(win, height-2, 6, " PDCurses 2.1 for DOS, OS/2 and Unix");
+ wrefresh(win);
+
+ /* Draw running messages */
+ init_pair(6,COLOR_YELLOW,COLOR_WHITE);
+ wattrset(win, COLOR_PAIR(6));
+ message = messages[j = 0];
+ i = 1;
+ w = width-2;
+ strcpy(buffer, message);
+ while(j < NMESSAGES) {
+ while ((int)strlen(buffer) < w) {
+ strcat(buffer, " ... ");
+ strcat(buffer, messages[++j % NMESSAGES]);
+ }
+
+ if (i < w)
+ mvwaddnstr(win, height/2, w - i, buffer, i);
+ else
+ 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 */
+ init_pair(7,COLOR_RED,COLOR_GREEN);
+ wattron(win, COLOR_PAIR(7));
+ for(i=2; i < width - 4; ++i)
+ {
+ k = mvwinch(win, 4, i);
+ if (k == ERR)
+ break;
+ save[j++] = c = k;
+ c &= A_CHARTEXT;
+ mvwaddch(win, 4, i, c);
+ }
+ wrefresh(win);
+
+ /* Put a message up wait for a key */
+ i = height-2;
+ wattrset(win, COLOR_PAIR(5));
+ 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;
+ wattrset(win, COLOR_PAIR(5));
+ mvwaddstr(win, i, 5, " Type a key to continue or 'Q' to quit ");
+ wrefresh(win);
+ if(WaitForUser(win) == 1)
+ break;
+ }
+ endwin();
+ return 0;
+}
+
+/*
+ * 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)
+ return 1;
+ if((swin3 = subwin(win, sh, sw, by+5, bx+11)) == NULL)
+ return 1;
+
+ init_pair(8,COLOR_RED,COLOR_BLUE);
+ wattrset(swin1, COLOR_PAIR(8));
+ werase(swin1);
+ mvwaddstr(swin1, 0, 3, "Sub-window 1");
+ wrefresh(swin1);
+
+ init_pair(8,COLOR_CYAN,COLOR_MAGENTA);
+ wattrset(swin2, COLOR_PAIR(8));
+ werase(swin2);
+ mvwaddstr(swin2, 0, 3, "Sub-window 2");
+ wrefresh(swin2);
+
+ init_pair(8,COLOR_YELLOW,COLOR_GREEN);
+ wattrset(swin3, COLOR_PAIR(8));
+ werase(swin3);
+ mvwaddstr(swin3, 0, 3, "Sub-window 3");
+ wrefresh(swin3);
+
+ delwin(swin1);
+ delwin(swin2);
+ delwin(swin3);
+ WaitForUser(win);
+ return 0;
+}
+
+/*
+ * 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 = xd1 > 0 ? ++x1 : --x1;
+ if(x1 <= 1 || x1 >= w - 2)
+ xd1 = xd1 ? 0 : 1;
+ y1 = yd1 > 0 ? ++y1 : --y1;
+ if(y1 <= 1 || y1 >= h - 2)
+ yd1 = yd1 ? 0 : 1;
+
+ x2 = xd2 > 0 ? ++x2 : --x2;
+ if(x2 <= 1 || x2 >= w - 2)
+ xd2 = xd2 ? 0 : 1;
+ y2 = yd2 > 0 ? ++y2 : --y2;
+ if(y2 <= 1 || y2 >= h - 2)
+ yd2 = yd2 ? 0 : 1;
+
+ x3 = xd3 > 0 ? ++x3 : --x3;
+ if(x3 <= 1 || x3 >= w - 2)
+ xd3 = xd3 ? 0 : 1;
+ y3 = yd3 > 0 ? ++y3 : --y3;
+ if(y3 <= 1 || y3 >= h - 2)
+ yd3 = yd3 ? 0 : 1;
+
+ init_pair(8,COLOR_RED,COLOR_BLUE);
+ wattrset(win, COLOR_PAIR(8));
+ mvwaddch(win, y1, x1, 'O');
+ init_pair(8,COLOR_BLUE,COLOR_RED);
+ wattrset(win, COLOR_PAIR(8));
+ mvwaddch(win, y2, x2, '*');
+ init_pair(8,COLOR_YELLOW,COLOR_WHITE);
+ wattrset(win, COLOR_PAIR(8));
+ mvwaddch(win, y3, x3, '@');
+ wmove(win, 0, 0);
+ wrefresh(win);
+ delay_output(100);
+ }
+ return 0;
+}
+
+/*
+ * Wait for user
+ */
+static int WaitForUser(WINDOW *win)
+{
+ time_t t;
+ chtype key;
+
+ nodelay(win,TRUE);
+ t = time((time_t *)0);
+ while(1)
+ {
+ if ((int)(key = wgetch(win)) != ERR)
+ {
+ if (key == 'q' || key == 'Q')
+ return 1;
+ else
+ return 0;
+ }
+ if (time((time_t *)0) - t > 5)
+ return 0;
+ }
+}
+
+/*
+ * Trap interrupt
+ */
+static RETSIGTYPE trap(int sig GCC_UNUSED)
+{
+ endwin();
+ exit(EXIT_FAILURE);
+}
+
+/* End of DEMO.C */
diff --git a/contrib/ncurses/test/rain.c b/contrib/ncurses/test/rain.c
new file mode 100644
index 000000000000..4132a43826fe
--- /dev/null
+++ b/contrib/ncurses/test/rain.c
@@ -0,0 +1,131 @@
+/*
+ * $Id: rain.c,v 1.11 1997/09/18 18:36:46 tom Exp $
+ */
+#include <test.priv.h>
+
+#include <term.h> /* for tparm() */
+
+#include <signal.h>
+
+/* rain 11/3/1980 EPS/CITHEP */
+
+static float ranf(void);
+static void onsig(int sig);
+
+static int next_j(int j)
+{
+ if (j==0) j=4; else --j;
+ if (has_colors()) {
+ int z = (int)(3*ranf());
+ chtype color = COLOR_PAIR(z);
+ if (z)
+ color |= A_BOLD;
+ attrset(color);
+ }
+ return j;
+}
+
+int
+main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+int x, y, j;
+static int xpos[5], ypos[5];
+float r;
+float c;
+
+ for (j=SIGHUP;j<=SIGTERM;j++)
+ if (signal(j,SIG_IGN)!=SIG_IGN) signal(j,onsig);
+
+ initscr();
+ if (has_colors()) {
+ int bg = COLOR_BLACK;
+ start_color();
+#ifdef NCURSES_VERSION
+ if (use_default_colors() == OK)
+ bg = -1;
+#endif
+ init_pair(1, COLOR_BLUE, bg);
+ init_pair(2, COLOR_CYAN, bg);
+ }
+ nl();
+ noecho();
+ curs_set(0);
+ timeout(0);
+
+ r = (float)(LINES - 4);
+ c = (float)(COLS - 4);
+ for (j=5;--j>=0;) {
+ xpos[j]=(int)(c* ranf())+2;
+ ypos[j]=(int)(r* ranf())+2;
+ }
+
+ for (j=0;;) {
+ x=(int)(c*ranf())+2;
+ y=(int)(r*ranf())+2;
+
+ mvaddch(y,x, '.');
+
+ mvaddch(ypos[j], xpos[j], 'o');
+
+ j = next_j(j);
+ mvaddch(ypos[j], xpos[j], 'O');
+
+ j = next_j(j);
+ mvaddch( ypos[j]-1, xpos[j], '-');
+ mvaddstr(ypos[j], xpos[j]-1, "|.|");
+ mvaddch( ypos[j]+1, xpos[j], '-');
+
+ j = next_j(j);
+ mvaddch( ypos[j]-2, xpos[j], '-');
+ mvaddstr(ypos[j]-1, xpos[j]-1, "/ \\");
+ mvaddstr(ypos[j], xpos[j]-2, "| O |");
+ mvaddstr(ypos[j]+1, xpos[j]-1, "\\ /");
+ mvaddch( ypos[j]+2, xpos[j], '-');
+
+ j = next_j(j);
+ mvaddch( ypos[j]-2, xpos[j], ' ');
+ mvaddstr(ypos[j]-1, xpos[j]-1, " ");
+ mvaddstr(ypos[j], xpos[j]-2, " ");
+ mvaddstr(ypos[j]+1, xpos[j]-1, " ");
+ mvaddch( ypos[j]+2, xpos[j], ' ');
+
+ xpos[j] = x; ypos[j] = y;
+
+ switch(getch())
+ {
+ case('q'):
+ case('Q'):
+ curs_set(1);
+ endwin();
+ return(EXIT_SUCCESS);
+#ifdef KEY_RESIZE
+ case(KEY_RESIZE):
+ r = (float)(LINES - 4);
+ c = (float)(COLS - 4);
+ break;
+#endif
+ }
+ napms(50);
+ }
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+ curs_set(1);
+ endwin();
+ exit(EXIT_FAILURE);
+}
+
+static float
+ranf(void)
+{
+ float rv;
+ long r = rand();
+
+ r &= 077777;
+ rv =((float)r/32767.);
+ return rv;
+}
diff --git a/contrib/ncurses/test/tclock.c b/contrib/ncurses/test/tclock.c
new file mode 100644
index 000000000000..bccce31d1373
--- /dev/null
+++ b/contrib/ncurses/test/tclock.c
@@ -0,0 +1,184 @@
+#include "test.priv.h"
+
+#include <float.h>
+#include <math.h>
+#include <time.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,char col)
+{
+ mvaddch(y,x,(chtype)col);
+}
+
+
+/* Draw a diagonal(arbitrary) line using Bresenham's alogrithm. */
+static void
+dline(int from_x, int from_y, int x2, int y2, char ch)
+{
+ int dx,dy;
+ int ax,ay;
+ int sx,sy;
+ int x,y;
+ int d;
+
+ 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;
+ }
+ }
+}
+
+int
+main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ int i,cx,cy;
+ double mradius, hradius, mangle, hangle;
+ double sangle, sradius, hours;
+ int hdx, hdy;
+ int mdx, mdy;
+ int sdx, sdy;
+ time_t tim;
+ struct tm *t;
+ char szChar[10];
+
+ initscr();
+ noecho();
+
+ cx=39;
+ cy=12;
+ mradius=9;
+ hradius=6;
+ sradius=8;
+
+ for(i=0;i<12;i++)
+ {
+ sangle=(i+1)*(2.0*PI)/12.0;
+ sradius=10;
+ sdx = A2X(sangle, sradius);
+ sdy = A2Y(sangle, sradius);
+ sprintf(szChar,"%d",i+1);
+
+ mvaddstr((int)(cy-sdy),(int)(cx+sdx),szChar);
+ }
+
+ mvaddstr(0,0,"ASCII Clock by Howard Jones (ha.jones@ic.ac.uk),1994");
+
+ sradius=8;
+ for(;;)
+ {
+ napms(1000);
+
+ 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) * (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);
+
+ sangle = ((t->tm_sec) * (2.0 * PI)/60.0);
+ sdx = A2X(sangle, sradius);
+ sdy = A2Y(sangle, sradius);
+
+ plot(cx+sdx,cy-sdy,'O');
+ dline(cx,cy,cx+hdx,cy-hdy,'.');
+ dline(cx,cy,cx+mdx,cy-mdy,'#');
+
+ mvaddstr(23,0,ctime(&tim));
+ refresh();
+ if ((t->tm_sec % 5) == 0) beep();
+
+ plot(cx+sdx,cy-sdy,' ');
+ dline(cx,cy,cx+hdx,cy-hdy,' ');
+ dline(cx,cy,cx+mdx,cy-mdy,' ');
+
+ }
+
+ return 0;
+}
diff --git a/contrib/ncurses/test/test.priv.h b/contrib/ncurses/test/test.priv.h
new file mode 100644
index 000000000000..0ae433195e42
--- /dev/null
+++ b/contrib/ncurses/test/test.priv.h
@@ -0,0 +1,90 @@
+/****************************************************************************
+ * Copyright (c) 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> 1996 *
+ ****************************************************************************/
+/* $Id: test.priv.h,v 1.15 1998/02/11 12:14:04 tom Exp $ */
+#if HAVE_CONFIG_H
+#include <ncurses_cfg.h>
+#endif
+
+#include <stdlib.h>
+#include <sys/types.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <curses.h>
+
+#ifdef NCURSES_NOMACROS
+#include <nomacros.h>
+#endif
+
+#if HAVE_GETOPT_H
+#include <getopt.h>
+#else
+/* 'getopt()' may be prototyped in <stdlib.h>, but declaring its variables
+ * doesn't hurt.
+ */
+extern char *optarg;
+extern int optind;
+#endif /* HAVE_GETOPT_H */
+
+#ifndef GCC_NORETURN
+#define GCC_NORETURN /* nothing */
+#endif
+#ifndef GCC_UNUSED
+#define GCC_UNUSED /* nothing */
+#endif
+
+#define SIZEOF(table) (sizeof(table)/sizeof(table[0]))
+
+#if defined(NCURSES_VERSION) && HAVE_NC_ALLOC_H
+#include <nc_alloc.h>
+#endif
+
+#ifndef ExitProgram
+#define ExitProgram(code) return code
+#endif
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+/* 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
+#define NCURSES_CONST /* nothing */
+#endif
diff --git a/contrib/ncurses/test/testaddch.c b/contrib/ncurses/test/testaddch.c
new file mode 100644
index 000000000000..444da0a14beb
--- /dev/null
+++ b/contrib/ncurses/test/testaddch.c
@@ -0,0 +1,60 @@
+/*
+ * 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.3 1997/10/18 21:35:15 tom Exp $
+ */
+#include <test.priv.h>
+
+static void attr_addstr(const char *s, chtype a)
+{
+ while(*s)
+ addch(((unsigned char)(*s++))|a);
+}
+
+int
+main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+ unsigned i;
+ chtype back,set,attr;
+
+ 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 = (i&4) ? COLOR_PAIR(4) : 0;
+
+ bkgdset(back);
+ attrset(set);
+
+ attr_addstr("Test string with spaces -> <-\n",attr);
+ }
+ addch('\n');
+ for(i=0; i<8; i++)
+ {
+ back = (i&1) ? A_BOLD|'B'|COLOR_PAIR(1) : ' ';
+ set = (i&2) ? A_REVERSE|COLOR_PAIR(2) : 0;
+ attr = (i&4) ? COLOR_PAIR(4) : 0;
+
+ bkgdset(back);
+ attrset(set);
+
+ attr_addstr("Test string with spaces -> <-\n",attr);
+ }
+
+ getch();
+ endwin();
+ return EXIT_SUCCESS;
+}
diff --git a/contrib/ncurses/test/testcurs.c b/contrib/ncurses/test/testcurs.c
new file mode 100644
index 000000000000..ff776570e2e8
--- /dev/null
+++ b/contrib/ncurses/test/testcurs.c
@@ -0,0 +1,640 @@
+/*
+ *
+ * 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.19 1999/02/14 00:42:28 tom Exp $
+ */
+
+#include <test.priv.h>
+#include <ctype.h>
+
+#if defined(XCURSES)
+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 *);
+static void padTest (WINDOW *);
+static void scrollTest (WINDOW *);
+# if defined(PDCURSES) && !defined(XCURSES)
+static void resizeTest (WINDOW *);
+#endif
+
+struct commands
+{
+ NCURSES_CONST char *text;
+ void (*function)(WINDOW *);
+};
+typedef struct commands COMMAND;
+
+const COMMAND command[] =
+{
+ {"Intro Test", introTest},
+ {"Pad Test", padTest},
+# if defined(PDCURSES) && !defined(XCURSES)
+ {"Resize Test", resizeTest},
+#endif
+ {"Scroll Test", scrollTest},
+ {"Input Test", inputTest},
+ {"Output Test", outputTest}
+};
+#define MAX_OPTIONS ((sizeof(command)/sizeof(command[0])))
+
+int width, height;
+
+int
+main(
+ int argc GCC_UNUSED,
+ char *argv[] GCC_UNUSED)
+{
+WINDOW *win;
+int key,old_option=(-1),new_option=0;
+bool quit=FALSE;
+
+#ifdef PDCDEBUG
+ PDC_debug("testcurs started\n");
+#endif
+ if (!initTest (&win)) return EXIT_FAILURE;
+
+#ifdef A_COLOR
+ if (has_colors())
+ {
+ init_pair(1,COLOR_WHITE,COLOR_BLUE);
+ wbkgd(win, COLOR_PAIR(1));
+ }
+ else
+ wbkgd(win, A_REVERSE);
+#else
+ wbkgd(win, A_REVERSE);
+#endif
+
+ erase();
+ display_menu(old_option,new_option);
+ while(1)
+ {
+ noecho();
+ keypad(stdscr,TRUE);
+ raw();
+ key = getch();
+ 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: break;
+ }
+ if (quit == TRUE)
+ break;
+ }
+
+ delwin (win);
+
+ endwin();
+#ifdef XCURSES
+ XCursesExit();
+#endif
+ return EXIT_SUCCESS;
+}
+
+static
+void Continue (WINDOW *win)
+{
+ wmove(win, 10, 1);
+ wclrtoeol(win);
+ mvwaddstr(win, 10, 1, " Press any key to continue");
+ wrefresh(win);
+ raw();
+ wgetch(win);
+}
+
+static int
+initTest (WINDOW **win)
+{
+#ifdef PDCDEBUG
+ PDC_debug("initTest called\n");
+#endif
+#ifdef NCURSES_VERSION
+ 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)
+ {
+ endwin();
+ 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 OldX, OldY;
+ NCURSES_CONST char *Message = "The window will now scroll slowly";
+
+ wclear(win);
+ mvwprintw (win, height - 2, 1, Message);
+ wrefresh (win);
+ scrollok(win, TRUE);
+ for (i = 1; i <= height; i++) {
+ napms(250);
+ scroll(win);
+ wrefresh (win);
+ }
+
+ getmaxyx (win, OldY, OldX);
+ mvwprintw (win, 6, 1, "The top of the window will scroll");
+ wmove (win, 1, 1);
+ wsetscrreg (win, 0, 4);
+ box(win, ACS_VLINE, ACS_HLINE);
+ wrefresh (win);
+ for (i = 1; i <= 5; i++) {
+ napms(500);
+ scroll(win);
+ wrefresh (win);
+ }
+
+ mvwprintw (win, 3, 1, "The bottom of the window will scroll");
+ wmove (win, 8, 1);
+ wsetscrreg (win, 5, --OldY);
+ box(win, ACS_VLINE, ACS_HLINE);
+ wrefresh (win);
+ for (i = 5; i <= OldY; i++) {
+ napms (300);
+ wscrl(win,-1);
+ wrefresh (win);
+ }
+ wsetscrreg (win, 0, OldY);
+
+}
+
+static void
+inputTest (WINDOW *win)
+{
+ int w, h, bx, by, sw, sh, i, c,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, 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();
+ typeahead(-1);
+#if defined(PDCURSES)
+ mouse_set(ALL_MOUSE_EVENTS);
+#endif
+ while(1) {
+ 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(c));
+#if defined(PDCURSES)
+ if (c == KEY_MOUSE) {
+ 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
+ wrefresh(win);
+ if (c == ' ')
+ break;
+ }
+#if 0
+ nodelay(win, TRUE);
+ wgetch(win);
+ nodelay(win, FALSE);
+#endif
+#if defined(PDCURSES)
+ mouse_set(0L);
+#endif
+ refresh();
+ 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");
+ mvwaddstr(win, 6, 2, "Enter a number then a string separated by space");
+ mvwin(win, 2, 1);
+ wrefresh(win);
+ echo();
+ noraw();
+ num = 0;
+ *buffer = 0;
+ mvwscanw(win, 7, 6, "%d %s", &num,buffer);
+ mvwprintw(win, 8, 6, "String: %s Number: %d", buffer,num);
+ Continue(win);
+}
+
+static void
+outputTest (WINDOW *win)
+{
+ WINDOW *win1;
+ char Buffer [80];
+ chtype ch;
+ int by, bx;
+
+ 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 {
+ 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, 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);
+
+ mvwinsstr( win, 6, 2, "A1B2C3D4E5" );
+ Continue(win);
+
+ 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") != 0) {
+ wclear(win);
+ curs_set(2);
+ mvwaddstr(win, 1, 1, "The cursor should appear as a block (visible)");
+ Continue(win);
+ }
+
+ if (tigetstr("civis") != 0) {
+ wclear(win);
+ curs_set(0);
+ mvwaddstr(win, 1, 1, "The cursor should have disappeared (invisible)");
+ Continue(win);
+ }
+
+ if (tigetstr("cnorm") != 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);
+ 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.");
+
+ mvwaddnstr( win, 7,5, "Have a nice day!ok", 16 );
+ wrefresh(win);
+
+ 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)
+ { endwin();
+ 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
+
+static void
+padTest(WINDOW *dummy GCC_UNUSED)
+{
+WINDOW *pad, *spad;
+
+ pad = newpad(50,100);
+ wattron(pad, A_REVERSE);
+ mvwaddstr(pad, 5, 2, "This is a new pad");
+ 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);
+
+ spad = subpad(pad,12,25,6,52);
+ mvwaddstr(spad, 2, 2, "This is a new subpad");
+ box(spad,0,0);
+ 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);
+}
+
+static void
+display_menu(int old_option,int new_option)
+{
+ register size_t i;
+
+ attrset(A_NORMAL);
+ mvaddstr(3,20,"PDCurses Test Program");
+
+ for (i=0;i<MAX_OPTIONS;i++)
+ mvaddstr(5+i,25,command[i].text);
+ if (old_option != (-1))
+ mvaddstr(5+old_option,25,command[old_option].text);
+ attrset(A_REVERSE);
+ mvaddstr(5+new_option,25,command[new_option].text);
+ attrset(A_NORMAL);
+ mvaddstr(13,3,"Use Up and Down Arrows to select - Enter to run - Q to quit");
+ refresh();
+}
+
diff --git a/contrib/ncurses/test/testscanw.c b/contrib/ncurses/test/testscanw.c
new file mode 100644
index 000000000000..8420ea0fc55a
--- /dev/null
+++ b/contrib/ncurses/test/testscanw.c
@@ -0,0 +1,38 @@
+/* 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.5 1997/09/20 14:16:20 tom Exp $
+ */
+#include <test.priv.h>
+#include <ctype.h>
+
+int main(int argc, char *argv[])
+{
+ long badanswer = 1;
+ long *response = &badanswer;
+
+ initscr();
+ scrollok(stdscr, TRUE);
+ idlok(stdscr, TRUE);
+ echo();
+
+#if 0
+ trace(TRACE_UPDATE|TRACE_CALLS);
+#endif
+ while (argc > 1) {
+ if (isdigit(*argv[1]))
+ move(atoi(argv[1]), 0);
+ else if (!strcmp(argv[1], "-k"))
+ keypad(stdscr, TRUE);
+ argc--, argv++;
+ }
+
+ while (badanswer) {
+ printw("Enter a number (0 to quit):\n");
+ printw("--> ");
+ scanw("%20ld", response); /* yes, it's a pointer */
+ }
+ endwin();
+ return EXIT_SUCCESS;
+}
diff --git a/contrib/ncurses/test/tracemunch b/contrib/ncurses/test/tracemunch
new file mode 100755
index 000000000000..d6761cd04219
--- /dev/null
+++ b/contrib/ncurses/test/tracemunch
@@ -0,0 +1,98 @@
+#!/usr/bin/perl
+#
+# 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.
+#
+# ($Id: tracemunch,v 1.2 1995/10/06 15:02:37 esr Exp $)
+
+$putattr="PutAttrChar\\('(.)' = 0x.., {A_NORMAL}\\) at \\(([0-9]+), ([0-9]+)\\)";
+$waddnstr="waddnstr\\(0x([0-9a-f]+),\"([^\"]+)\",[0-9]+\\) called {A_NORMAL}";
+
+sub transaddr
+{
+ $arg = $_[0];
+
+ $arg =~ s/$curscr/curscr/ if ($curscr);
+ $arg =~ s/$newscr/newscr/ if ($newscr);
+ $arg =~ s/$stdscr/stdscr/ if ($stdscr);
+
+ return $arg;
+}
+
+while (<STDIN>)
+{
+CLASSIFY: {
+ # Transform window pointer addresses so it's easier to compare logs
+ $awaiting = "curscr" if ($_ =~ /creating curscr/);
+ $awaiting = "newscr" if ($_ =~ /creating newscr/);
+ $awaiting = "stdscr" if ($_ =~ /creating stdscr/);
+ if ($awaiting && $_ =~ /newwin: returned window is 0x([0-9a-f]+)/)
+ {
+ $curscr = "0x$1" if ($awaiting eq "curscr");
+ $newscr = "0x$1" if ($awaiting eq "newscr");
+ $stdscr = "0x$1" if ($awaiting eq "stdscr");
+ $awaiting = "";
+ }
+
+ # Compactify runs of PutAttrChar calls (TR_CHARPUT)
+ if ($_ =~ /$putattr/)
+ {
+ $putattr_chars = $1;
+ $starty = $2;
+ $startx = $3;
+ while (<STDIN>)
+ {
+ if ($_ =~ /$putattr/) {
+ $putattr_chars .= $1;
+ } else {
+ last;
+ }
+ }
+ print "RUN of PutAttrChar()s: \"$putattr_chars\" from ${starty}, ${startx}\n";
+ redo CLASSIFY;
+ }
+
+ # Compactify runs of waddnstr calls (TR_CALLS)
+ if ($_ =~ /$waddnstr/)
+ {
+ $waddnstr_chars = $2;
+ $winaddr = $1;
+ while (<STDIN>)
+ {
+ if ($_ =~ /$waddnstr/ && $1 eq $winaddr) {
+ $waddnstr_chars .= $2;
+ } else {
+ last;
+ }
+ }
+ $winaddstr = &transaddr($winaddr);
+ print "RUN of waddnstr()s: $winaddr, \"$waddnstr_chars\"\n";
+ redo CLASSIFY;
+ }
+
+ # More transformations can go here
+
+ # Repeated runs of anything
+ $anyline = &transaddr($_);
+ $repeatcount = 1;
+ while (<STDIN>) {
+ if (&transaddr($_) eq $anyline) {
+ $repeatcount++;
+ } else {
+ last;
+ }
+ }
+ if ($repeatcount > 1) {
+ print "${repeatcount} REPEATS OF $anyline";
+ } else {
+ print $anyline
+ }
+ redo CLASSIFY if $_;
+
+ } # :CLASSIFY
+}
+
+# tracemunch ends here
diff --git a/contrib/ncurses/test/view.c b/contrib/ncurses/test/view.c
new file mode 100644
index 000000000000..8381dc8898c4
--- /dev/null
+++ b/contrib/ncurses/test/view.c
@@ -0,0 +1,362 @@
+/*
+ * 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()'.
+ *
+ * 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.27 1998/08/22 18:33:41 tom Exp $
+ */
+
+#include <test.priv.h>
+
+#include <string.h>
+#include <ctype.h>
+#include <signal.h>
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#else
+# include <sgtty.h>
+#endif
+
+#if !defined(sun) || !HAVE_TERMIOS_H
+# if HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+# endif
+#endif
+
+/* This is needed to compile 'struct winsize' */
+#if NEED_PTEM_H
+#include <sys/stream.h>
+#include <sys/ptem.h>
+#endif
+
+static RETSIGTYPE finish(int sig) GCC_NORETURN;
+static void show_all(void);
+
+#if defined(SIGWINCH) && defined(TIOCGWINSZ) && defined(NCURSES_VERSION)
+#define CAN_RESIZE 1
+#else
+#define CAN_RESIZE 0
+#endif
+
+#if CAN_RESIZE
+static RETSIGTYPE adjust(int sig);
+static int interrupted;
+#endif
+
+static int waiting;
+static int shift;
+
+static char *fname;
+static char **lines;
+static char **lptr;
+
+#if !HAVE_STRDUP
+#define strdup my_strdup
+static char *strdup (char *s)
+{
+ char *p;
+
+ p = malloc(strlen(s)+1);
+ if (p)
+ strcpy(p,s);
+ return(p);
+}
+#endif /* not HAVE_STRDUP */
+
+static void usage(void)
+{
+ static const char *msg[] = {
+ "Usage: view [options] file"
+ ,""
+ ,"Options:"
+ ," -n NUM specify maximum number of lines (default 1000)"
+#if defined(KEY_RESIZE)
+ ," -r use experimental KEY_RESIZE rather than our own handler"
+#endif
+#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]);
+ exit (EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[])
+{
+int MAXLINES = 1000;
+FILE *fp;
+char buf[BUFSIZ];
+int i;
+char **olptr;
+int done = FALSE;
+int length = 0;
+#if CAN_RESIZE
+bool use_resize = TRUE;
+#endif
+
+ while ((i = getopt(argc, argv, "n:rtT:")) != EOF) {
+ switch (i) {
+ case 'n':
+ if ((MAXLINES = atoi(optarg)) < 1)
+ usage();
+ break;
+#if CAN_RESIZE
+ case 'r':
+ use_resize = FALSE;
+ break;
+#endif
+#ifdef TRACE
+ case 'T':
+ trace(atoi(optarg));
+ break;
+ case 't':
+ trace(TRACE_CALLS);
+ break;
+#endif
+ default:
+ usage();
+ }
+ }
+ if (optind + 1 != argc)
+ usage();
+
+ if ((lines = (char **)calloc(MAXLINES+2, sizeof(*lines))) == 0)
+ usage();
+
+ fname = argv[optind];
+ if ((fp = fopen(fname, "r")) == 0) {
+ perror(fname);
+ return EXIT_FAILURE;
+ }
+
+ (void) signal(SIGINT, finish); /* arrange interrupts to terminate */
+#if CAN_RESIZE
+ if (use_resize)
+ (void) signal(SIGWINCH, adjust); /* arrange interrupts to resize */
+#endif
+
+ /* slurp the file */
+ for (lptr = &lines[0]; (lptr - lines) < MAXLINES; lptr++) {
+ char temp[BUFSIZ], *s, *d;
+ int col;
+
+ if (fgets(buf, sizeof(buf), fp) == 0)
+ break;
+
+ /* convert tabs so that shift will work properly */
+ for (s = buf, d = temp, col = 0; (*d = *s) != '\0'; s++) {
+ if (*d == '\n') {
+ *d = '\0';
+ break;
+ } else if (*d == '\t') {
+ col = (col | 7) + 1;
+ while ((d-temp) != col)
+ *d++ = ' ';
+ } else if (isprint(*d)) {
+ col++;
+ d++;
+ } else {
+ sprintf(d, "\\%03o", *s & 0xff);
+ d += strlen(d);
+ col = (d - temp);
+ }
+ }
+ *lptr = strdup(temp);
+ }
+ (void) fclose(fp);
+ length = lptr - lines;
+
+ (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) noecho(); /* don't echo input */
+ idlok(stdscr, TRUE); /* allow use of insert/delete line */
+
+ lptr = lines;
+ while (!done) {
+ int n, c;
+ bool got_number;
+
+ show_all();
+
+ got_number = FALSE;
+ n = 0;
+ for (;;) {
+#if CAN_RESIZE
+ if (interrupted)
+ adjust(0);
+#endif
+ waiting = TRUE;
+ c = getch();
+ waiting = FALSE;
+ if ((c < 127) && isdigit(c)) {
+ if (!got_number) {
+ mvprintw(0,0, "Count: ");
+ clrtoeol();
+ }
+ addch(c);
+ n = 10 * n + (c - '0');
+ got_number = TRUE;
+ }
+ else
+ break;
+ }
+ if (!got_number && n == 0)
+ n = 1;
+
+ switch(c) {
+ case KEY_DOWN:
+ case 'n':
+ olptr = lptr;
+ for (i = 0; i < n; i++)
+ if ((lptr - lines) < (length - LINES + 1))
+ lptr++;
+ else
+ break;
+ wscrl(stdscr, lptr - olptr);
+ break;
+
+ case KEY_UP:
+ case 'p':
+ olptr = lptr;
+ for (i = 0; i < n; i++)
+ if (lptr > lines)
+ lptr--;
+ else
+ break;
+ wscrl(stdscr, lptr - olptr);
+ break;
+
+ case 'h':
+ case KEY_HOME:
+ lptr = lines;
+ break;
+
+ case 'e':
+ case KEY_END:
+ if (length > LINES)
+ lptr = lines + length - LINES + 1;
+ else
+ lptr = lines;
+ break;
+
+ case 'r':
+ case KEY_RIGHT:
+ shift++;
+ break;
+
+ case 'l':
+ case KEY_LEFT:
+ if (shift)
+ shift--;
+ else
+ beep();
+ break;
+
+ case 'q':
+ done = TRUE;
+ break;
+
+#ifdef KEY_RESIZE
+ case KEY_RESIZE: /* ignore this; ncurses will repaint */
+ break;
+#endif
+#if CAN_RESIZE
+ case ERR:
+ break;
+#endif
+ default:
+ beep();
+ }
+ }
+
+ finish(0); /* we're done */
+}
+
+static RETSIGTYPE finish(int sig)
+{
+ endwin();
+ exit(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+
+#if CAN_RESIZE
+/*
+ * This uses functions that are "unsafe", but it seems to work on SunOS and
+ * Linux. The 'wrefresh(curscr)' is needed to force the refresh to start from
+ * the top of the screen -- some xterms mangle the bitmap while resizing.
+ */
+static RETSIGTYPE adjust(int sig)
+{
+ if (waiting || sig == 0) {
+ struct winsize size;
+
+ if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) {
+ resizeterm(size.ws_row, size.ws_col);
+ wrefresh(curscr); /* Linux needs this */
+ show_all();
+ }
+ interrupted = FALSE;
+ } else {
+ interrupted = TRUE;
+ }
+ (void) signal(SIGWINCH, adjust); /* some systems need this */
+}
+#endif /* CAN_RESIZE */
+
+static void show_all(void)
+{
+ int i;
+ char temp[BUFSIZ];
+ char *s;
+
+#if CAN_RESIZE
+ sprintf(temp, "(%3dx%3d) col %d ", LINES, COLS, shift);
+ i = strlen(temp);
+ sprintf(temp+i, "view %.*s", (int)(sizeof(temp)-7-i), fname);
+#else
+ sprintf(temp, "view %.*s", (int)sizeof(temp)-7, fname);
+#endif
+ move(0,0);
+ printw("%.*s", COLS, temp);
+ clrtoeol();
+
+ scrollok(stdscr, FALSE); /* prevent screen from moving */
+ for (i = 1; i < LINES; i++) {
+ move(i, 0);
+ if ((s = lptr[i-1]) != 0 && (int)strlen(s) > shift)
+ printw("%3ld:%.*s", (long) (lptr+i-lines), COLS-4, s + shift);
+ else
+ printw("%3ld:", (long) (lptr+i-lines));
+ clrtoeol();
+ }
+ setscrreg(1, LINES-1);
+ scrollok(stdscr, TRUE);
+ refresh();
+}
+
+/* view.c ends here */
+
diff --git a/contrib/ncurses/test/worm.c b/contrib/ncurses/test/worm.c
new file mode 100644
index 000000000000..a02113b370f0
--- /dev/null
+++ b/contrib/ncurses/test/worm.c
@@ -0,0 +1,372 @@
+/*
+
+ @@@ @@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@
+ @@@ @@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@
+ @@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@
+ @@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
+ @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
+ @@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@
+ @@@@@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@
+ @@@@ @@@@ @@@@@@@@@@@@ @@@ @@@ @@@ @@@
+ @@ @@ @@@@@@@@@@ @@@ @@@ @@@ @@@
+
+ 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! :-)
+
+Options:
+ -f fill screen with copies of 'WORM' at start.
+ -l <n> set worm length
+ -n <n> set number of worms
+ -t make worms leave droppings
+ -T <start> <end> set trace interval
+ -S set single-stepping during trace interval
+ -N suppress cursor-movement optimization
+
+ 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.23 1999/03/06 22:52:04 tom Exp $
+*/
+
+#include <test.priv.h>
+
+#include <term.h> /* for tparm() */
+
+#include <signal.h>
+
+#define cursor(col,row) move(row,col)
+
+short *ref[128];
+static chtype flavor[]={
+ 'O' , '*', '#', '$', '%', '0', '@',
+};
+#define MAXWORMS (sizeof(flavor)/sizeof(chtype))
+static const short xinc[]={
+ 1, 1, 1, 0, -1, -1, -1, 0
+}, yinc[]={
+ -1, 0, 1, 1, 1, 0, -1, -1
+};
+static struct worm {
+ int orientation, head;
+ short *xpos, *ypos;
+} worm[40];
+
+static const char *field;
+static int length=16, number=3;
+static chtype trail=' ';
+
+#ifdef TRACE
+int generation, trace_start, trace_end, singlestep;
+#endif /* TRACE */
+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 } }
+};
+
+static RETSIGTYPE onsig(int sig);
+static float ranf(void);
+
+int
+main(int argc, char *argv[])
+{
+int x, y;
+int n;
+struct worm *w;
+const struct options *op;
+int h;
+short *ip;
+int last, bottom;
+
+ for (x=1;x<argc;x++) {
+ register char *p;
+ p=argv[x];
+ if (*p=='-') p++;
+ switch (*p) {
+ case 'f':
+ field="WORM";
+ break;
+ case 'l':
+ if (++x==argc) goto usage;
+ if ((length=atoi(argv[x]))<2||length>1024) {
+ fprintf(stderr,"%s: Invalid length\n",*argv);
+ return EXIT_FAILURE;
+ }
+ break;
+ case 'n':
+ if (++x==argc) goto usage;
+ if ((number=atoi(argv[x]))<1||number>40) {
+ fprintf(stderr,"%s: Invalid number of worms\n",*argv);
+ return EXIT_FAILURE;
+ }
+ break;
+ case 't':
+ trail='.';
+ break;
+#ifdef TRACE
+ case 'S':
+ singlestep = TRUE;
+ break;
+ case 'T':
+ trace_start = atoi(argv[++x]);
+ trace_end = atoi(argv[++x]);
+ break;
+ case 'N':
+ _nc_optimize_enable ^= OPTIMIZE_ALL; /* declared by ncurses */
+ break;
+#endif /* TRACE */
+ default:
+ usage:
+ fprintf(stderr, "usage: %s [-field] [-length #] [-number #] [-trail]\n",*argv);
+ return EXIT_FAILURE;
+ }
+ }
+
+ signal(SIGINT, onsig);
+ initscr();
+ noecho();
+ cbreak();
+ nonl();
+
+ curs_set(0);
+
+ bottom = LINES-1;
+ last = COLS-1;
+
+#ifdef A_COLOR
+ if (has_colors())
+ {
+ int bg = COLOR_BLACK;
+ start_color();
+#ifdef NCURSES_VERSION
+ if (use_default_colors() == OK)
+ bg = -1;
+#endif
+
+ init_pair(COLOR_GREEN, COLOR_GREEN, bg);
+ init_pair(COLOR_RED, COLOR_RED, bg);
+ init_pair(COLOR_CYAN, COLOR_CYAN, bg);
+ init_pair(COLOR_WHITE, COLOR_WHITE, bg);
+ init_pair(COLOR_MAGENTA, COLOR_MAGENTA, bg);
+ init_pair(COLOR_BLUE, COLOR_BLUE, bg);
+ init_pair(COLOR_YELLOW, COLOR_YELLOW, bg);
+
+ flavor[0] |= COLOR_PAIR(COLOR_GREEN) | A_BOLD;
+ flavor[1] |= COLOR_PAIR(COLOR_RED) | A_BOLD;
+ flavor[2] |= COLOR_PAIR(COLOR_CYAN) | A_BOLD;
+ flavor[3] |= COLOR_PAIR(COLOR_WHITE) | A_BOLD;
+ flavor[4] |= COLOR_PAIR(COLOR_MAGENTA) | A_BOLD;
+ flavor[5] |= COLOR_PAIR(COLOR_BLUE) | A_BOLD;
+ flavor[6] |= COLOR_PAIR(COLOR_YELLOW) | A_BOLD;
+ }
+#endif /* A_COLOR */
+
+ ip=(short *)malloc(LINES*COLS*sizeof (short));
+
+ for (n=0;n<LINES;) {
+ ref[n++]=ip; ip+=COLS;
+ }
+ for (ip=ref[0],n=LINES*COLS;--n>=0;) *ip++=0;
+
+#ifdef BADCORNER
+ /* if addressing the lower right corner doesn't work in your curses */
+ ref[bottom][last]=1;
+#endif /* BADCORNER */
+
+ for (n=number, w= &worm[0];--n>=0;w++) {
+ w->orientation=w->head=0;
+ if (!(ip=(short *)malloc((length+1)*sizeof (short)))) {
+ fprintf(stderr,"%s: out of memory\n",*argv);
+ return EXIT_FAILURE;
+ }
+ w->xpos=ip;
+ for (x=length;--x>=0;) *ip++ = -1;
+ if (!(ip=(short *)malloc((length+1)*sizeof (short)))) {
+ fprintf(stderr,"%s: out of memory\n",*argv);
+ return EXIT_FAILURE;
+ }
+ w->ypos=ip;
+ for (y=length;--y>=0;) *ip++ = -1;
+ }
+ if (field) {
+ register const char *p;
+ p=field;
+ for (y=bottom;--y>=0;) {
+ for (x=COLS;--x>=0;) {
+ addch((chtype)(*p++));
+ if (!*p) p=field;
+ }
+ addch('\n');
+ }
+ }
+ napms(10);
+ refresh();
+
+ for (;;) {
+#ifdef TRACE
+ if (trace_start || trace_end) {
+ if (generation == trace_start) {
+ trace(TRACE_CALLS);
+ getch();
+ } else if (generation == trace_end) {
+ trace(0);
+ getch();
+ }
+
+ if (singlestep && generation > trace_start && generation < trace_end)
+ getch();
+
+ generation++;
+ }
+#endif /* TRACE */
+
+ for (n=0,w= &worm[0];n<number;n++,w++) {
+ if ((x=w->xpos[h=w->head])<0) {
+ cursor(x=w->xpos[h]=0,y=w->ypos[h]=bottom);
+ addch(flavor[n % MAXWORMS]);
+ ref[y][x]++;
+ }
+ else y=w->ypos[h];
+ if (++h==length) h=0;
+ if (w->xpos[w->head=h]>=0) {
+ register int x1, y1;
+ x1=w->xpos[h]; y1=w->ypos[h];
+ if (--ref[y1][x1]==0) {
+ cursor(x1,y1); addch(trail);
+ }
+ }
+ op= &(x==0 ? (y==0 ? upleft : (y==bottom ? lowleft : left)) :
+ (x==last ? (y==0 ? upright : (y==bottom ? lowright : right)) :
+ (y==0 ? upper : (y==bottom ? lower : normal))))[w->orientation];
+ switch (op->nopts) {
+ case 0:
+ refresh();
+ curs_set(1);
+ endwin();
+ return EXIT_SUCCESS;
+ case 1:
+ w->orientation=op->opts[0];
+ break;
+ default:
+ w->orientation=op->opts[(int)(ranf()*(float)op->nopts)];
+ }
+ cursor(x+=xinc[w->orientation], y+=yinc[w->orientation]);
+
+ if (y < 0 ) y = 0;
+ addch(flavor[n % MAXWORMS]);
+ ref[w->ypos[h]=y][w->xpos[h]=x]++;
+ }
+ napms(10);
+ refresh();
+ }
+}
+
+static RETSIGTYPE
+onsig(int sig GCC_UNUSED)
+{
+ standend();
+ refresh();
+ curs_set(1);
+ endwin();
+ exit(EXIT_FAILURE);
+}
+
+static float
+ranf(void)
+{
+float rv;
+long r = rand();
+
+ r &= 077777;
+ rv =((float)r/32767.);
+ return rv;
+}
diff --git a/contrib/ncurses/test/xmas.c b/contrib/ncurses/test/xmas.c
new file mode 100644
index 000000000000..3923c771d97a
--- /dev/null
+++ b/contrib/ncurses/test/xmas.c
@@ -0,0 +1,1148 @@
+/******************************************************************************/
+/* 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.12 1998/01/18 01:13:47 tom Exp $
+ */
+#include <test.priv.h>
+
+#include <signal.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, *treescrn2,*treescrn3, *treescrn4,*treescrn5, *treescrn6,
+ *treescrn7, *treescrn8,
+ *dotdeer0,
+ *stardeer0,
+ *lildeer0, *lildeer1, *lildeer2, *lildeer3,
+ *middeer0, *middeer1, *middeer2, *middeer3,
+ *bigdeer0, *bigdeer1, *bigdeer2, *bigdeer3, *bigdeer4,
+ *lookdeer0, *lookdeer1, *lookdeer2, *lookdeer3, *lookdeer4,
+ *w_holiday,
+ *w_del_msg;
+
+static int boxit(void);
+static int seas(void);
+static int greet(void);
+static int fromwho(void);
+static int tree(void);
+static int balls(void);
+static int star(void);
+static int strng1(void);
+static int strng2(void);
+static int strng3(void);
+static int strng4(void);
+static int strng5(void);
+static int reindeer(void);
+static int blinkit(void);
+static RETSIGTYPE done(int sig) GCC_NORETURN ;
+
+static void
+set_color(WINDOW *win, chtype color)
+{
+ if (has_colors()) {
+ static bool *pairs;
+ int n = (color + 1);
+ if (pairs == 0)
+ pairs = (bool *)calloc(COLORS+1, sizeof(bool));
+ if (!pairs[n]) {
+ init_pair(n, color, my_bg);
+ pairs[n] = TRUE;
+ }
+ wattroff(win, A_COLOR);
+ wattron(win, COLOR_PAIR(n));
+ }
+}
+
+static void
+unset_color(WINDOW *win)
+{
+ if (has_colors())
+ wattrset(win, COLOR_PAIR(0));
+}
+
+static void
+look_out(int msecs)
+{
+ napms(msecs);
+ if (getch() != ERR) {
+ beep();
+ done(0);
+ }
+}
+
+int main(
+ int argc GCC_UNUSED,
+ char **argv GCC_UNUSED)
+{
+int loopy;
+
+ initscr();
+ noecho();
+ nonl();
+ refresh();
+ signal(SIGINT,done);
+ signal(SIGTERM,done);
+#if !defined DOS && !defined OS2
+ signal(SIGHUP,done);
+ signal(SIGQUIT,done);
+#endif
+ if (has_colors()) {
+ start_color();
+#ifdef NCURSES_VERSION
+ if (use_default_colors() == OK)
+ my_bg = -1;
+#endif
+ }
+ curs_set(0);
+
+ treescrn = newwin(16,27,3,53);
+ treescrn2 = newwin(16,27,3,53);
+ treescrn3 = newwin(16,27,3,53);
+ treescrn4 = newwin(16,27,3,53);
+ treescrn5 = newwin(16,27,3,53);
+ treescrn6 = newwin(16,27,3,53);
+ treescrn7 = newwin(16,27,3,53);
+ treescrn8 = newwin(16,27,3,53);
+
+ dotdeer0 = newwin(3,71,0,8);
+
+ stardeer0 = newwin(4,56,0,8);
+
+ lildeer0 = newwin(7,53,0,8);
+ lildeer1 = newwin(2,4,0,0);
+ lildeer2 = newwin(2,4,0,0);
+ lildeer3 = newwin(2,4,0,0);
+
+ middeer0 = newwin(15,42,0,8);
+ middeer1 = newwin(3,7,0,0);
+ middeer2 = newwin(3,7,0,0);
+ middeer3 = newwin(3,7,0,0);
+
+ bigdeer0 = newwin(10,23,0,0);
+ bigdeer1 = newwin(10,23,0,0);
+ bigdeer2 = newwin(10,23,0,0);
+ bigdeer3 = newwin(10,23,0,0);
+ bigdeer4 = newwin(10,23,0,0);
+
+ lookdeer0 = newwin(10,25,0,0);
+ lookdeer1 = newwin(10,25,0,0);
+ lookdeer2 = newwin(10,25,0,0);
+ lookdeer3 = newwin(10,25,0,0);
+ lookdeer4 = newwin(10,25,0,0);
+
+ w_holiday = newwin(1,26,3,27);
+
+ w_del_msg = newwin(1,19,23,60);
+
+ 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);
+ for (;;) {
+ 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*/
+ wstandout(treescrn4);
+ mvwaddch(treescrn4, 0, 12, '*');
+ 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*/
+ wstandout(treescrn6);
+ mvwaddch(treescrn6, 0, 12, '*');
+ 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();
+ }
+
+#ifdef NOLOOP
+ done(0);
+#endif
+ }
+ /*NOTREACHED*/
+}
+
+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)
+{
+ wattrset(treescrn2, A_BOLD | A_BLINK);
+ set_color(treescrn2, COLOR_YELLOW);
+
+ mvwaddch(treescrn2, 0, 12, (chtype)'*');
+ wstandend(treescrn2);
+
+ unset_color(treescrn2);
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+static int strng1(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)
+{
+ 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)
+{
+ 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)
+{
+ 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)
+{
+ 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);
+ wrefresh(treescrn8);
+ wrefresh(w_del_msg);
+ break;
+ case 1:
+ overlay(treescrn4, treescrn8);
+ wrefresh(treescrn8);
+ wrefresh(w_del_msg);
+ break;
+ case 2:
+ overlay(treescrn5, treescrn8);
+ wrefresh(treescrn8);
+ wrefresh(w_del_msg);
+ break;
+ case 3:
+ overlay(treescrn6, treescrn8);
+ wrefresh(treescrn8);
+ wrefresh(w_del_msg);
+ break;
+ case 4:
+ overlay(treescrn7, treescrn8);
+ wrefresh(treescrn8);
+ wrefresh(w_del_msg);
+ break;
+ }
+ touchwin(treescrn8);
+
+ /*ALL ON***************************************************/
+
+ overlay(treescrn, treescrn8);
+ wrefresh(treescrn8);
+ wrefresh(w_del_msg);
+
+ ++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--) {
+ if(x_pos < 62) {
+ y_pos = 1;
+ }
+ 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 RETSIGTYPE done(int sig GCC_UNUSED)
+{
+ signal(SIGINT,done);
+ signal(SIGTERM,done);
+#if !defined DOS && !defined OS2
+ signal(SIGHUP,done);
+ signal(SIGQUIT,done);
+#endif
+ move(LINES-1,0);
+ refresh();
+ endwin();
+ curs_set(1);
+ exit(EXIT_SUCCESS);
+}