summaryrefslogtreecommitdiffstats
path: root/lib/libncurses
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libncurses')
-rw-r--r--lib/libncurses/COPYRIGHT.NEW19
-rw-r--r--lib/libncurses/COPYRIGHT.OLD5
-rw-r--r--lib/libncurses/MKkeyname.awk30
-rw-r--r--lib/libncurses/MKkeys.awk1
-rw-r--r--lib/libncurses/Makefile209
-rw-r--r--lib/libncurses/README42
-rw-r--r--lib/libncurses/TESTS/Makefile35
-rw-r--r--lib/libncurses/TESTS/README21
-rw-r--r--lib/libncurses/TESTS/battle.c705
-rw-r--r--lib/libncurses/TESTS/copy.c39
-rw-r--r--lib/libncurses/TESTS/corner.c16
-rw-r--r--lib/libncurses/TESTS/ensor.c52
-rw-r--r--lib/libncurses/TESTS/firework.c113
-rw-r--r--lib/libncurses/TESTS/getch.c29
-rw-r--r--lib/libncurses/TESTS/hanoi.c275
-rw-r--r--lib/libncurses/TESTS/knight.c320
-rw-r--r--lib/libncurses/TESTS/ncurses.c1121
-rw-r--r--lib/libncurses/TESTS/newdemo.c350
-rw-r--r--lib/libncurses/TESTS/over.c120
-rw-r--r--lib/libncurses/TESTS/rain.c96
-rw-r--r--lib/libncurses/TESTS/scroll.c30
-rw-r--r--lib/libncurses/TESTS/scroll2.c91
-rw-r--r--lib/libncurses/TESTS/scroll3.c51
-rw-r--r--lib/libncurses/TESTS/test.c27
-rw-r--r--lib/libncurses/TESTS/testcurs.c532
-rw-r--r--lib/libncurses/TESTS/worm.c268
-rw-r--r--lib/libncurses/TESTS/xmas.c1192
-rw-r--r--lib/libncurses/copyright.c19
-rw-r--r--lib/libncurses/curs_addch.3115
-rw-r--r--lib/libncurses/curs_addchst.349
-rw-r--r--lib/libncurses/curs_addstr.344
-rw-r--r--lib/libncurses/curs_attr.384
-rw-r--r--lib/libncurses/curs_beep.329
-rw-r--r--lib/libncurses/curs_bkgd.350
-rw-r--r--lib/libncurses/curs_border.367
-rw-r--r--lib/libncurses/curs_clear.353
-rw-r--r--lib/libncurses/curs_color.3138
-rw-r--r--lib/libncurses/curs_delch.334
-rw-r--r--lib/libncurses/curs_delln.350
-rw-r--r--lib/libncurses/curs_getch.3188
-rw-r--r--lib/libncurses/curs_getstr.353
-rw-r--r--lib/libncurses/curs_getyx.341
-rw-r--r--lib/libncurses/curs_inch.340
-rw-r--r--lib/libncurses/curs_inchstr.345
-rw-r--r--lib/libncurses/curs_initscr.384
-rw-r--r--lib/libncurses/curs_inopts.3170
-rw-r--r--lib/libncurses/curs_insch.336
-rw-r--r--lib/libncurses/curs_insstr.359
-rw-r--r--lib/libncurses/curs_instr.344
-rw-r--r--lib/libncurses/curs_kernel.3115
-rw-r--r--lib/libncurses/curs_move.328
-rw-r--r--lib/libncurses/curs_outopts.3115
-rw-r--r--lib/libncurses/curs_overlay.341
-rw-r--r--lib/libncurses/curs_pad.374
-rw-r--r--lib/libncurses/curs_printw.341
-rw-r--r--lib/libncurses/curs_refresh.369
-rw-r--r--lib/libncurses/curs_scanw.343
-rw-r--r--lib/libncurses/curs_scr_dmp.358
-rw-r--r--lib/libncurses/curs_scroll.337
-rw-r--r--lib/libncurses/curs_slk.385
-rw-r--r--lib/libncurses/curs_termatt.374
-rw-r--r--lib/libncurses/curs_termin.3191
-rw-r--r--lib/libncurses/curs_touch.357
-rw-r--r--lib/libncurses/curs_util.381
-rw-r--r--lib/libncurses/curs_window.3123
-rw-r--r--lib/libncurses/curses.h544
-rw-r--r--lib/libncurses/curses.priv.h135
-rw-r--r--lib/libncurses/doc/color.doc71
-rw-r--r--lib/libncurses/doc/manual.doc1361
-rw-r--r--lib/libncurses/keys.list149
-rw-r--r--lib/libncurses/lib_acs.c98
-rw-r--r--lib/libncurses/lib_addch.c127
-rw-r--r--lib/libncurses/lib_addstr.c56
-rw-r--r--lib/libncurses/lib_beep.c56
-rw-r--r--lib/libncurses/lib_bkgd.c49
-rw-r--r--lib/libncurses/lib_box.c131
-rw-r--r--lib/libncurses/lib_clear.c24
-rw-r--r--lib/libncurses/lib_clrbot.c53
-rw-r--r--lib/libncurses/lib_clreol.c48
-rw-r--r--lib/libncurses/lib_color.c107
-rw-r--r--lib/libncurses/lib_delch.c39
-rw-r--r--lib/libncurses/lib_delwin.c36
-rw-r--r--lib/libncurses/lib_doupdate.c593
-rw-r--r--lib/libncurses/lib_endwin.c50
-rw-r--r--lib/libncurses/lib_erase.c48
-rw-r--r--lib/libncurses/lib_getch.c224
-rw-r--r--lib/libncurses/lib_getstr.c113
-rw-r--r--lib/libncurses/lib_inchstr.c29
-rw-r--r--lib/libncurses/lib_initscr.c40
-rw-r--r--lib/libncurses/lib_insch.c36
-rw-r--r--lib/libncurses/lib_insdel.c49
-rw-r--r--lib/libncurses/lib_insstr.c21
-rw-r--r--lib/libncurses/lib_instr.c54
-rw-r--r--lib/libncurses/lib_kernel.c318
-rw-r--r--lib/libncurses/lib_longname.c35
-rw-r--r--lib/libncurses/lib_move.c30
-rw-r--r--lib/libncurses/lib_mvcur.c700
-rw-r--r--lib/libncurses/lib_mvwin.c29
-rw-r--r--lib/libncurses/lib_newterm.c176
-rw-r--r--lib/libncurses/lib_newwin.c185
-rw-r--r--lib/libncurses/lib_options.c252
-rw-r--r--lib/libncurses/lib_overlay.c110
-rw-r--r--lib/libncurses/lib_pad.c143
-rw-r--r--lib/libncurses/lib_printw.c75
-rw-r--r--lib/libncurses/lib_raw.c201
-rw-r--r--lib/libncurses/lib_refresh.c91
-rw-r--r--lib/libncurses/lib_scanw.c66
-rw-r--r--lib/libncurses/lib_screen.c58
-rw-r--r--lib/libncurses/lib_scroll.c201
-rw-r--r--lib/libncurses/lib_scrreg.c32
-rw-r--r--lib/libncurses/lib_set_term.c33
-rw-r--r--lib/libncurses/lib_slk.c255
-rw-r--r--lib/libncurses/lib_touch.c48
-rw-r--r--lib/libncurses/lib_trace.c179
-rw-r--r--lib/libncurses/lib_tstp.c78
-rw-r--r--lib/libncurses/lib_twait.c75
-rw-r--r--lib/libncurses/lib_unctrl.c43
-rw-r--r--lib/libncurses/lib_vidattr.c199
-rw-r--r--lib/libncurses/lib_window.c85
-rw-r--r--lib/libncurses/ncurses.3427
-rw-r--r--lib/libncurses/term.5153
-rw-r--r--lib/libncurses/terminfo.h2
-rw-r--r--lib/libncurses/unctrl.h52
123 files changed, 17185 insertions, 0 deletions
diff --git a/lib/libncurses/COPYRIGHT.NEW b/lib/libncurses/COPYRIGHT.NEW
new file mode 100644
index 0000000..7c5d22b
--- /dev/null
+++ b/lib/libncurses/COPYRIGHT.NEW
@@ -0,0 +1,19 @@
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992, 1993, 1994 *
+* by Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, not removed *
+* from header files, and is reproduced in any documentation *
+* accompanying it or the applications linked with it. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+
+
diff --git a/lib/libncurses/COPYRIGHT.OLD b/lib/libncurses/COPYRIGHT.OLD
new file mode 100644
index 0000000..4049db0
--- /dev/null
+++ b/lib/libncurses/COPYRIGHT.OLD
@@ -0,0 +1,5 @@
+
+Pavel Curtis has given up his copyright to the public domain. This mean
+his ORIGINAL sources are in the public domain, not this current release.
+This current release IS copyrighted, see COPYRIGHT.NEW.
+
diff --git a/lib/libncurses/MKkeyname.awk b/lib/libncurses/MKkeyname.awk
new file mode 100644
index 0000000..12613ce
--- /dev/null
+++ b/lib/libncurses/MKkeyname.awk
@@ -0,0 +1,30 @@
+
+BEGIN {
+ print ""
+ print "#include <stdlib.h>"
+ print "#include \"curses.h\""
+ print ""
+ print "struct kn {"
+ print "\tchar *name;"
+ print "\tint code;"
+ print "};"
+ print ""
+ print "struct kn key_names[] = {"
+}
+
+{printf "\t{\"%s\", %s,},\n", $1, $2;}
+
+END {
+ print "};"
+ print ""
+ print "char *keyname(int c)"
+ print "{"
+ print "int i, size = sizeof(key_names)/sizeof(struct kn);"
+ print ""
+ print "\tfor (i = 0; i < size; i++) {"
+ print "\t\tif (key_names[i].code == c) return key_names[i].name;"
+ print "\t}"
+ print "\treturn NULL;"
+ print "}"
+ print ""
+}
diff --git a/lib/libncurses/MKkeys.awk b/lib/libncurses/MKkeys.awk
new file mode 100644
index 0000000..669c455
--- /dev/null
+++ b/lib/libncurses/MKkeys.awk
@@ -0,0 +1 @@
+{printf "\tadd_to_try(%s, %s);\n", $1, $2;}
diff --git a/lib/libncurses/Makefile b/lib/libncurses/Makefile
new file mode 100644
index 0000000..b62856a
--- /dev/null
+++ b/lib/libncurses/Makefile
@@ -0,0 +1,209 @@
+# Makefile for ncurses
+# $Id: Makefile,v 1.23 1997/08/25 07:41:13 ache Exp $
+
+LIB= ncurses
+SHLIB_MAJOR= 3
+SHLIB_MINOR= 1
+SRCS= lib_kernel.c lib_pad.c lib_bkgd.c \
+ lib_unctrl.c lib_raw.c lib_vidattr.c lib_trace.c lib_beep.c \
+ lib_doupdate.c lib_refresh.c lib_initscr.c lib_newwin.c lib_addch.c \
+ lib_addstr.c lib_scroll.c lib_clreol.c lib_touch.c lib_mvcur.c lib_keyname.c\
+ lib_delwin.c lib_endwin.c lib_clrbot.c lib_move.c lib_printw.c \
+ lib_scanw.c lib_erase.c lib_getch.c lib_options.c lib_acs.c lib_slk.c\
+ lib_box.c lib_clear.c lib_delch.c lib_insch.c lib_instr.c \
+ lib_getstr.c lib_mvwin.c lib_longname.c lib_tstp.c \
+ lib_newterm.c lib_set_term.c lib_overlay.c lib_scrreg.c lib_color.c \
+ lib_insstr.c lib_insdel.c lib_twait.c lib_window.c copyright.c
+
+CFLAGS+= -I. -I${.CURDIR} -Wall -DMYTINFO #-DTRACE
+DPADD= ${LIBMYTINFO}
+LDADD= -lmytinfo
+
+CLEANFILES+= lib_keyname.c keys.tries
+
+beforedepend: keys.tries
+
+beforeinstall:
+ ${INSTALL} -C -m 444 -o $(BINOWN) -g $(BINGRP) ${.CURDIR}/unctrl.h \
+ ${DESTDIR}/usr/include
+ ${INSTALL} -C -m 444 -o $(BINOWN) -g $(BINGRP) ${.CURDIR}/curses.h \
+ ${DESTDIR}/usr/include/ncurses.h
+
+keys.tries: ${.CURDIR}/keys.list ${.CURDIR}/MKkeys.awk
+ awk -f ${.CURDIR}/MKkeys.awk ${.CURDIR}/keys.list > keys.tries
+
+# in case you don't run make depend
+lib_options.o lib_options.so lib_options.po: keys.tries
+
+lib_keyname.c: ${.CURDIR}/keys.list ${.CURDIR}/MKkeyname.awk
+ awk -f ${.CURDIR}/MKkeyname.awk ${.CURDIR}/keys.list > lib_keyname.c
+
+MAN3 = curs_addch.3 \
+ curs_addchst.3 \
+ curs_addstr.3 \
+ curs_attr.3 \
+ curs_beep.3 \
+ curs_bkgd.3 \
+ curs_border.3 \
+ curs_clear.3 \
+ curs_color.3 \
+ curs_delch.3 \
+ curs_delln.3 \
+ curs_getch.3 \
+ curs_getstr.3 \
+ curs_getyx.3 \
+ curs_inch.3 \
+ curs_inchstr.3 \
+ curs_initscr.3 \
+ curs_inopts.3 \
+ curs_insch.3 \
+ curs_insstr.3 \
+ curs_instr.3 \
+ curs_kernel.3 \
+ curs_move.3 \
+ curs_outopts.3 \
+ curs_overlay.3 \
+ curs_pad.3 \
+ curs_printw.3 \
+ curs_refresh.3 \
+ curs_scanw.3 \
+ curs_scr_dmp.3 \
+ curs_scroll.3 \
+ curs_slk.3 \
+ curs_termatt.3 \
+ curs_termin.3 \
+ curs_touch.3 \
+ curs_util.3 \
+ curs_window.3 \
+ ncurses.3
+
+MAN5 = term.5
+
+MLINKS+=curs_addch.3 addch.3 curs_addch.3 waddch.3 curs_addch.3 echochar.3 \
+ curs_addch.3 wechochar.3 curs_addch.3 mvaddch.3 \
+ curs_addch.3 mvwaddch.3
+MLINKS+=curs_addchst.3 addchstr.3 curs_addchst.3 addchnstr.3 \
+ curs_addchst.3 waddchstr.3 curs_addchst.3 waddchnstr.3 \
+ curs_addchst.3 mvaddchstr.3 curs_addchst.3 mvaddchnstr.3 \
+ curs_addchst.3 mvwaddchstr.3 curs_addchst.3 mvwaddchnstr.3
+MLINKS+=curs_addstr.3 addstr.3 curs_addstr.3 addnstr.3 \
+ curs_addstr.3 waddstr.3 curs_addstr.3 waddnstr.3 \
+ curs_addstr.3 mvaddstr.3 curs_addstr.3 mvaddnstr.3 \
+ curs_addstr.3 mvwaddstr.3 curs_addstr.3 mvwaddnstr.3
+MLINKS+=curs_attr.3 attroff.3 curs_attr.3 wattroff.3 \
+ curs_attr.3 attron.3 curs_attr.3 wattron.3 \
+ curs_attr.3 attrset.3 curs_attr.3 wattrset.3 \
+ curs_attr.3 standend.3 curs_attr.3 wstandend.3 \
+ curs_attr.3 standout.3 curs_attr.3 wstandout.3
+MLINKS+=curs_beep.3 beep.3 curs_beep.3 flash.3
+MLINKS+=curs_bkgd.3 bkgdset.3 curs_bkgd.3 wbkgdset.3 \
+ curs_bkgd.3 bkgd.3 curs_bkgd.3 wbkgd.3
+MLINKS+=curs_border.3 border.3 curs_border.3 wborder.3 curs_border.3 box.3 \
+ curs_border.3 hline.3 curs_border.3 whline.3 \
+ curs_border.3 vline.3 curs_border.3 wvline.3
+MLINKS+=curs_clear.3 erase.3 curs_clear.3 werase.3 curs_clear.3 clear.3 \
+ curs_clear.3 wclear.3 curs_clear.3 clrtobot.3 \
+ curs_clear.3 wclrtobot.3 curs_clear.3 clrtoeol.3 \
+ curs_clear.3 wclrtoeol.3
+MLINKS+=curs_color.3 start_color.3 curs_color.3 init_pair.3 \
+ curs_color.3 init_color.3 curs_color.3 has_colors.3 \
+ curs_color.3 can_change_color.3 curs_color.3 color_content.3 \
+ curs_color.3 pair_content.3
+MLINKS+=curs_delch.3 delch.3 curs_delch.3 wdelch.3 curs_delch.3 mvdelch.3 \
+ curs_delch.3 mvwdelch.3
+MLINKS+=curs_delln.3 deleteln.3 curs_delln.3 wdeleteln.3 \
+ curs_delln.3 insdelln.3 curs_delln.3 winsdelln.3 \
+ curs_delln.3 insertln.3 curs_delln.3 winsertln.3
+MLINKS+=curs_getch.3 getch.3 curs_getch.3 wgetch.3 curs_getch.3 mvgetch.3 \
+ curs_getch.3 mvwgetch.3 curs_getch.3 ungetch.3
+MLINKS+=curs_getstr.3 getstr.3 curs_getstr.3 wgetstr.3 \
+ curs_getstr.3 mvgetstr.3 curs_getstr.3 mvwgetstr.3 \
+ curs_getstr.3 wgetnstr.3
+MLINKS+=curs_getyx.3 getyx.3 curs_getyx.3 pgetparyx.3 curs_getyx.3 getbegyx.3 \
+ curs_getyx.3 getmaxyx.3
+MLINKS+=curs_inch.3 inch.3 curs_inch.3 winch.3 curs_inch.3 mvinch.3 \
+ curs_inch.3 mvwinch.3
+MLINKS+=curs_inchstr.3 inchstr.3 curs_inchstr.3 inchnstr.3 \
+ curs_inchstr.3 winchstr.3 curs_inchstr.3 winchnstr.3 \
+ curs_inchstr.3 mvinchstr.3 curs_inchstr.3 mvinchnstr.3 \
+ curs_inchstr.3 mvwinchstr.3 curs_inchstr.3 mvwinchnstr.3
+MLINKS+=curs_initscr.3 initscr.3 curs_initscr.3 newterm.3 \
+ curs_initscr.3 endwin.3 curs_initscr.3 isendwin.3 \
+ curs_initscr.3 set_term.3 curs_initscr.3 delscreen.3
+MLINKS+=curs_inopts.3 cbreak.3 curs_inopts.3 nocbreak.3 curs_inopts.3 echo.3 \
+ curs_inopts.3 noecho.3 curs_inopts.3 halfdelay.3 \
+ curs_inopts.3 intrflush.3 curs_inopts.3 keypad.3 curs_inopts.3 meta.3 \
+ curs_inopts.3 nodelay.3 curs_inopts.3 notimeout.3 curs_inopts.3 raw.3 \
+ curs_inopts.3 noraw.3 curs_inopts.3 noqiflush.3 \
+ curs_inopts.3 qiflush.3 curs_inopts.3 timeout.3 \
+ curs_inopts.3 wtimeout.3 curs_inopts.3 typeahead.3
+MLINKS+=curs_insch.3 insch.3 curs_insch.3 winsch.3 curs_insch.3 mvinsch.3 \
+ curs_insch.3 mvwinsch.3
+MLINKS+=curs_insstr.3 insstr.3 curs_insstr.3 insnstr.3 \
+ curs_insstr.3 winsstr.3 curs_insstr.3 winsnstr.3 \
+ curs_insstr.3 mvinsstr.3 curs_insstr.3 mvinsnstr.3 \
+ curs_insstr.3 mvwinsstr.3 curs_insstr.3 mvwinsnstr.3
+MLINKS+=curs_instr.3 instr.3 curs_instr.3 innstr.3 curs_instr.3 winstr.3 \
+ curs_instr.3 winnstr.3 curs_instr.3 mvinstr.3 curs_instr.3 mvinnstr.3 \
+ curs_instr.3 mvwinstr.3 curs_instr.3 mvwinnstr.3
+MLINKS+=curs_kernel.3 def_prog_mode.3 curs_kernel.3 def_shell_mode.3 \
+ curs_kernel.3 reset_prog_mode.3 curs_kernel.3 reset_shell_mode.3 \
+ curs_kernel.3 resetty.3 curs_kernel.3 savetty.3 \
+ curs_kernel.3 getsyx.3 curs_kernel.3 setsyx.3 \
+ curs_kernel.3 ripoffline.3 curs_kernel.3 curs_set.3 \
+ curs_kernel.3 napms.3
+MLINKS+=curs_move.3 move.3 curs_move.3 wmove.3
+MLINKS+=curs_outopts.3 clearok.3 curs_outopts.3 idlok.3 \
+ curs_outopts.3 idcok.3 curs_outopts.3 immedok.3 \
+ curs_outopts.3 leaveok.3 curs_outopts.3 setscrreg.3 \
+ curs_outopts.3 wsetscrreg.3 curs_outopts.3 scrollok.3 \
+ curs_outopts.3 nl.3 curs_outopts.3 nonl.3
+MLINKS+=curs_overlay.3 overlay.3 curs_overlay.3 overwrite.3 \
+ curs_overlay.3 copywin.3
+MLINKS+=curs_pad.3 newpad.3 curs_pad.3 subpad.3 curs_pad.3 prefresh.3 \
+ curs_pad.3 pnoutrefresh.3 curs_pad.3 pechochar.3
+MLINKS+=curs_printw.3 printw.3 curs_printw.3 wprintw.3 \
+ curs_printw.3 mvprintw.3 curs_printw.3 mvwprintw.3 \
+ curs_printw.3 vwprintw.3
+MLINKS+=curs_refresh.3 refresh.3 curs_refresh.3 wrefresh.3 \
+ curs_refresh.3 wnoutrefresh.3 curs_refresh.3 doupdate.3 \
+ curs_refresh.3 redrawwin.3 curs_refresh.3 wredrawln.3
+MLINKS+=curs_scanw.3 scanw.3 curs_scanw.3 wscanw.3 curs_scanw.3 mvscanw.3 \
+ curs_scanw.3 mvwscanw.3 curs_scanw.3 vwscanw.3
+MLINKS+=curs_scr_dmp.3 scr_dump.3 curs_scr_dmp.3 scr_restore.3 \
+ curs_scr_dmp.3 scr_init.3 curs_scr_dmp.3 scr_set.3
+MLINKS+=curs_scroll.3 scroll.3 curs_scroll.3 scrl.3 curs_scroll.3 wscrl.3
+MLINKS+=curs_slk.3 slk_init.3 curs_slk.3 slk_set.3 curs_slk.3 slk_refresh.3 \
+ curs_slk.3 slk_noutrefresh.3 curs_slk.3 slk_label.3 \
+ curs_slk.3 slk_clear.3 curs_slk.3 slk_restore.3 \
+ curs_slk.3 slk_touch.3 curs_slk.3 slk_attron.3 \
+ curs_slk.3 slk_attrset.3 curs_slk.3 slk_attroff.3
+MLINKS+=curs_termatt.3 baudrate.3 curs_termatt.3 erasechar.3 \
+ curs_termatt.3 has_ic.3 curs_termatt.3 has_il.3 \
+ curs_termatt.3 killchar.3 curs_termatt.3 longname.3 \
+ curs_termatt.3 termattrs.3 curs_termatt.3 termname.3
+
+# XXX name clash with termcap(3)
+# MLINKS+= curs_termin.3 tparm.3
+MLINKS+=curs_termin.3 setupterm.3 curs_termin.3 setterm.3 \
+ curs_termin.3 set_curterm.3 curs_termin.3 del_curterm.3 \
+ curs_termin.3 restartterm.3 \
+ curs_termin.3 putp.3 curs_termin.3 vidputs.3 \
+ curs_termin.3 vidattr.3 curs_termin.3 mvcur.3 \
+ curs_termin.3 tigetflag.3 curs_termin.3 tigetnum.3 \
+ curs_termin.3 tigetstr.3
+MLINKS+=curs_touch.3 touchwin.3 curs_touch.3 touchline.3 \
+ curs_touch.3 untouchwin.3 curs_touch.3 wtouchln.3 \
+ curs_touch.3 is_linetouched.3 curs_touch.3 is_wintouched.3
+MLINKS+=curs_util.3 unctrl.3 curs_util.3 keyname.3 \
+ curs_util.3 filter.3 curs_util.3 use_env.3 \
+ curs_util.3 putwin.3 curs_util.3 getwin.3 \
+ curs_util.3 delay_output.3 curs_util.3 flushinp.3
+MLINKS+=curs_window.3 newwin.3 curs_window.3 delwin.3 \
+ curs_window.3 mvwin.3 curs_window.3 subwin.3 \
+ curs_window.3 derwin.3 curs_window.3 mvderwin.3 \
+ curs_window.3 dupwin.3 curs_window.3 wsyncup.3 \
+ curs_window.3 syncok.3 curs_window.3 wcursyncup.3 \
+ curs_window.3 wsyncdown.3
+
+.include <bsd.lib.mk>
diff --git a/lib/libncurses/README b/lib/libncurses/README
new file mode 100644
index 0000000..d1f93bb
--- /dev/null
+++ b/lib/libncurses/README
@@ -0,0 +1,42 @@
+NCURSES 1.8.6 - July 24, 1994
+-----------------------------
+This file is intended to help people interested in working
+on fixing ncurses, enhancing it, or porting it to other
+platforms.
+
+PORTABILITY:
+The file matrix is an attempt at centralizing all portability
+information. The top line lists the different options, down
+the leftside are the operating systems supported. If an option
+is not needed then it should have an entry of NONE. Note the
+use of ':' to terminate each field. If somebody knows awk better
+than me, get in touch.
+
+OS: name of operating system
+ISPOSIX: -DNONPOSIX if <unistd.h> is missing
+POSIX: -DSTRICTPOSIX if _POSIX_SOURCE turns off non-POSIX features.
+ -DSVR4_ACTION if like svr4 you need _POSIX_SOURCE to have sigaction
+TERMINAL: -DNOTERMIOS if you don't have <termios.h> but have <sgtty.h>
+HEADERS: -DBRAINDEAD if system headers don't declare external variables
+TABS: -DBSDTABS if you don't have TABS3 but have OXTABS
+OPT: -DOPT_MVCUR if you want mvcur() to cost its actions or you have a
+ terminal that doesn't have direct cursor addressing.
+SRCDIR: the directory where the terminfo database lives
+CC: ANSI C compiler
+FLAGS: standard compiler flags
+EXTRA: extra flags needed by individual systems
+ Sun: -DSUNIOCTL <sys/ioctl.h> conflicts with <termios.h>
+ HP-UX: -D_HPUX_SOURCE so that we get POSIX and XOPEN features.
+ SVR4: -DBROKEN_TIOCGETWINSZ guess what?
+ AIX: -DSYS_SELECT if you need <sys/select.h>
+BASE: The directory under which headers and libraries will
+ be installed.
+INSTALL: The name of an install program similar to BSD's (ie. understands
+ -m, -g, -o, etc.) GNU install works.
+
+The awk script in script.src reads matrix and generates all the Config.*
+files.
+
+There are several problems with strict POSIX systems so extra flags
+or #define's maybe needed.
+
diff --git a/lib/libncurses/TESTS/Makefile b/lib/libncurses/TESTS/Makefile
new file mode 100644
index 0000000..64dc0e3
--- /dev/null
+++ b/lib/libncurses/TESTS/Makefile
@@ -0,0 +1,35 @@
+TESTS = test corner ensor getch ncurses hanoi knight rain worm \
+ over scroll2 battle newdemo scroll3 xmas copy firework testcurs \
+ scroll
+
+CLEANFILES += $(TESTS)
+
+LIBS += -lncurses -lmytinfo
+
+all: $(TESTS)
+
+$(TESTS):
+ $(CC) $(CFLAGS) $(LDFLAGS) ${.CURDIR}/$@.c -o $@ $(LIBS)
+
+test: test.c
+corner: corner.c
+ensor: ensor.c
+getch: getch.c
+ncurses: ncurses.c
+hanoi: hanoi.c
+knight: knight.c
+rain: rain.c
+worm: worm.c
+over: over.c
+scroll2: scroll2.c
+battle: battle.c
+newdemo: newdemo.c
+scroll3: scroll3.c
+xmas: xmas.c
+copy: copy.c
+firework: firework.c
+testcurs: testcurs.c
+scroll: scroll.c
+
+.include <bsd.prog.mk>
+
diff --git a/lib/libncurses/TESTS/README b/lib/libncurses/TESTS/README
new file mode 100644
index 0000000..279c6d8
--- /dev/null
+++ b/lib/libncurses/TESTS/README
@@ -0,0 +1,21 @@
+The programs in this directory are designed to test your newest toy :-)
+Check the sources for any further details.
+
+asc.c - tests the line drawing functions
+attr.c - display attributes available on the terminal
+bs.c - the game of battleship
+battle.c - older version of battleship with different interface
+caps.c - output a list of all capabilites to stderr (redirect to a file
+ or it will screw up the terminal)
+copy.c - test overlay
+gdc.c - Great Digital Clock, gives an example of usng color
+getch.c - tests ketpad() and getch()
+hanoi.c - the game of hanoi, also an example of using color
+knight.c - the game of Knight's Tour
+rain.c - rain drops are falling on my head..
+scroll.c - test scrolling region
+slk.c - test soft labels
+worm.c - worms run all over your screen
+firework.c - multi-colored fireworks
+newdemo.c - a demo from the PDCurses people
+testcurs.c - a test from the PDCurses people
diff --git a/lib/libncurses/TESTS/battle.c b/lib/libncurses/TESTS/battle.c
new file mode 100644
index 0000000..5b5a961
--- /dev/null
+++ b/lib/libncurses/TESTS/battle.c
@@ -0,0 +1,705 @@
+/*
+ * battle.c - original author: Bruce Holloway
+ * mods by: Chuck A DeGaul
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <time.h>
+#include <signal.h>
+#include <ncurses.h>
+
+#define OTHER 1-turn
+
+char numbers[] = " 0 1 2 3 4 5 6 7 8 9";
+
+char carrier[] = "Aircraft Carrier";
+char battle[] = "Battleship";
+char sub[] = "Submarine";
+char destroy[] = "Destroyer";
+char ptboat[] = "PT Boat";
+
+char name[40];
+char dftname[] = "Stranger";
+
+struct _ships {
+ char *name;
+ char symbol;
+ char length;
+ char start; /* Coordinates - 0,0=0; 10,10=100. */
+ char dir; /* Direction - 0 = right; 1 = down. */
+ char hits; /* How many times has this ship been hit? (-1==sunk) */
+};
+
+struct _ships plyship[] = {
+ { carrier,'A',5,0,0,0 },
+ { battle,'B',4,0,0,0 },
+ { destroy,'D',3,0,0,0 },
+ { sub,'S',3,0,0,0 },
+ { ptboat,'P',2,0,0,0 },
+};
+
+struct _ships cpuship[] = {
+ { carrier,'A',5,0,0,0 },
+ { battle,'B',4,0,0,0 },
+ { destroy,'D',3,0,0,0 },
+ { sub,'S',3,0,0,0 },
+ { ptboat,'P',2,0,0,0 },
+};
+
+char hits[2][100], board[2][100]; /* "Hits" board, and main board. */
+
+int srchstep;
+int cpuhits;
+int cstart, cdir;
+int plywon=0, cpuwon=0; /* How many games has each won? */
+int turn; /* 0=player, 1=computer */
+int huntoffs; /* Offset on search strategy */
+
+int salvo, blitz, ask, seemiss; /* options */
+
+void intro(void);
+void initgame(void);
+int rnd(int);
+void plyplace(struct _ships *);
+int getdir(void);
+void placeship(struct _ships *, int, int);
+int checkplace(struct _ships *, int, int);
+void error(char *);
+void prompt(void);
+char getcoord(void);
+void cpuplace(struct _ships *);
+int awinna(void);
+int plyturn(void);
+int hitship(int);
+int cputurn(void);
+int playagain(void);
+void uninitgame();
+int sgetc(char *);
+int do_options(int, char *[]);
+int scount(int);
+
+int
+main(int argc, char **argv)
+{
+ do_options(argc, argv);
+
+ intro();
+ do {
+ initgame();
+ while(awinna() == -1) {
+ if (!blitz) {
+ if (!salvo) {
+ if (turn)
+ cputurn();
+ else plyturn();
+ } else {
+ register int i;
+
+ i = scount(turn);
+ while (i--) {
+ if (turn)
+ if (cputurn())
+ if (awinna() != -1)
+ i = 0;
+ else
+ if(plyturn())
+ if (awinna() != -1)
+ i = 0;
+ }
+ }
+ } else {
+ while((turn) ? cputurn() : plyturn());
+ }
+ turn = OTHER;
+ }
+ } while(playagain());
+ uninitgame();
+ exit(0);
+}
+
+#define PR addstr
+
+void
+intro()
+{
+char *tmpname;
+
+ srand(time(0L)); /* Kick the random number generator */
+
+ signal(SIGINT,uninitgame);
+ if(signal(SIGQUIT,SIG_IGN) != SIG_IGN) signal(SIGQUIT,uninitgame);
+#if 1
+ /* for some bizzare reason, getlogin or cuserid cause havoc with the terminal */
+ if ((tmpname = getlogin()) != NULL) {
+ strcpy(name, tmpname);
+ } else
+#endif
+ strcpy(name,dftname);
+ name[0] = toupper(name[0]);
+
+ initscr();
+ savetty();
+ nonl();
+ cbreak();
+ noecho();
+ clear();
+ mvaddstr(4,29,"Welcome to Battleship!");
+ move(8,0);
+PR(" \\\n");
+PR(" \\ \\ \\\n");
+PR(" \\ \\ \\ \\ \\_____________\n");
+PR(" \\ \\ \\_____________ \\ \\/ |\n");
+PR(" \\ \\/ \\ \\/ |\n");
+PR(" \\/ \\_____/ |__\n");
+PR(" ________________/ |\n");
+PR(" \\ S.S. Penguin |\n");
+PR(" \\ /\n");
+PR(" \\___________________________________________________/\n");
+ mvaddstr(20,27,"Hit any key to continue..."); refresh();
+ getch();
+}
+
+void
+initgame()
+{
+int i;
+
+ clear();
+ mvaddstr(0,35,"BATTLESHIP");
+ mvaddstr(4,12,"Main Board");
+ mvaddstr(6,0,numbers);
+ move(7,0);
+ for(i=0; i<10; ++i){
+ printw("%c . . . . . . . . . . %c\n",i+'A',i+'A');
+ }
+ mvaddstr(17,0,numbers);
+ mvaddstr(4,55,"Hit/Miss Board");
+ mvaddstr(6,45,numbers);
+ for(i=0; i<10; ++i){
+ mvprintw(7+i,45,"%c . . . . . . . . . . %c",i+'A',i+'A');
+ }
+ mvaddstr(17,45,numbers);
+ for(turn=0; turn<2; ++turn)
+ for(i=0; i<100; ++i){
+ hits[turn][i] = board[turn][i] = 0;
+ }
+ for(turn=0; turn<2; ++turn){
+ for(i=0; i<5; ++i)
+ if (!turn)
+ plyplace(&plyship[i]);
+ else
+ cpuplace(&cpuship[i]);
+ }
+ turn = rnd(2);
+ cstart = cdir = -1;
+ cpuhits = 0;
+ srchstep = 3;
+ huntoffs = rnd(srchstep);
+}
+
+int
+rnd(int n)
+{
+ return(((rand() & 0x7FFF) % n));
+}
+
+void
+plyplace(ss)
+struct _ships *ss;
+{
+int c, d;
+
+ do {
+ prompt();
+ printw("Place your %s (ex.%c%d) ? ",ss->name,rnd(10)+'A',rnd(10));
+ c = getcoord();
+ d = getdir();
+ } while(!checkplace(ss,c,d));
+ placeship(ss,c,d);
+}
+
+int
+getdir()
+{
+
+ prompt();
+ addstr("What direction (0=right, 1=down) ? ");
+ return(sgetc("01")-'0');
+}
+
+void
+placeship(ss,c,d)
+struct _ships *ss;
+int c, d;
+{
+int x, y, l, i;
+
+ for(l=0; l<ss->length; ++l){
+ i = c + l * ((d) ? 10 : 1);
+ board[turn][i] = ss->symbol;
+ x = (i % 10) * 3 + 3;
+ y = (i / 10) + 7;
+ if(!turn) mvaddch(y,x,ss->symbol);
+ }
+ ss->start = c;
+ ss->dir = d;
+ ss->hits = 0;
+}
+
+int
+checkplace(ss,c,d)
+struct _ships *ss;
+int c, d;
+{
+int x, y, l;
+
+ x = c%10; y = c/10;
+ if(((x+ss->length) > 10 && !d) || ((y+ss->length) > 10 && d==1)){
+ if(!turn)
+ 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(0);
+ }
+ for(l=0; l<ss->length; ++l){
+ x = c + l * ((d) ? 10 : 1);
+ if(board[turn][x]){
+ if(!turn)
+ 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(0);
+ }
+ }
+ return(1);
+}
+
+void
+error(s)
+char *s;
+{
+ prompt();
+ beep();
+ printw("%s -- hit any key to continue --",s);
+ refresh();
+ getch();
+}
+
+void
+prompt(){
+ move(22,0);
+ clrtoeol();
+}
+
+char
+getcoord()
+{
+int ch, x, y;
+
+redo:
+ y = sgetc("ABCDEFGHIJ");
+ do {
+ ch = getch();
+ if (ch == 0x7F || ch == 8) {
+ addstr("\b \b");
+ refresh();
+ goto redo;
+ }
+ } while(ch < '0' || ch > '9');
+ addch(x = ch);
+ refresh();
+ return((y-'A')*10+x-'0');
+}
+
+void
+cpuplace(ss)
+struct _ships *ss;
+{
+int c, d;
+
+ do{
+ c = rnd(100);
+ d = rnd(2);
+ } while(!checkplace(ss,c,d));
+ placeship(ss,c,d);
+}
+
+int
+awinna()
+{
+int i, j;
+struct _ships *ss;
+
+ for (i = 0; i < 2; ++i) {
+ ss = (i) ? cpuship : plyship;
+ for(j=0; j<5; ++j, ++ss)
+ if(ss->length != ss->hits)
+ break;
+ if(j == 5) return(OTHER);
+ }
+ return(-1);
+}
+
+int
+plyturn()
+{
+int c, res;
+char *m;
+
+ prompt();
+ addstr("Where do you want to shoot? ");
+ c = getcoord();
+ if(!(res = hits[turn][c])){
+ hits[turn][c] = res = (board[OTHER][c]) ? 'H' : 'M';
+ mvaddch(7+c/10,48+3*(c%10),(res=='H') ? 'H' : 'o');
+ if(c = hitship(c)){
+ prompt();
+ switch(rnd(3)){
+ case 0:
+ m = "You sank my %s!";
+ break;
+ case 1:
+ m = "I have this sinking feeling about my %s....";
+ break;
+ case 2:
+ m = "Have some mercy for my %s!";
+ break;
+ }
+ move(23,0);
+ clrtoeol();
+ beep();
+ printw(m,cpuship[c-1].name); refresh();
+ return(awinna() == -1);
+ }
+ }
+ prompt();
+ move(23,0); clrtoeol();
+ printw("You %s.",(res=='M')?"missed":"scored a hit"); refresh();
+ return(res == 'H');
+}
+
+int
+hitship(c)
+int c;
+{
+struct _ships *ss;
+int sym, i, j;
+
+ ss = (turn) ? plyship : cpuship;
+ if (!(sym = board[OTHER][c])) return(0);
+ for (i = 0; i < 5; ++i, ++ss)
+ if (ss->symbol == sym) {
+ j = ss->hits;
+ ++j;
+ ss->hits = j;
+ if (j == ss->length)
+ return(i+1);
+ return(0);
+ }
+}
+
+int
+cputurn()
+{
+int c, res, x, y, i, d;
+
+redo:
+ if (cstart == -1){
+ if (cpuhits){
+ for(i=0, c=rnd(100); i<100; ++i, c = (c+1) % 100)
+ if(hits[turn][c] == 'H')
+ break;
+ if(i != 100){
+ cstart = c;
+ cdir = -1;
+ goto fndir;
+ }
+ }
+ do {
+ i = 0;
+ do{
+ while(hits[turn][c=rnd(100)]);
+ x = c % 10; y = c / 10;
+ if(++i == 1000) break;
+ } while(((x+huntoffs) % srchstep) != (y % srchstep));
+ if(i == 1000) --srchstep;
+ } while(i == 1000);
+ }
+ else if(cdir == -1){
+fndir: for(i=0, d=rnd(4); i++ < 4; d = (d+1) % 4){
+ x = cstart%10; y = cstart/10;
+ switch(d){
+ case 0: ++x; break;
+ case 1: ++y; break;
+ case 2: --x; break;
+ case 3: --y; break;
+ }
+ if(x<0 || x>9 || y<0 || y>9) continue;
+ if(hits[turn][c=y*10+x]) continue;
+ cdir = -2;
+ break;
+ }
+ if(i == 4){
+ cstart = -1;
+ goto redo;
+ }
+ }
+ else{
+ x = cstart%10; y = cstart/10;
+ switch(cdir){
+ case 0: ++x; break;
+ case 1: ++y; break;
+ case 2: --x; break;
+ case 3: --y; break;
+ }
+ if(x<0 || x>9 || y<0 || y>9 || hits[turn][y*10+x]){
+ cdir = (cdir+2) % 4;
+ for(;;){
+ switch(cdir){
+ case 0: ++x; break;
+ case 1: ++y; break;
+ case 2: --x; break;
+ case 3: --y; break;
+ }
+ if(x<0 || x>9 || y<0 || y>9){ cstart = -1;
+ goto redo;
+ }
+ if(!hits[turn][y*10+x]) break;
+ }
+ }
+ c = y*10 + x;
+ }
+
+ if (!ask) {
+ res = (board[OTHER][c]) ? 'H' : 'M';
+ move(21,0); clrtoeol();
+ printw("I shoot at %c%d. I %s!",c/10+'A',c%10,(res=='H')?"hit":"miss");
+ } else {
+ for(;;){
+ prompt();
+ printw("I shoot at %c%d. Do I (H)it or (M)iss? ",c/10+'A',c%10);
+ res = sgetc("HM");
+ if((res=='H' && !board[OTHER][c]) || (res=='M' && board[OTHER][c])){
+ error("You lie!");
+ continue;
+ }
+ break;
+ }
+ addch(res);
+ }
+ hits[turn][c] = res;
+ if(res == 'H') {
+ ++cpuhits;
+ if(cstart == -1) cdir = -1;
+ cstart = c;
+ if(cdir == -2) cdir = d;
+ mvaddch(7+(c/10),3+3*(c%10),'*');
+ if (blitz && !ask) {
+ refresh();
+ sleep(1);
+ }
+ }
+ else {
+ if (seemiss) {
+ mvaddch(7+(c/10),3+3*(c%10),' ');
+ } else {
+ if(cdir == -2) cdir = -1;
+ }
+ }
+ if(c=hitship(c)){
+ cstart = -1;
+ cpuhits -= plyship[c-1].length;
+ x = plyship[c-1].start;
+ d = plyship[c-1].dir;
+ y = plyship[c-1].length;
+ for(i=0; i<y; ++i){
+ hits[turn][x] = '*';
+ x += (d) ? 10 : 1;
+ }
+ }
+ if (salvo && !ask) {
+ refresh();
+ sleep(1);
+ }
+ if(awinna() != -1) return(0);
+ return(res == 'H');
+}
+
+int
+playagain()
+{
+int i, x, y, dx, dy, j;
+
+ for(i=0; i<5; ++i){
+ x = cpuship[i].start; y = x/10+7; x = (x % 10) * 3 + 48;
+ dx = (cpuship[i].dir) ? 0 : 3;
+ dy = (cpuship[i].dir) ? 1 : 0;
+ for(j=0; j < cpuship[i].length; ++j){
+ mvaddch(y,x,cpuship[i].symbol);
+ x += dx; y += dy;
+ }
+ }
+
+ if(awinna()) ++cpuwon; else ++plywon;
+ i = 18 + strlen(name);
+ if(plywon >= 10) ++i;
+ if(cpuwon >= 10) ++i;
+ mvprintw(2,(80-i)/2,"%s: %d Computer: %d",name,plywon,cpuwon);
+
+ prompt();
+ printw((awinna()) ? "Want to be humiliated again, %s? "
+ : "Going to give me a chance for revenge, %s? ",name);
+ return(sgetc("YN") == 'Y');
+}
+
+void
+uninitgame(int sig)
+{
+ refresh();
+ endwin();
+ exit(0);
+}
+
+int
+sgetc(s)
+char *s;
+{
+char *s1;
+int ch;
+
+ refresh();
+ for (;;) {
+ ch = toupper(getch());
+ for (s1 = s; *s1 && ch != *s1; ++s1);
+ if (*s1) {
+ addch(ch);
+ refresh();
+ return(ch);
+ }
+ }
+}
+
+/*
+ * I should use getopts() from libc.a, but I'm leary that other UNIX
+ * systems might not have it, although I'd love to use it.
+ */
+
+int
+do_options(c,op)
+int c;
+char *op[];
+{
+register int i;
+
+ if (c > 1) {
+ for (i=1; i<c; i++) {
+ switch(op[i][0]) {
+ default:
+ case '?':
+ fprintf(stderr, "Usage: battle [ -s | -b ] [ -a ] [ -m ]\n");
+ fprintf(stderr, "\tWhere the options are:\n");
+ fprintf(stderr, "\t-s : play a salvo game (mutex with -b)\n");
+ fprintf(stderr, "\t-b : play a blitz game (mutex with -s)\n");
+ fprintf(stderr, "\t-a : computer asks you for hit/miss\n");
+ fprintf(stderr, "\t-m : computer misses are displayed\n");
+ exit(1);
+ break;
+ case '-':
+ switch(op[i][1]) {
+ case 'b':
+ blitz = 1;
+ if (salvo == 1) {
+ fprintf(stderr,
+ "Bad Arg: -b and -s are mutually exclusive\n");
+ exit(1);
+ }
+ break;
+ case 's':
+ salvo = 1;
+ if (blitz == 1) {
+ fprintf(stderr,
+ "Bad Arg: -s and -b are mutually exclusive\n");
+ exit(1);
+ }
+ break;
+ case 'a':
+ ask = 1;
+ break;
+ case 'm':
+ seemiss = 1;
+ break;
+ default:
+ fprintf(stderr,
+ "Bad Arg: type \"%s ?\" for usage message\n", op[0]);
+ exit(1);
+ }
+ }
+ }
+ fprintf(stdout, "Playing optional game (");
+ if (salvo)
+ fprintf(stdout, "salvo, noblitz, ");
+ else if (blitz)
+ fprintf(stdout, "blitz, nosalvo, ");
+ else
+ fprintf(stdout, "noblitz, nosalvo, ");
+
+ if (ask)
+ fprintf(stdout, "ask, ");
+ else
+ fprintf(stdout, "noask, ");
+
+ if (seemiss)
+ fprintf(stdout, "seemiss)\n");
+ else
+ fprintf(stdout, "noseemiss)\n");
+ }
+ else
+ fprintf(stdout,
+ "Playing standard game (no blitz, no slavo, no ask, no seemiss)\n");
+ sleep(2);
+ return(0);
+}
+
+int
+scount(who)
+int who;
+{
+int i, shots;
+struct _ships *sp;
+
+ if (who) {
+ /* count cpu shots */
+ sp = cpuship;
+ } else {
+ /* count player shots */
+ sp = plyship;
+ }
+ for (i=0, shots = 0; i<5; i++, sp++) {
+ /* extra test for machines with unsigned chars! */
+ if (sp->hits == (char) -1 || sp->hits >= sp->length) {
+ continue; /* dead ship */
+ } else {
+ shots++;
+ }
+ }
+ return(shots);
+}
+
diff --git a/lib/libncurses/TESTS/copy.c b/lib/libncurses/TESTS/copy.c
new file mode 100644
index 0000000..013f9db
--- /dev/null
+++ b/lib/libncurses/TESTS/copy.c
@@ -0,0 +1,39 @@
+#include <ncurses.h>
+
+main()
+{
+WINDOW *win1, *win2;
+int h, i;
+
+ initscr();
+ cbreak();
+ noecho();
+ win1 = newwin(20, 50, 0, 20);
+ for (h = 0; h < 20; h++)
+ for (i = 0; i < 50; i++)
+ mvwaddch(win1, h, i, 'X');
+ wrefresh(win1);
+ getch();
+
+ win2 = newwin(20, 50, 3, 30);
+ for (h = 0; h < 20; h++)
+ for (i = 0; i < 50; i++)
+ mvwaddch(win2, h, i, 'Y');
+ wnoutrefresh(win1);
+ wnoutrefresh(win2);
+ doupdate();
+ getch();
+
+ /* now, remove window 2 and restore the contents of window 1 */
+ i = copywin(win1, win2, 5, 10, 0, 0, 14, 39, 0);
+ wnoutrefresh(win1);
+ wnoutrefresh(win2);
+ printw("copywin returns %d\n", i);
+ wnoutrefresh(stdscr);
+ doupdate();
+
+ getch();
+
+ endwin();
+}
+
diff --git a/lib/libncurses/TESTS/corner.c b/lib/libncurses/TESTS/corner.c
new file mode 100644
index 0000000..2ab38a9
--- /dev/null
+++ b/lib/libncurses/TESTS/corner.c
@@ -0,0 +1,16 @@
+#include <ncurses.h>
+
+int main()
+{
+int i, j;
+
+ initscr();
+
+ for (i = 0; i < LINES; i++) {
+ j = mvaddch(i, COLS - 1, 'A' + i);
+ }
+ refresh();
+ endwin();
+ exit(0);
+}
+
diff --git a/lib/libncurses/TESTS/ensor.c b/lib/libncurses/TESTS/ensor.c
new file mode 100644
index 0000000..4eca9cb
--- /dev/null
+++ b/lib/libncurses/TESTS/ensor.c
@@ -0,0 +1,52 @@
+#include <ncurses.h>
+
+main()
+{
+ int i;
+ WINDOW *win;
+
+ initscr();
+ noecho();
+ nonl();
+ cbreak();
+
+ scrollok(stdscr, TRUE);
+
+ for (i=0; i<25; i++)
+ printw("This is in the background, this should be left alone!\n");
+
+ refresh();
+ win=newwin(10,50,6,20);
+ scrollok(win,TRUE);
+ wmove(win,0,0);
+ whline(win,0,49);
+ wmove(win,9,0);
+ whline(win,0,49);
+ wrefresh(win);
+ wattrset(win,A_STANDOUT);
+ mvwprintw(win, 0, 14, " Scrolling Demo! ");
+ mvwprintw(win, 9, 14, " Scrolling Demo! ");
+ wattroff(win,A_STANDOUT);
+ wsetscrreg(win, 1,8);
+
+ mvwprintw(win, 0, 5, " DOWN ");
+ wmove(win,1,0);
+ wrefresh(win);
+
+ getch();
+ for (i=0; i<25; i++){ wprintw(win, "This is window line test (%d).\n", i);
+ if (i%2) wattrset(win,A_BOLD); else wattroff(win,A_BOLD);
+ wrefresh(win); }
+
+ mvwprintw(win, 0, 5, " UP ");
+ wrefresh(win);
+ getch();
+ for (i=0; i<25; i++) { wmove(win,1,0); winsertln(win);
+ if (i%2) wattrset(win,A_BOLD); else wattroff(win,A_BOLD);
+ wprintw(win, "Scrolling backwards! (%d)\n", i); wrefresh(win); }
+
+ mvwprintw(win, 0, 5, " DONE "); wrefresh(win);
+
+ endwin();
+}
+
diff --git a/lib/libncurses/TESTS/firework.c b/lib/libncurses/TESTS/firework.c
new file mode 100644
index 0000000..b497584
--- /dev/null
+++ b/lib/libncurses/TESTS/firework.c
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <signal.h>
+#include <ncurses.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <time.h>
+
+void explode();
+
+int main()
+{
+int start,end,row,diff,flag,direction,seed;
+
+ initscr();
+ if (has_colors())
+ start_color();
+ 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++) {
+ refresh();
+ erase();
+ flag = 0;
+ }
+ }
+ if (flag++) {
+ refresh();
+ flag = 0;
+ }
+ seed = time((time_t *)0);
+ srand(seed);
+ explode(LINES-row,start+(diff*direction));
+ erase();
+ refresh();
+ }
+ endwin();
+ exit(0);
+}
+
+void explode(int row, int col)
+{
+ erase();
+ mvprintw(row,col,"-");
+ refresh();
+
+ init_pair(1,get_colour(),COLOR_BLACK);
+ attrset(COLOR_PAIR(1));
+ mvprintw(row-1,col-1," - ");
+ mvprintw(row,col-1,"-+-");
+ mvprintw(row+1,col-1," - ");
+ refresh();
+
+ init_pair(1,get_colour(),COLOR_BLACK);
+ attrset(COLOR_PAIR(1));
+ mvprintw(row-2,col-2," --- ");
+ mvprintw(row-1,col-2,"-+++-");
+ mvprintw(row, col-2,"-+#+-");
+ mvprintw(row+1,col-2,"-+++-");
+ mvprintw(row+2,col-2," --- ");
+ refresh();
+
+ init_pair(1,get_colour(),COLOR_BLACK);
+ attrset(COLOR_PAIR(1));
+ mvprintw(row-2,col-2," +++ ");
+ mvprintw(row-1,col-2,"++#++");
+ mvprintw(row, col-2,"+# #+");
+ mvprintw(row+1,col-2,"++#++");
+ mvprintw(row+2,col-2," +++ ");
+ refresh();
+
+ init_pair(1,get_colour(),COLOR_BLACK);
+ attrset(COLOR_PAIR(1));
+ mvprintw(row-2,col-2," # ");
+ mvprintw(row-1,col-2,"## ##");
+ mvprintw(row, col-2,"# #");
+ mvprintw(row+1,col-2,"## ##");
+ mvprintw(row+2,col-2," # ");
+ refresh();
+
+ init_pair(1,get_colour(),COLOR_BLACK);
+ attrset(COLOR_PAIR(1));
+ mvprintw(row-2,col-2," # # ");
+ mvprintw(row-1,col-2,"# #");
+ mvprintw(row, col-2," ");
+ mvprintw(row+1,col-2,"# #");
+ mvprintw(row+2,col-2," # # ");
+ refresh();
+ return;
+}
+
+int get_colour()
+{
+ int attr;
+ attr = (rand() % 16)+1;
+ if (attr == 1 || attr == 9)
+ attr = COLOR_RED;
+ if (attr > 8)
+ attr |= A_BOLD;
+ return(attr);
+}
diff --git a/lib/libncurses/TESTS/getch.c b/lib/libncurses/TESTS/getch.c
new file mode 100644
index 0000000..90a0ee4
--- /dev/null
+++ b/lib/libncurses/TESTS/getch.c
@@ -0,0 +1,29 @@
+#include <ncurses.h>
+
+main()
+ {
+ int c,i;
+ initscr();
+ cbreak();
+ noecho();
+#if 1
+ wtimeout(stdscr,1000);
+#endif
+ scrollok(stdscr,TRUE);
+ for (c='A';c<='Z';c++)
+ for (i=0;i<25;i++)
+ {
+ move(i,i);
+ addch(c);
+ refresh();
+ }
+ move (0,0);
+ while ((c=wgetch(stdscr))!='A')
+ {
+ if (c == EOF) printw(">>wait for keypress<<");
+ else printw(">>%c<<\n",c);
+ refresh();
+ }
+ endwin();
+ }
+
diff --git a/lib/libncurses/TESTS/hanoi.c b/lib/libncurses/TESTS/hanoi.c
new file mode 100644
index 0000000..8a482d5
--- /dev/null
+++ b/lib/libncurses/TESTS/hanoi.c
@@ -0,0 +1,275 @@
+/*
+ * 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).
+ *
+ * Date: 05.Nov.90
+ *
+ */
+
+#include <ncurses.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 {
+ int Length[MAXTILES];
+ int Count;
+};
+
+struct Peg Pegs[NPEGS];
+int PegPos[] = { LEFTPEG, MIDPEG, RIGHTPEG };
+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 */
+};
+int NMoves = 0;
+
+static unsigned char AutoFlag;
+
+void InitTiles(), DisplayTiles(), MakeMove(), AutoMove(), Usage();
+
+int
+main(int argc, char **argv)
+{
+int NTiles, FromCol, ToCol;
+
+ 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);
+ exit(1);
+ }
+ break;
+ case 3:
+ if (strcmp(argv[2], "a")) {
+ Usage();
+ exit(1);
+ }
+ NTiles = atoi(argv[1]);
+ if (NTiles > MAXTILES || NTiles < MINTILES) {
+ fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
+ exit(1);
+ }
+ AutoFlag = TRUE;
+ break;
+ default:
+ Usage();
+ exit(1);
+ }
+ initscr();
+ if (!has_colors()) {
+ puts("terminal doesn't support color.");
+ exit(1);
+ }
+ start_color();
+ {
+ int i;
+ for (i = 0; i < 9; i++)
+ init_pair(i+1, COLOR_BLACK, TileColour[i]);
+ }
+ cbreak();
+ if (LINES < 24) {
+ fprintf(stderr, "Min screen length 24 lines\n");
+ endwin();
+ exit(1);
+ }
+ 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 {
+ for(;;) {
+ if(GetMove(&FromCol, &ToCol))
+ break;
+ if (AutoFlag) {
+ AutoMove(0, 2, NTiles);
+ 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;
+ }
+ }
+ }
+ endwin();
+}
+
+int
+InvalidMove(int From, int To)
+{
+ 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;
+}
+
+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;
+}
+
+#define gc() {noecho();getch();echo();}
+
+void
+DisplayTiles()
+{
+ 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);
+ standout();
+ 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');
+ standend();
+
+ /* 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';
+ attrset(COLOR_PAIR(LENTOIND(Pegs[Peg].Length[SlotNo])));
+ mvaddstr(BASELINE-(SlotNo+1),
+ PegPos[Peg]-Pegs[Peg].Length[SlotNo]/2, TileBuf);
+ }
+ }
+ attrset(A_NORMAL);
+ refresh();
+}
+
+int
+GetMove(int *From, int *To)
+{
+ mvaddstr(STATUSLINE, 0, "Next move ('q' to quit) from ");
+ clrtoeol();
+ refresh();
+ if((*From = getch()) == 'q')
+ return TRUE;
+ else if (*From == 'a') {
+ AutoFlag = TRUE;
+ return FALSE;
+ }
+ *From -= ('0'+1);
+ addstr(" to ");
+ clrtoeol();
+ refresh();
+ if((*To = getch()) == 'q')
+ return TRUE;
+ *To -= ('0'+1);
+ move(STATUSLINE, 0);
+ clrtoeol();
+ refresh();
+ return FALSE;
+}
+
+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();
+}
+
+void
+AutoMove(int From, int To, int Num)
+{
+
+ if(Num == 1) {
+ MakeMove(From, To);
+ return;
+ }
+ AutoMove(From, OTHER(From, To), Num-1);
+ MakeMove(From, To);
+ AutoMove(OTHER(From, To), To, Num-1);
+}
+
+int
+Solved(int NumTiles)
+{
+int i;
+
+ for(i = 1; i < NPEGS; i++)
+ if (Pegs[i].Count == NumTiles)
+ return TRUE;
+ return FALSE;
+}
+
+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/lib/libncurses/TESTS/knight.c b/lib/libncurses/TESTS/knight.c
new file mode 100644
index 0000000..73f7b42
--- /dev/null
+++ b/lib/libncurses/TESTS/knight.c
@@ -0,0 +1,320 @@
+/* Knights Tour - a brain game */
+
+#include <ncurses.h>
+#include <signal.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#ifdef __FreeBSD__
+#define srand48 srandom
+#define lrand48 random
+#endif
+
+short board [64]; /* the squares */
+char row, column; /* input characters */
+int rw,col; /* numeric equivalent of row and column */
+int curow,curcol; /* current row and column integers */
+int rdif, cdif; /* difference between input and current */
+int j; /* index into board */
+
+char script[]={"'_)//,/(-)/__/__(_<_(__),|/|/_///_/_<//_/_)__o__o'______///_(--_(_)___,(_/,_/__(_\0"};
+
+int ypos[] ={1,0,1,2,3,0,1,2,2,3,3,2,2,3,2,2,3,3,3,3,3,2,3,3,2,4,5,5,
+ 4,3,3,2,1,2,3,3,3,2,1,3,3,2,3,3,3,2,1,1,0,1,4,4,4,4,4,4,5,6,7,7,
+ 7,6,6,6,7,7,7,6,6,6,6,7,7,7,6,7,7,6,6,7,7};
+
+int xpos[]={0,1,2,1,0,5,4,3,2,4,6,7,8,8,9,10,10,11,12,13,14,15,15,16,
+ 16,16,15,14,15,17,18,19,20,20,20,21,22,23,24,23,25,26,27,26,28,
+ 13,23,25,27,27,2,3,4,5,6,7,4,3,2,1,0,1,2,5,4,5,6,6,7,8,9,8,9,10,
+ 11,11,12,13,14,14,15};
+
+static char *instructions[] =
+{
+" Knight's Tour is a board game for one player. It is played on",
+"an eight by eight board and is based on the allowable moves that a knight",
+"can make in the game of chess. For those who are unfamiliar with the",
+"game, a knight may move either on a row or a column but not diagonally.",
+"He may move one square in any direction and two squares in a perpendicular",
+"direction >or< two squares in any direction and one square in a",
+"perpendicular direction. He may not, of course, move off the board.",
+"",
+" At the beginning of a game you will be asked to either choose a",
+"starting square or allow the computer to select a random location.",
+"Squares are designated by a letter-number combination where the row is",
+"specified by a letter A-H and the numbers 1-8 define a column. Invalid",
+"entries are ignored and illegal moves produce a beep at the terminal.",
+"",
+" The objective is to visit every square on the board. When you claim",
+"a square a marker is placed on it to show where you've been. You may",
+"not revisit a square that you've landed on before.",
+"",
+" After each move the program checks to see if you have any legal",
+"moves left. If not, the game ends and your squares are counted. If",
+"you've made all the squares you win the game. Otherwise, you are told",
+"the number of squares you did make.",
+"END"
+};
+
+void init(void);
+int play(void);
+void drawboard(void);
+void dosquares(void);
+void getfirst(void);
+void getrc(void);
+void putstars(void);
+int evalmove(void);
+int chkmoves(void);
+int endgame(void);
+int chksqr(int, int);
+void instruct(void);
+void title(int, int);
+
+int
+main ()
+{
+ init ();
+ for (;;)
+ if (!play ()) {
+ endwin ();
+ exit (0);
+ }
+}
+
+void
+init ()
+{
+
+ srand48 (getpid());
+ initscr ();
+ cbreak (); /* immediate char return */
+ noecho (); /* no immediate echo */
+ title (1,23);
+ mvaddstr (23, 25, "Would you like instructions? ");
+ refresh();
+ if ((toupper(getch())) == 'Y')
+ instruct();
+ clear ();
+}
+
+int
+play ()
+{
+ drawboard (); /* clear screen and drawboard */
+ for (j = 0; j < 64; j++) board[j]=0;
+ getfirst (); /* get the starting square */
+ for (;;) {
+ getrc();
+ if (evalmove()) {
+ putstars ();
+ if (!chkmoves())
+ return (endgame ());
+ }
+ else beep();
+ }
+}
+
+void
+drawboard ()
+{
+ erase ();
+ dosquares ();
+ refresh ();
+ mvaddstr (0, 7, "1 2 3 4 5 6 7 8");
+ for (j = 0; j < 8; j++) mvaddch (2*j+2, 3, j + 'A');
+ refresh ();
+ mvaddstr (20, 5, "ROW:");
+ mvaddstr (20, 27, "COLUMN:");
+ mvaddstr (14, 49, "CURRENT ROW");
+ mvaddstr (16, 49, "CURRENT COL");
+ mvaddstr (22, 5, "A - H or Q to quit");
+ mvaddstr (22, 27, "1 - 8 or ESC to cancel row");
+ refresh ();
+ title (1,40);
+}
+
+void
+dosquares ()
+{
+ mvaddstr (1, 6, "-------------------------------");
+ for (j = 1; j < 9; j++){
+ mvaddstr (2*j, 5, "| | | | | | | | |");
+ mvaddstr (2*j+1, 6, "-------------------------------");
+ }
+}
+
+void
+getfirst () /* get first square */
+{
+ mvaddstr (23, 25, "(S)elect or (R)andom "); refresh ();
+ do {
+ row = toupper(getch());
+ } while ((row != 'S') && (row != 'R'));
+ if (row == 'R') {
+ rw = lrand48() % 8;
+ col = lrand48() % 8;
+ j = 8* rw + col;
+ row = rw + 'A';
+ column = col + '1';
+ }
+ else {
+ mvaddstr (23, 25, "Enter starting row and column");
+ refresh ();
+ getrc(); /* get row and column */
+ }
+ putstars ();
+ move (23, 0);
+ clrtobot();
+}
+
+void
+getrc () /* get row and column */
+{
+ noecho ();
+ do {
+ mvaddstr (20, 35, " ");
+ refresh ();
+ do {
+ mvaddch (20, 11, ' ');
+ move (20, 11);
+ refresh ();
+ row=toupper(getch());
+ if (row == 'Q') {
+ endwin ();
+ exit (1);
+ }
+ } while ((row < 'A') || (row > 'H'));
+ addch (row);
+ move (20, 35);
+ refresh ();
+ do {
+ column=getch();
+ if (column == '\033') break;
+ } while ((column < '1') || (column > '8'));
+ if (column != '\033') addch (column);
+ } while (column == '\033');
+ refresh();
+ rw = row - 'A';
+ col= column - '1';
+ j = 8 * rw + col;
+}
+
+void
+putstars () /* place the stars, update board & currents */
+{
+ mvaddch (2*curow+2, 38, ' ');
+ mvaddch (2*rw+2, 38, '<');
+ mvaddch (18, curcol*4+7, ' ');
+ mvaddch (18, col*4+7, '^');
+ curow = rw;
+ curcol= col;
+ mvaddstr (2 * rw + 2, 4*col+6, "***");
+ mvaddch (14, 61, row);
+ mvaddch (16, 61, column);
+ refresh ();
+ board[j] = 1;
+}
+
+int
+evalmove() /* convert row and column to integers */
+ /* and evaluate move */
+{
+ rdif = rw - curow;
+ cdif = col - curcol;
+ rdif = abs(rw - curow);
+ cdif = abs(col - curcol);
+ refresh ();
+ if ((rdif == 1) && (cdif == 2)) if (board [j] == 0) return (1);
+ if ((rdif == 2) && (cdif == 1)) if (board [j] == 0) return (1);
+ return (0);
+}
+
+int
+chkmoves () /* check to see if valid moves are available */
+{
+ if (chksqr(2,1)) return (1);
+ if (chksqr(2,-1)) return (1);
+ if (chksqr(-2,1)) return (1);
+ if (chksqr(-2,-1)) return (1);
+ if (chksqr(1,2)) return (1);
+ if (chksqr(1,-2)) return (1);
+ if (chksqr(-1,2)) return (1);
+ if (chksqr(-1,-2)) return (1);
+ return (0);
+}
+
+int
+endgame () /* check for filled board or not */
+{
+ rw = 0;
+ for (j = 0; j < 64; j++) if (board[j] != 0) rw+=1;
+ if (rw == 64) mvaddstr (20, 20, "Congratulations !! You got 'em all");
+ else mvprintw (20, 20, "You have ended up with %2d squares",rw);
+ mvaddstr (21, 25, "Play again ? (y/n) ");
+ refresh ();
+ if ((row=tolower(getch())) == 'y') return (1);
+ else return (0);
+}
+
+#ifndef abs
+abs(num)
+int num;
+{
+ if (num < 0) return (-num);
+ else return (num);
+}
+#endif
+
+int
+chksqr (int n1, int n2)
+{
+int r1, c1;
+
+ r1 = rw + n1;
+ c1 = col + n2;
+ if ((r1<0) || (r1>7)) return (0);
+ if ((c1<0) || (c1>7)) return (0);
+ if (board[r1*8+c1] == 0) return (1);
+ else return (0);
+}
+
+void
+instruct()
+{
+int i;
+
+ clear ();
+ for (i=0;;i++) {
+ if ((strcmp(instructions[i],"END"))) mvaddstr (i, 0, instructions[i]);
+ else {
+ mvaddstr (23, 25, "Ready to play ? (y/n) ");
+ refresh();
+ if (toupper(getch()) == 'Y') {
+ clear ();
+ return;
+ } else {
+ clear ();
+ refresh ();
+ endwin ();
+ exit (0);
+ }
+ }
+ }
+}
+
+void
+title (y,x)
+int y,x;
+{
+char c;
+
+ j = 0;
+ do {
+ c = script[j];
+ if (c == 0) break ;
+ mvaddch (ypos[j]+y, xpos[j]+x, c);
+ j++;
+ } while (c != 0);
+ refresh ();
+}
+
+
diff --git a/lib/libncurses/TESTS/ncurses.c b/lib/libncurses/TESTS/ncurses.c
new file mode 100644
index 0000000..9151236
--- /dev/null
+++ b/lib/libncurses/TESTS/ncurses.c
@@ -0,0 +1,1121 @@
+/****************************************************************************
+
+NAME
+ ncurses.c --- ncurses library exerciser
+
+SYNOPSIS
+ ncurses
+
+DESCRIPTION
+ An interactive test module for the ncurses library.
+
+AUTHOR
+ This software is Copyright (C) 1993 by Eric S. Raymond, all rights reserved.
+It is issued with ncurses under the same terms and conditions as the ncurses
+library source.
+
+***************************************************************************/
+/*LINTLIBRARY */
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <assert.h>
+#include <ncurses.h>
+
+#define P(s) printw("%s\n", s)
+#ifndef CTRL
+#define CTRL(x) ((x) & 0x1f)
+#endif
+
+/****************************************************************************
+ *
+ * Character input test
+ *
+ ****************************************************************************/
+
+static void getch_test(void)
+/* test the keypad feature */
+{
+char buf[BUFSIZ];
+unsigned int c;
+int incount = 0, firsttime = 0;
+bool blocking = TRUE;
+
+ refresh();
+
+ (void) printw("Delay in 10ths of a second (<CR> for blocking input)? ");
+ echo();
+ getstr(buf);
+ noecho();
+
+ if (isdigit(buf[0]))
+ {
+ timeout(atoi(buf) * 100);
+ blocking = FALSE;
+ }
+
+ c = '?';
+ for (;;)
+ {
+ if (firsttime++)
+ {
+ printw("Key pressed: %04o ", c);
+ if (c >= KEY_MIN)
+ {
+ (void) addstr(keyname(c));
+ addch('\n');
+ }
+ else if (c > 0x80)
+ {
+ if (isprint(c & ~0x80))
+ (void) printw("M-%c", c);
+ else
+ (void) printw("M-%s", unctrl(c));
+ 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));
+ }
+ }
+ if (c == 'x' || c == 'q')
+ break;
+ if (c == '?')
+ addstr("Type any key to see its keypad value, `q' to quit, `?' for help.\n");
+
+ while ((c = getch()) == ERR)
+ if (!blocking)
+ (void) printw("%05d: input timed out\n", incount++);
+ }
+
+ timeout(-1);
+ erase();
+ endwin();
+}
+
+static void attr_test(void)
+/* test text attributes */
+{
+ refresh();
+
+ mvaddstr(0, 20, "Character attribute test display");
+
+ mvaddstr(2,8,"This is STANDOUT mode: ");
+ attron(A_STANDOUT);
+ addstr("abcde fghij klmno pqrst uvwxy x");
+ attroff(A_STANDOUT);
+
+ mvaddstr(4,8,"This is REVERSE mode: ");
+ attron(A_REVERSE);
+ addstr("abcde fghij klmno pqrst uvwxy x");
+ attroff(A_REVERSE);
+
+ mvaddstr(6,8,"This is BOLD mode: ");
+ attron(A_BOLD);
+ addstr("abcde fghij klmno pqrst uvwxy x");
+ attroff(A_BOLD);
+
+ mvaddstr(8,8,"This is UNDERLINE mode: ");
+ attron(A_UNDERLINE);
+ addstr("abcde fghij klmno pqrst uvwxy x");
+ attroff(A_UNDERLINE);
+
+ mvaddstr(10,8,"This is DIM mode: ");
+ attron(A_DIM);
+ addstr("abcde fghij klmno pqrst uvwxy x");
+ attroff(A_DIM);
+
+ mvaddstr(12,8,"This is BLINK mode: ");
+ attron(A_BLINK);
+ addstr("abcde fghij klmno pqrst uvwxy x");
+ attroff(A_BLINK);
+
+ mvaddstr(14,8,"This is BOLD UNDERLINE BLINK mode: ");
+ attron(A_BOLD|A_BLINK|A_UNDERLINE);
+ addstr("abcde fghij klmno pqrst uvwxy x");
+ attroff(A_BOLD|A_BLINK|A_UNDERLINE);
+
+ attrset(A_NORMAL);
+ mvaddstr(16,8,"This is NORMAL mode: ");
+ addstr("abcde fghij klmno pqrst uvwxy x");
+
+ refresh();
+
+ move(LINES - 1, 0);
+ addstr("Press any key to continue... ");
+ (void) getch();
+
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Color support tests
+ *
+ ****************************************************************************/
+
+static char *colors[] =
+{
+ "black",
+ "red",
+ "green",
+ "yellow",
+ "blue",
+ "magenta",
+ "cyan",
+ "white"
+};
+
+static void color_test(void)
+/* generate a color test pattern */
+{
+ int i;
+
+ refresh();
+ (void) printw("There are %d color pairs\n", COLOR_PAIRS);
+
+ (void) mvprintw(1, 0,
+ "%dx%d matrix of foreground/background colors, bright *off*\n",
+ COLORS, COLORS);
+ for (i = 0; i < COLORS; i++)
+ mvaddstr(2, (i+1) * 8, colors[i]);
+ for (i = 0; i < COLORS; i++)
+ mvaddstr(3 + i, 0, colors[i]);
+ for (i = 1; i < COLOR_PAIRS; i++)
+ {
+ init_pair(i, i % COLORS, i / COLORS);
+ attron(COLOR_PAIR(i));
+ mvaddstr(3 + (i / COLORS), (i % COLORS + 1) * 8, "Hello");
+ attrset(A_NORMAL);
+ }
+
+ (void) mvprintw(COLORS + 4, 0,
+ "%dx%d matrix of foreground/background colors, bright *on*\n",
+ COLORS, COLORS);
+ for (i = 0; i < COLORS; i++)
+ mvaddstr(5 + COLORS, (i+1) * 8, colors[i]);
+ for (i = 0; i < COLORS; i++)
+ mvaddstr(6 + COLORS + i, 0, colors[i]);
+ for (i = 1; i < COLOR_PAIRS; i++)
+ {
+ init_pair(i, i % COLORS, i / COLORS);
+ attron(COLOR_PAIR(i) | A_BOLD);
+ mvaddstr(6 + COLORS + (i / COLORS), (i % COLORS + 1) * 8, "Hello");
+ attrset(A_NORMAL);
+ }
+
+ move(LINES - 1, 0);
+ addstr("Press any key to continue... ");
+ (void) getch();
+
+ erase();
+ endwin();
+}
+
+static void color_edit(void)
+/* display the color test pattern, without trying to edit colors */
+{
+ int i, c, value = 0, current = 0, field = 0, usebase = 0;
+
+ refresh();
+
+ for (i = 0; i < COLORS; i++)
+ init_pair(i, COLOR_WHITE, i);
+
+ 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 < sizeof(colors)/sizeof(colors[0]) ? colors[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);
+
+ switch (c = getch())
+ {
+ case KEY_UP:
+ current = (current == 0 ? (COLORS - 1) : current - 1);
+ value = 0;
+ break;
+
+ case KEY_DOWN:
+ current = (current == (COLORS - 1) ? 0 : current + 1);
+ value = 0;
+ break;
+
+ case KEY_RIGHT:
+ field = (field == 2 ? 0 : field + 1);
+ value = 0;
+ break;
+
+ case KEY_LEFT:
+ field = (field == 0 ? 2 : field - 1);
+ value = 0;
+ break;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ do {
+ value = value * 10 + (c - '0');
+ c = getch();
+ } while
+ (isdigit(c));
+ if (c != '+' && c != '-' && c != '=')
+ beep();
+ else
+ ungetch(c);
+ break;
+
+ case '+':
+ usebase = 1;
+ goto changeit;
+
+ case '-':
+ value = -value;
+ usebase = 1;
+ goto changeit;
+
+ case '=':
+ usebase = 0;
+ changeit:
+ color_content(current, &red, &green, &blue);
+ if (field == 0)
+ red = red * usebase + value;
+ else if (field == 1)
+ green = green * usebase + value;
+ else if (field == 2)
+ blue = blue * usebase + value;
+ init_color(current, red, green, blue);
+ 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 won't be");
+ P("echoed. 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'");
+
+ move(LINES - 1, 0);
+ addstr("Press any key to continue... ");
+ (void) getch();
+ erase();
+ break;
+
+ case 'x':
+ case 'q':
+ break;
+
+ default:
+ beep();
+ break;
+ }
+ } while
+ (c != 'x' && 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 {
+ 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':
+ move(20, 0);
+ while ((c = getch()) != 'Q')
+ addch(c);
+ break;
+
+ case 'd':
+ slk_clear();
+ break;
+
+ case 'l':
+ fmt = 0;
+ break;
+
+ case 'c':
+ fmt = 1;
+ break;
+
+ case 'r':
+ fmt = 2;
+ break;
+
+ case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8':
+ (void) mvaddstr(20, 0, "Please enter the label value: ");
+ wgetnstr(stdscr, buf, 8);
+ slk_set((c - '0'), buf, fmt);
+ slk_refresh();
+ break;
+
+ case 'x':
+ case 'q':
+ goto done;
+
+ default:
+ beep();
+ }
+ } while
+ ((c = getch()) != EOF);
+
+ done:
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Alternate character-set stuff
+ *
+ ****************************************************************************/
+
+static void acs_display()
+/* display the ACS character set */
+{
+ int i, j;
+
+ erase();
+ attron(A_BOLD);
+ mvaddstr(0, 20, "Display of the ACS Character Set");
+ attroff(A_BOLD);
+ refresh();
+
+#define ACSY 2
+ mvaddstr(ACSY + 0, 0, "ACS_ULCORNER: "); addch(ACS_ULCORNER);
+ mvaddstr(ACSY + 1, 0, "ACS_LLCORNER: "); addch(ACS_LLCORNER);
+ mvaddstr(ACSY + 2, 0, "ACS_URCORNER: "); addch(ACS_URCORNER);
+ mvaddstr(ACSY + 3, 0, "ACS_LRCORNER: "); addch(ACS_LRCORNER);
+ mvaddstr(ACSY + 4, 0, "ACS_RTEE: "); addch(ACS_RTEE);
+ mvaddstr(ACSY + 5, 0, "ACS_LTEE: "); addch(ACS_LTEE);
+ mvaddstr(ACSY + 6, 0, "ACS_BTEE: "); addch(ACS_BTEE);
+ mvaddstr(ACSY + 7, 0, "ACS_TTEE: "); addch(ACS_TTEE);
+ mvaddstr(ACSY + 8, 0, "ACS_HLINE: "); addch(ACS_HLINE);
+ mvaddstr(ACSY + 9, 0, "ACS_VLINE: "); addch(ACS_VLINE);
+ mvaddstr(ACSY + 10,0, "ACS_PLUS: "); addch(ACS_PLUS);
+ mvaddstr(ACSY + 11,0, "ACS_S1: "); addch(ACS_S1);
+ mvaddstr(ACSY + 12,0, "ACS_S9: "); addch(ACS_S9);
+
+ mvaddstr(ACSY + 0, 40, "ACS_DIAMOND: "); addch(ACS_DIAMOND);
+ mvaddstr(ACSY + 1, 40, "ACS_CKBOARD: "); addch(ACS_CKBOARD);
+ mvaddstr(ACSY + 2, 40, "ACS_DEGREE: "); addch(ACS_DEGREE);
+ mvaddstr(ACSY + 3, 40, "ACS_PLMINUS: "); addch(ACS_PLMINUS);
+ mvaddstr(ACSY + 4, 40, "ACS_BULLET: "); addch(ACS_BULLET);
+ mvaddstr(ACSY + 5, 40, "ACS_LARROW: "); addch(ACS_LARROW);
+ mvaddstr(ACSY + 6, 40, "ACS_RARROW: "); addch(ACS_RARROW);
+ mvaddstr(ACSY + 7, 40, "ACS_DARROW: "); addch(ACS_DARROW);
+ mvaddstr(ACSY + 8, 40, "ACS_UARROW: "); addch(ACS_UARROW);
+ mvaddstr(ACSY + 9, 40, "ACS_BOARD: "); addch(ACS_BOARD);
+ mvaddstr(ACSY + 10,40, "ACS_LANTERN: "); addch(ACS_LANTERN);
+ mvaddstr(ACSY + 11,40, "ACS_BLOCK: "); addch(ACS_BLOCK);
+
+#define HYBASE (ACSY + 13)
+ mvprintw(HYBASE + 1, 0, "High-half characters via echochar:\n");
+ for (i = 0; i < 4; i++)
+ {
+ move(HYBASE + i + 3, 24);
+ for (j = 0; j < 32; j++)
+ echochar(128 + 32 * i + j);
+ }
+
+ move(LINES - 1, 0);
+ addstr("Press any key to continue... ");
+ (void) getch();
+
+ erase();
+ endwin();
+}
+
+/****************************************************************************
+ *
+ * Windows and scrolling tester.
+ *
+ ****************************************************************************/
+
+typedef struct
+{
+ int y, x;
+}
+pair;
+
+static void report(void)
+/* report on the cursor's current position, then restore it */
+{
+ int y, x;
+
+ getyx(stdscr, y, x);
+ move(LINES - 1, COLS - 17);
+ printw("Y = %2d X = %2d", y, x);
+ move(y, x);
+}
+
+static pair *selectcell(uli, ulj, lri, lrj)
+/* arrows keys move cursor, return location at current on non-arrow key */
+int uli, ulj, lri, lrj; /* co-ordinates of corners */
+{
+ 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 */
+
+ for (;;)
+ {
+ move(LINES - 1, COLS - 17);
+ printw("Y = %2d X = %2d", uli + i, ulj + j);
+ move(uli + i, ulj + j);
+
+ switch(getch())
+ {
+ 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 '\004': return((pair *)NULL);
+ default: res.y = uli + i; res.x = ulj + j; return(&res);
+ }
+ i %= si;
+ j %= sj;
+ }
+}
+
+static WINDOW *getwindow(void)
+/* Ask user for a window definition */
+{
+ WINDOW *rwindow, *bwindow;
+ pair ul, lr, *tmp;
+
+ move(0, 0); clrtoeol();
+ addstr("Use arrows to move cursor, anything else to mark corner 1");
+ refresh();
+ if ((tmp = selectcell(1, 0, LINES-1, COLS-1)) == (pair *)NULL)
+ return((WINDOW *)NULL);
+ memcpy(&ul, tmp, sizeof(pair));
+ addch(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-1, COLS-1)) == (pair *)NULL)
+ return((WINDOW *)NULL);
+ memcpy(&lr, tmp, sizeof(pair));
+
+ rwindow = newwin(lr.y - ul.y + 1, lr.x - ul.x + 1, ul.y, ul.x);
+
+ bwindow = newwin(lr.y - ul.y + 3, lr.x - ul.x + 3, ul.y - 1, ul.x - 1);
+ wborder(bwindow, ACS_VLINE, ACS_VLINE, ACS_HLINE, ACS_HLINE,
+ 0, 0, 0, 0);
+ wrefresh(bwindow);
+ delwin(bwindow);
+
+ scrollok(rwindow, TRUE);
+/* immedok(rwindow); */
+ wrefresh(rwindow);
+
+ return(rwindow);
+}
+
+static void acs_and_scroll()
+/* Demonstrate windows */
+{
+ int c;
+ struct frame
+ {
+ struct frame *next, *last;
+ WINDOW *wind;
+ }
+ *oldw = (struct frame *)NULL, *current = (struct frame *)NULL, *neww;
+
+ refresh();
+ mvaddstr(LINES - 2, 0,
+ "F1 = make new window, F2 = next window, F3 = previous window, Ctrl-D = exit");
+ mvaddstr(LINES - 1, 0,
+ "All other characters are echoed, windows should scroll.");
+
+ c = KEY_F(1);
+ do {
+ report();
+ if (current)
+ wrefresh(current->wind);
+
+ switch(c)
+ {
+ case KEY_F(1):
+ neww = (struct frame *) malloc(sizeof(struct frame));
+ if ((neww->wind = getwindow()) == (WINDOW *)NULL)
+ goto breakout;
+ if (oldw == NULL) /* First element, */
+ {
+ neww->next = neww; /* so point it at itself */
+ neww->last = neww;
+ current = neww;
+ }
+ else
+ {
+ neww->last = oldw; oldw->next = neww;
+ neww->next = current; current->last = neww;
+ }
+ oldw = neww;
+ keypad(neww->wind, TRUE);
+ break;
+
+ case KEY_F(2):
+ current = current->next;
+ break;
+
+ case KEY_F(3):
+ current = current->last;
+ break;
+
+ case KEY_F(4): /* undocumented --- use this to test area clears */
+ selectcell(0, 0, LINES - 1, COLS - 1);
+ clrtobot();
+ refresh();
+ break;
+
+ case '\r':
+ c = '\n';
+ /* FALLTHROUGH */
+
+ default:
+ waddch(current->wind, c);
+ break;
+ }
+ report();
+ wrefresh(current->wind);
+ } while
+ ((c = wgetch(current->wind)) != '\004');
+
+ breakout:
+ erase();
+ endwin();
+}
+
+#define GRIDSIZE 5
+
+static void panner(WINDOW *pad, int iy, int ix, int (*pgetc)(void))
+{
+ static int porty, portx, basex = 0, basey = 0;
+ int pxmax, pymax, c;
+ WINDOW *vscroll = (WINDOW *)NULL, *hscroll = (WINDOW *)NULL;
+
+ porty = iy; portx = ix;
+
+ getmaxyx(pad, pymax, pxmax);
+
+ if (pymax > porty)
+ vscroll = newwin(porty - (pxmax > ix), 1, 0, portx - (pymax > iy));
+ if (pxmax > portx)
+ hscroll = newwin(1, portx - (pymax > iy), porty - (pxmax > ix), 0);
+
+ c = KEY_REFRESH;
+ do {
+ switch(c)
+ {
+ case KEY_REFRESH:
+ /* do nothing */
+ break;
+
+ case KEY_IC:
+ if (portx >= pxmax || portx >= ix)
+ beep();
+ else
+ {
+ mvwin(vscroll, 0, ++portx - 1);
+ delwin(hscroll);
+ hscroll = newwin(1, portx - (pymax > porty),
+ porty - (pxmax > portx), 0);
+ }
+ break;
+
+ case KEY_IL:
+ if (porty >= pymax || porty >= iy)
+ beep();
+ else
+ {
+ mvwin(hscroll, ++porty - 1, 0);
+ delwin(vscroll);
+ vscroll = newwin(porty - (pxmax > portx), 1,
+ 0, portx - (pymax > porty));
+ }
+ break;
+
+ case KEY_DC:
+ if (portx <= 0)
+ beep();
+ else
+ {
+ mvwin(vscroll, 0, --portx - 1);
+ delwin(hscroll);
+ hscroll = newwin(1, portx - (pymax > porty),
+ porty - (pxmax > portx), 0);
+ }
+ break;
+
+ case KEY_DL:
+ if (porty <= 0)
+ beep();
+ else
+ {
+ mvwin(hscroll, --porty - 1, 0);
+ delwin(vscroll);
+ vscroll = newwin(porty - (pxmax > portx), 1,
+ 0, portx - (pymax > porty));
+ }
+ break;
+
+ case KEY_LEFT:
+ if (basex > 0)
+ basex--;
+ else
+ beep();
+ break;
+
+ case KEY_RIGHT:
+ if (basex + portx < pxmax)
+ basex++;
+ else
+ beep();
+ break;
+
+ case KEY_UP:
+ if (basey > 0)
+ basey--;
+ else
+ beep();
+ break;
+
+ case KEY_DOWN:
+ if (basey + porty < pymax)
+ basey++;
+ else
+ beep();
+ break;
+ }
+
+ prefresh(pad,
+ basey, basex,
+ 0, 0,
+ porty - (hscroll != (WINDOW *)NULL) - 1,
+ portx - (vscroll != (WINDOW *)NULL) - 1);
+ if (vscroll)
+ {
+ int lowend, i, highend;
+
+ lowend = basey * ((float)porty / (float)pymax);
+ highend = (basey + porty) * ((float)porty / (float)pymax);
+
+ touchwin(vscroll);
+ for (i = 0; i < lowend; i++)
+ mvwaddch(vscroll, i, 0, ACS_VLINE);
+ wattron(vscroll, A_REVERSE);
+ for (i = lowend; i <= highend; i++)
+ mvwaddch(vscroll, i, 0, ' ');
+ wattroff(vscroll, A_REVERSE);
+ for (i = highend + 1; i < porty; i++)
+ mvwaddch(vscroll, i, 0, ACS_VLINE);
+ wrefresh(vscroll);
+ }
+ if (hscroll)
+ {
+ int lowend, j, highend;
+
+ lowend = basex * ((float)portx / (float)pxmax);
+ highend = (basex + portx) * ((float)portx / (float)pxmax);
+
+ touchwin(hscroll);
+ for (j = 0; j < lowend; j++)
+ mvwaddch(hscroll, 0, j, ACS_HLINE);
+ wattron(hscroll, A_REVERSE);
+ for (j = lowend; j <= highend; j++)
+ mvwaddch(hscroll, 0, j, ' ');
+ wattroff(hscroll, A_REVERSE);
+ for (j = highend + 1; j < portx; j++)
+ mvwaddch(hscroll, 0, j, ACS_HLINE);
+ wrefresh(hscroll);
+ }
+ mvaddch(porty - 1, portx - 1, ACS_LRCORNER);
+
+ } while
+ ((c = pgetc()) != KEY_EXIT);
+}
+
+int padgetch(void)
+{
+ int c;
+
+ switch(c = getch())
+ {
+ 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);
+ default: return(c);
+ }
+}
+
+static void demo_pad(void)
+/* Demonstrate pads. */
+{
+ int i, j, 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, 'A' + (gridcount++ % 26));
+ }
+ else if (i % GRIDSIZE == 0)
+ waddch(panpad, '-');
+ else if (j % GRIDSIZE == 0)
+ waddch(panpad, '|');
+ else
+ waddch(panpad, ' ');
+ }
+ mvprintw(LINES - 3, 0, "Use arrow keys to pan over the test pattern");
+ mvprintw(LINES - 2, 0, "Use +,- to grow/shrink the panner vertically.");
+ mvprintw(LINES - 1, 0, "Use <,> to grow/shrink the panner horizontally.");
+ panner(panpad, LINES - 4, COLS, padgetch);
+
+ endwin();
+ erase();
+}
+
+/****************************************************************************
+ *
+ * Tests from John Burnell's PDCurses tester
+ *
+ ****************************************************************************/
+
+static void Continue (WINDOW *win)
+{
+ wmove(win, 10, 1);
+ mvwaddstr(win, 10, 1, " Press any key to continue");
+ wrefresh(win);
+ wgetch(win);
+}
+
+static void input_test(WINDOW *win)
+/* Input test, adapted from John Burnell's PDCurses tester */
+{
+ int w, h, bx, by, sw, sh, i;
+ WINDOW *subWin;
+ wclear (win);
+#ifdef FOO
+ char buffer [80];
+ int num;
+#endif /* FOO */
+
+ w = win->_maxx;
+ h = win->_maxy;
+ bx = win->_begx;
+ by = win->_begy;
+ 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_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);
+#ifdef FOO
+ mvwaddstr(subWin, 2, 1, "This is a subwindow");
+#endif /* FOO */
+ wrefresh(win);
+
+ nocbreak();
+ mvwaddstr(win, 1, 1, "Type random keys for 5 seconds.");
+ mvwaddstr(win, 2, 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);
+ sleep(1);
+ flushinp();
+ }
+
+ delwin (subWin);
+ werase(win);
+ flash();
+ wrefresh(win);
+ sleep(1);
+
+ mvwaddstr(win, 2, 1, "Press a key");
+ wmove(win, 9, 10);
+ wrefresh(win);
+ echo();
+ wgetch(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);
+
+#ifdef FOO
+ /*
+ * This test won't be portable until vsscanf() is
+ */
+ mvwaddstr(win, 6, 2, "Enter a number then a string separated by space");
+ echo();
+ mvwscanw(win, 7, 6, "%d %s", &num,buffer);
+ mvwprintw(win, 8, 6, "String: %s Number: %d", buffer,num);
+#endif /* FOO */
+
+ Continue(win);
+}
+
+/****************************************************************************
+ *
+ * Main sequence
+ *
+ ****************************************************************************/
+
+bool do_single_test(const char c)
+/* perform a single specified test */
+{
+ switch (c)
+ {
+ case 'a':
+ getch_test();
+ return(TRUE);
+
+ case 'b':
+ attr_test();
+ return(TRUE);
+
+ case 'c':
+ if (!has_colors())
+ (void) printf("This %s terminal does not support color.\n",
+ getenv("TERM"));
+ else
+ color_test();
+ return(TRUE);
+
+ case 'd':
+ if (!has_colors())
+ (void) printf("This %s terminal does not support color.\n",
+ getenv("TERM"));
+ else if (!can_change_color())
+ (void) printf("This %s terminal has hardwired color values.\n",
+ getenv("TERM"));
+ else
+ color_edit();
+ return(TRUE);
+
+ case 'e':
+ slk_test();
+ return(TRUE);
+
+ case 'f':
+ acs_display();
+ return(TRUE);
+
+ case 'g':
+ acs_and_scroll();
+ return(TRUE);
+
+ case 'p':
+ demo_pad();
+ return(TRUE);
+
+ case 'i':
+ input_test(stdscr);
+ return(TRUE);
+
+ case '?':
+ (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.");
+ return(TRUE);
+ }
+
+ return(FALSE);
+}
+
+int main(const int argc, const char *argv[])
+{
+ char buf[BUFSIZ];
+
+ /* enable debugging */
+ trace(TRACE_ORDINARY);
+
+ /* tell it we're going to play with soft keys */
+ slk_init(1);
+
+ /* we must initialize the curses data structure only once */
+ initscr();
+
+ /* tests, in general, will want these modes */
+ start_color();
+ cbreak();
+ noecho();
+ scrollok(stdscr, TRUE);
+ keypad(stdscr, TRUE);
+
+ /*
+ * 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 = character 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("p = exercise pad features");
+ (void) puts("i = subwindow input test");
+ (void) puts("? = get help");
+
+ (void) fputs("> ", stdout);
+ (void) fflush(stdout); /* necessary under SVr4 curses */
+ (void) fgets(buf, BUFSIZ, stdin);
+
+ if (do_single_test(buf[0])) {
+ clear();
+ refresh();
+ endwin();
+ continue;
+ }
+ } while
+ (buf[0] != 'q' && buf[0] != 'x');
+
+ exit(0);
+}
+
+/* ncurses.c ends here */
diff --git a/lib/libncurses/TESTS/newdemo.c b/lib/libncurses/TESTS/newdemo.c
new file mode 100644
index 0000000..5573557
--- /dev/null
+++ b/lib/libncurses/TESTS/newdemo.c
@@ -0,0 +1,350 @@
+/* $Header: /home/ncvs/src/lib/libncurses/TESTS/newdemo.c,v 1.1.1.1 1994/10/07 08:58:56 ache Exp $
+ *
+ * newdemo.c - A demo program using PDCurses. The program illustrate
+ * the use of colours for text output.
+ */
+
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include <ncurses.h>
+
+#define delay_output(x)
+
+/*
+ * The Australian map
+ */
+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
+
+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
+ */
+main()
+{
+WINDOW *win;
+int w, x, y, i, j, c, len;
+time_t t;
+char buffer[80], *message;
+int width, height;
+chtype save[80];
+void trap();
+
+ 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);
+ 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(100);
+ ++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[0];
+ len = strlen(message);
+ j = 0;
+ i = 2;
+ w = width-2;
+ while(j < NMESSAGES)
+ { strncpy(buffer, message, w - i);
+ buffer[w-i] = 0;
+ mvwaddstr(win, height/2, i, buffer);
+ if(w - i < len)
+ { memset(buffer, ' ', i);
+ strcpy(buffer, message + (w - i));
+ buffer[strlen(buffer)] = ' ';
+ buffer[i-2] = '\0';
+ mvwaddstr(win, height/2, 2, buffer);
+ }
+ wrefresh(win);
+ nodelay(win,TRUE);
+ if (wgetch(win) != ERR)
+ { flushinp();
+ break;
+ }
+ mvwaddch(win, height/2, i, ' ');
+ i = ++i % w;
+ if(i < 2)
+ { message = messages[++j%NMESSAGES];
+ memset(buffer, ' ', w-2);
+ buffer[w-2] = 0;
+ mvwaddstr(win, height/2, 2, buffer);
+ i = 2;
+ }
+ delay_output(300);
+ }
+
+ 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)
+ { c = mvwinch(win, 4, i);
+ save[j++] = c;
+ c = c & 0x7f;
+ 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() == 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() == 1)
+ break;
+ }
+exit:
+ endwin();
+ return 0;
+}
+
+/*
+ * Test sub windows
+ */
+SubWinTest(WINDOW *win)
+{
+int w, h, sw, sh, bx, by;
+WINDOW *swin1, *swin2, *swin3;
+
+ w = win->_maxx;
+ h = win->_maxy;
+ bx = win->_begx;
+ by = win->_begy;
+ 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();
+ return 0;
+}
+
+/*
+ * Bouncing balls
+ */
+BouncingBalls(WINDOW *win)
+{
+chtype c1, c2, c3;
+int w, h;
+int x1, y1, xd1, yd1;
+int x2, y2, xd2, yd2;
+int x3, y3, xd3, yd3;
+
+ w = win->_maxx;
+ h = win->_maxy;
+ 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;
+
+ c1 = mvwinch(win, y1, x1);
+ c2 = mvwinch(win, y2, x2);
+ c3 = mvwinch(win, y3, x3);
+
+ 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);
+ mvwaddch(win, y1, x1, c1);
+ mvwaddch(win, y2, x2, c2);
+ mvwaddch(win, y3, x3, c3);
+ delay_output(150);
+ }
+ return 0;
+}
+
+/*
+ * Wait for user
+ */
+int WaitForUser()
+{
+ time_t t;
+ chtype key;
+
+ nodelay(stdscr,TRUE);
+ t = time((time_t *)0);
+ while(1)
+ {
+ if ((key = getch()) != ERR)
+ {
+ if (key == 'q' || key == 'Q')
+ return 1;
+ else
+ return 0;
+ }
+ if (time((time_t *)0) - t > 5)
+ return 0;
+ }
+}
+
+/*
+ * Trap interrupt
+ */
+void trap()
+{
+ endwin();
+ exit(0);
+}
+
+/* End of DEMO.C */
diff --git a/lib/libncurses/TESTS/over.c b/lib/libncurses/TESTS/over.c
new file mode 100644
index 0000000..5681916
--- /dev/null
+++ b/lib/libncurses/TESTS/over.c
@@ -0,0 +1,120 @@
+/*********************************************************************
+ * [program] overwrite() - Play with overwrite() function to *
+ * attempt pop-up windows. *
+ * ----------------------------------------------------------------- *
+ * [written] 1-Feb-1993 by Neal Ensor (ensor@cs.utk.edu) *
+ * ----------------------------------------------------------------- *
+ * [notes] Originally written on SVR4 UNIX, then recompiled on *
+ * Linux (Slackware 1.1.1, ncurses 1.8.1) *
+ * ----------------------------------------------------------------- *
+ * [problem] On ncurses, the overwrite() function doesn't seem to *
+ * overwrite. Maybe I'm missing something, but this *
+ * program in SVR4 displays three windows, waits for a *
+ * keypress, then removes the top window. With ncurses, *
+ * nothing changes on the display. *
+ *********************************************************************/
+
+# include <ncurses.h> /* ncurses include lives here */
+
+main()
+{
+ /****************************************************************
+ * Declare three little window pointers... *
+ ****************************************************************/
+ WINDOW *win, *win1, *win2;
+
+ /****************************************************************
+ * Set up the screen... *
+ ****************************************************************/
+ initscr();
+ /* traceon(); */
+ noecho();
+ nonl();
+ cbreak();
+ refresh();
+
+ /****************************************************************
+ * Draw three overlapping windows. *
+ ****************************************************************/
+ win=newwin(6,45, 6,6);
+ win1=newwin(10,20,5,5);
+ win2=newwin(10,30,7,7);
+
+ /****************************************************************
+ * Box them, and print a hidden message... *
+ ****************************************************************/
+ box(win, 0, 0);
+ box(win1, 0, 0);
+ box(win2, 0, 0);
+ mvwprintw(win1, 6,6, "Hey!");
+ mvwaddch(win, 1, 1, '0');
+ mvwaddch(win1, 1, 1, '1');
+ mvwaddch(win2, 1, 1, '2');
+ wnoutrefresh(win);
+ wnoutrefresh(win1);
+ wnoutrefresh(win2);
+ doupdate();
+
+ /****************************************************************
+ * Await a keypress to show what we've done so far. *
+ ****************************************************************/
+ getch();
+
+ /****************************************************************
+ * Now, overwrite win2 with contents of all lower windows IN *
+ * ORDER from the stdscr up... *
+ ****************************************************************/
+ if (overwrite(stdscr, win2) == ERR)
+ fprintf(stderr, "overwrite(stdscr, win2) failed!\n");
+
+ touchwin(stdscr); wnoutrefresh(stdscr);
+ touchwin(win); wnoutrefresh(win);
+ touchwin(win1); wnoutrefresh(win1);
+ touchwin(win2); wnoutrefresh(win2);
+ doupdate();
+
+ getch();
+ if (overwrite(win, win2) == ERR)
+ fprintf(stderr, "overwrite(win, win2) failed!\n");
+
+ touchwin(stdscr); wnoutrefresh(stdscr);
+ touchwin(win); wnoutrefresh(win);
+ touchwin(win1); wnoutrefresh(win1);
+ touchwin(win2); wnoutrefresh(win2);
+ doupdate();
+
+ getch();
+ if (overwrite(win1, win2) == ERR)
+ fprintf(stderr, "overwrite(win1, win2) failed!\n");
+
+ /****************************************************************
+ * Perform touches, and hidden refreshes on each window. *
+ * ------------------------------------------------------------ *
+ * NOTE: If you replace the wnoutrefresh() call with wrefresh()*
+ * you can see all windows being redrawn untouched. *
+ ****************************************************************/
+ touchwin(stdscr); wnoutrefresh(stdscr);
+ touchwin(win); wnoutrefresh(win);
+ touchwin(win1); wnoutrefresh(win1);
+ touchwin(win2); wnoutrefresh(win2);
+ doupdate();
+
+ /****************************************************************
+ * At this point, win2 should be "destroyed"; having all other *
+ * window contents overwritten onto it. The doupdate() should *
+ * effectively remove it from the screen, leaving the others *
+ * untouched. On SVR4, this happens, but not with ncurses. *
+ * I'd suspect something in overwrite() causes this, as nothing *
+ * appears to be overwritten after the calls, with no errors *
+ * being reported. This was compiled on my Linux from Slackware*
+ * 1.1.1, with ncurses1.8.1 recompiled on it, using the console *
+ * entry from the "new" terminfo from ncurses1.8.1. *
+ ****************************************************************/
+ getch();
+
+ /****************************************************************
+ * Clean up our act and exit. *
+ ****************************************************************/
+ endwin();
+}
+
diff --git a/lib/libncurses/TESTS/rain.c b/lib/libncurses/TESTS/rain.c
new file mode 100644
index 0000000..9779d02
--- /dev/null
+++ b/lib/libncurses/TESTS/rain.c
@@ -0,0 +1,96 @@
+#include <ncurses.h>
+#include <signal.h>
+/* rain 11/3/1980 EPS/CITHEP */
+
+#define cursor(col,row) move(row,col)
+
+float ranf();
+void onsig();
+
+main(argc,argv)
+int argc;
+char *argv[];
+{
+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();
+ nl();
+ noecho();
+ 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;
+
+ cursor(x,y); addch('.');
+
+ cursor(xpos[j],ypos[j]); addch('o');
+
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]); addch('O');
+
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]-1);
+ addch('-');
+ cursor(xpos[j]-1,ypos[j]);
+ addstr("|.|");
+ cursor(xpos[j],ypos[j]+1);
+ addch('-');
+
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]-2);
+ addch('-');
+ cursor(xpos[j]-1,ypos[j]-1);
+ addstr("/ \\");
+ cursor(xpos[j]-2,ypos[j]);
+ addstr("| O |");
+ cursor(xpos[j]-1,ypos[j]+1);
+ addstr("\\ /");
+ cursor(xpos[j],ypos[j]+2);
+ addch('-');
+
+ if (j==0) j=4; else --j;
+ cursor(xpos[j],ypos[j]-2);
+ addch(' ');
+ cursor(xpos[j]-1,ypos[j]-1);
+ addstr(" ");
+ cursor(xpos[j]-2,ypos[j]);
+ addstr(" ");
+ cursor(xpos[j]-1,ypos[j]+1);
+ addstr(" ");
+ cursor(xpos[j],ypos[j]+2);
+ addch(' ');
+ xpos[j]=x; ypos[j]=y;
+ refresh();
+ }
+}
+
+void
+onsig(n)
+int n;
+{
+ endwin();
+ exit(0);
+}
+
+float
+ranf()
+{
+ float rv;
+ long r = rand();
+
+ r &= 077777;
+ rv =((float)r/32767.);
+ return rv;
+}
+
diff --git a/lib/libncurses/TESTS/scroll.c b/lib/libncurses/TESTS/scroll.c
new file mode 100644
index 0000000..428a064
--- /dev/null
+++ b/lib/libncurses/TESTS/scroll.c
@@ -0,0 +1,30 @@
+#include <ncurses.h>
+
+main()
+{
+int i;
+
+ initscr();
+ noecho();
+ scrollok(stdscr, TRUE);
+ setscrreg(0, 9);
+ mvaddstr(0,0,"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+ mvaddstr(1,0,"bbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
+ mvaddstr(2,0,"ccccccccccccccccccccccccccccc");
+ mvaddstr(3,0,"ddddddddddddddddddddddddddddd");
+ mvaddstr(4,0,"eeeeeeeeeeeeeeeeeeeeeeeeeeeee");
+ mvaddstr(5,0,"fffffffffffffffffffffffffffff");
+ mvaddstr(6,0,"ggggggggggggggggggggggggggggg");
+ mvaddstr(7,0,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
+ mvaddstr(8,0,"iiiiiiiiiiiiiiiiiiiiiiiiiiiii");
+ mvaddstr(9,0,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
+ refresh();
+ for (i = 0; i < 4; i++) {
+ getch();
+ scrl(-1);
+ refresh();
+ }
+ getch();
+ endwin();
+
+}
diff --git a/lib/libncurses/TESTS/scroll2.c b/lib/libncurses/TESTS/scroll2.c
new file mode 100644
index 0000000..e7b2e30
--- /dev/null
+++ b/lib/libncurses/TESTS/scroll2.c
@@ -0,0 +1,91 @@
+#include <ncurses.h>
+#define ROWS 20
+#define scroll_window wscrl
+
+main()
+{
+ int i;
+ WINDOW * w;
+
+
+ initscr();
+ cbreak();
+ noecho();
+ w = newwin (ROWS, 35, 2, 25);
+ scrollok(w, TRUE);
+ wsetscrreg(w, 0, ROWS-1);
+
+#ifdef LELE
+ mvaddstr (0, 0, "With my function");
+#else
+ mvaddstr (0, 0, "With the original wscrl");
+#endif
+ refresh();
+
+
+ for (i=0; i<ROWS-1; i++)
+ {
+ mvwprintw (w, i, 0, "Line number %d", i);
+ }
+ mvwaddstr (w, ROWS-1, 0, "Moving one line at a time");
+ wrefresh(w);
+ for (i = 0; i < 4; i++) {
+ getch();
+ scroll_window (w, 1);
+ wrefresh(w);
+ }
+ for (i = 0; i < 4; i++) {
+ getch();
+ scroll_window (w, -1);
+ wrefresh(w);
+ }
+ getch();
+ wclear (w);
+
+
+ for (i=0; i<ROWS-1; i++)
+ {
+ mvwprintw (w, i, 0, "Line number %d", i);
+ }
+ mvwaddstr (w, ROWS-1, 0, "Moving two line at a time");
+#ifndef LELE
+ mvaddstr (0, 30, "** THIS FAILS ON MY MACHINE WITH A BUS ERROR
+**");
+#endif
+
+
+ wrefresh(w);
+ for (i = 0; i < 4; i++) {
+ getch();
+ scroll_window (w, 2);
+ wrefresh(w);
+ }
+ for (i = 0; i < 4; i++) {
+ getch();
+ scroll_window (w, -2);
+ wrefresh(w);
+ }
+ getch();
+ wclear (w);
+ for (i=0; i<ROWS-1; i++)
+ {
+ mvwprintw (w, i, 0, "Line number %d", i);
+ }
+ mvwaddstr (w, ROWS-1, 0, "Moving three line at a time");
+ wrefresh(w);
+ for (i = 0; i < 4; i++) {
+ getch();
+ scroll_window (w, 3);
+ wrefresh(w);
+ }
+ for (i = 0; i < 4; i++) {
+ getch();
+ scroll_window (w, -3);
+ wrefresh(w);
+ }
+ getch();
+
+
+ endwin();
+}
+
diff --git a/lib/libncurses/TESTS/scroll3.c b/lib/libncurses/TESTS/scroll3.c
new file mode 100644
index 0000000..b2a10c3
--- /dev/null
+++ b/lib/libncurses/TESTS/scroll3.c
@@ -0,0 +1,51 @@
+#include <ncurses.h>
+
+main(int argc, char **argv)
+{
+ WINDOW *w, *x;
+
+ initscr();
+ w = newwin(0, 0, 0, 0);
+ if (argc > 2)
+ x = newwin(0, 0, 0, 0);
+ scrollok(w, TRUE);
+ if (argc > 2)
+ scrollok(x, TRUE);
+ idlok(w, TRUE);
+ if (argc > 2)
+ idlok(x, TRUE);
+ wmove(w, LINES - 1, 0);
+ waddstr(w, "test 1 in w");
+ wrefresh(w);
+ sleep(1);
+ if (argc == 2 || argc == 4)
+ {
+ waddch(w, '\n');
+ sleep(1);
+ waddch(w, '\n');
+ sleep(1);
+ waddch(w, '\n');
+ sleep(1);
+ beep();
+ wrefresh(w);
+ }
+ sleep(1);
+ if (argc > 2)
+ {
+ wmove(x, LINES - 1, 0);
+ waddstr(x, "test 2 in x");
+ sleep(1);
+ waddch(x, '\n');
+ sleep(1);
+ waddch(x, '\n');
+ sleep(1);
+ waddch(x, '\n');
+ sleep(1);
+ beep();
+ wrefresh(w);
+ sleep(1);
+ }
+ endwin();
+ return 0;
+}
+
diff --git a/lib/libncurses/TESTS/test.c b/lib/libncurses/TESTS/test.c
new file mode 100644
index 0000000..f77f3a1
--- /dev/null
+++ b/lib/libncurses/TESTS/test.c
@@ -0,0 +1,27 @@
+
+#include <ncurses.h>
+
+main()
+{
+int x, y;
+
+ initscr();
+ cbreak();
+ nodelay(stdscr, TRUE);
+
+ for (y = 0; y < 43; y++)
+ for (x =0; x < 132; x++) {
+ move(y,x);
+ printw("X");
+ refresh();
+ if (!getch()) {
+ beep();
+ sleep(1);
+ }
+ }
+
+ nocbreak();
+ endwin();
+}
+
+
diff --git a/lib/libncurses/TESTS/testcurs.c b/lib/libncurses/TESTS/testcurs.c
new file mode 100644
index 0000000..df2468a
--- /dev/null
+++ b/lib/libncurses/TESTS/testcurs.c
@@ -0,0 +1,532 @@
+/*
+ *
+ * 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)
+ *
+ */
+
+#include <stdio.h>
+#include <ncurses.h>
+
+#ifdef __STDC__
+void inputTest (WINDOW *);
+void scrollTest (WINDOW *);
+void introTest (WINDOW *);
+int initTest (WINDOW **);
+void outputTest (WINDOW *);
+void padTest (WINDOW *);
+void resizeTest (WINDOW *);
+void display_menu(int,int);
+#else
+void inputTest ();
+void scrollTest ();
+void introTest ();
+int initTest ();
+void outputTest ();
+void padTest ();
+void resizeTest ();
+void display_menu();
+#endif
+
+struct commands
+{
+ char *text;
+#ifdef __STDC__
+ void (*function)(WINDOW *);
+#else
+ void (*function)();
+#endif
+};
+typedef struct commands COMMAND;
+#define MAX_OPTIONS 6
+COMMAND command[MAX_OPTIONS] =
+{
+ {"Intro Test",introTest},
+ {"Pad Test",padTest},
+ {"Resize Test",resizeTest},
+ {"Scroll Test",scrollTest},
+ {"Input Test",inputTest},
+ {"Output Test",outputTest}
+};
+
+int width, height;
+
+main()
+{
+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 1;}
+
+#ifdef A_COLOR
+ if (has_colors())
+ {
+ init_pair(1,COLOR_WHITE,COLOR_BLUE);
+ wattrset(win, COLOR_PAIR(1));
+ }
+ else
+ wattrset(win, A_REVERSE);
+#else
+ wattrset(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();
+ return 0;
+}
+#ifdef __STDC__
+void Continue (WINDOW *win)
+#else
+void Continue (win)
+WINDOW *win;
+#endif
+{
+ wmove(win, 10, 1);
+/* wclrtoeol(win);
+*/ mvwaddstr(win, 10, 1, " Press any key to continue");
+ wrefresh(win);
+ raw();
+ wgetch(win);
+}
+#ifdef __STDC_
+int initTest (WINDOW **win)
+#else
+int initTest (win)
+WINDOW **win;
+#endif
+{
+#ifdef PDCDEBUG
+ PDC_debug("initTest called\n");
+#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 1;
+ }
+}
+#ifdef __STDC__
+void introTest (WINDOW *win)
+#else
+void introTest (win)
+WINDOW *win;
+#endif
+{
+ 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;
+}
+#ifdef __STDC__
+void scrollTest (WINDOW *win)
+#else
+void scrollTest (win)
+WINDOW *win;
+#endif
+{
+ int i;
+ int OldX, OldY;
+ char *Message = "The window will now scroll slowly";
+
+ mvwprintw (win, height - 2, 1, Message);
+ wrefresh (win);
+ scrollok(win, TRUE);
+ for (i = 1; i <= height; i++) {
+ usleep (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++) {
+ usleep (500);
+ scroll(win);
+ wrefresh (win);
+ };
+ wsetscrreg (win, 0, --OldY);
+
+}
+#ifdef __STDC__
+void inputTest (WINDOW *win)
+#else
+void inputTest (win)
+WINDOW *win;
+#endif
+{
+ int w, h, bx, by, sw, sh, i, c,num;
+ char buffer [80];
+ WINDOW *subWin;
+ wclear (win);
+
+ w = win->_maxx;
+ h = win->_maxy;
+ bx = win->_begx;
+ by = win->_begy;
+ 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_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);
+ wrefresh(win);
+
+ nocbreak();
+ mvwaddstr(win, 2, 1, "Press some keys for 5 seconds");
+ mvwaddstr(win, 1, 1, "Pressing ^C should do nothing");
+ wrefresh(win);
+
+ for (i = 0; i < 5; i++) {
+ werase (subWin);
+ box(subWin, ACS_VLINE, ACS_HLINE);
+ mvwprintw (subWin, 1, 1, "Time = %d", i);
+ wrefresh(subWin);
+ usleep(1000);
+ flushinp();
+ }
+
+ delwin (subWin);
+ werase(win);
+ flash();
+ wrefresh(win);
+ usleep(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, 2, 1, "Press a function key or an arrow key");
+ wrefresh(win);
+ keypad(win, TRUE);
+ raw();
+ c = wgetch(win);
+
+ nodelay(win, TRUE);
+ wgetch(win);
+ nodelay(win, FALSE);
+
+ 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");
+ mvwprintw(win, 2, 2, "Keycode = %d", c);
+ mvwaddstr(win, 6, 2, "Enter a number then a string seperated by space");
+ echo();
+ noraw();
+ mvwscanw(win, 7, 6, "%d %s", &num,buffer);
+ mvwprintw(win, 8, 6, "String: %s Number: %d", buffer,num);
+ Continue(win);
+}
+#ifdef __STDC__
+void outputTest (WINDOW *win)
+#else
+void outputTest (win)
+WINDOW *win;
+#endif
+{
+ WINDOW *win1;
+ char Buffer [80];
+ chtype ch;
+
+ /* traceon(); */
+ 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);
+ Continue(win);
+
+ wclear(win);
+ 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);
+
+ win1 = newwin(10, 50, 15, 25);
+ if(win1 == NULL)
+ { endwin();
+ return;
+ }
+#ifdef A_COLOR
+ if (has_colors())
+ {
+ init_pair(3,COLOR_BLUE,COLOR_WHITE);
+ wattrset(win1, COLOR_PAIR(3));
+ }
+ else
+ wattrset(win1, A_NORMAL);
+#else
+ wattrset(win1, A_NORMAL);
+#endif
+ wclear (win1);
+ mvwaddstr(win1, 5, 1, "This text should appear; using overlay option");
+ copywin(win, win1,0,0,0,0,10,50,TRUE);
+
+#ifdef UNIX
+ box(win1,ACS_VLINE,ACS_HLINE);
+#else
+ box(win1,0xb3,0xc4);
+#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);
+ wrefresh(win1);
+ wgetch(win1);
+ delwin(win1);
+
+ 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);
+ /* traceoff(); */
+
+ 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);
+
+ 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();
+ wscanw (win, "%s", Buffer);
+
+ wclear(win);
+ mvwaddstr(win, 10, 1, "Enter a string");
+ wrefresh(win);
+ clear();
+ move(0,0);
+ printw("This is a formatted string in stdscr: %d %s\n", 42, "is it");
+ mvaddstr(10, 1, "Enter a string: ");
+ refresh();
+ noraw();
+ echo();
+ scanw ("%s", Buffer);
+
+ wclear(win);
+ curs_set(2);
+ mvwaddstr(win, 1, 1, "The cursor should appear as a block");
+ Continue(win);
+
+ wclear(win);
+ curs_set(0);
+ mvwaddstr(win, 1, 1, "The cursor should have disappeared");
+ Continue(win);
+
+ wclear(win);
+ curs_set(1);
+ mvwaddstr(win, 1, 1, "The cursor should be an underline");
+ Continue(win);
+}
+
+#ifdef __STDC__
+void resizeTest(WINDOW *dummy)
+#else
+void resizeTest(dummy)
+WINDOW *dummy;
+#endif
+{
+ WINDOW *win1;
+ char Buffer [80];
+ chtype ch;
+
+ savetty ();
+
+ clear();
+ refresh();
+#ifdef __PDCURSES__
+ resize(50);
+#endif
+
+
+ win1 = newwin(11, 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);
+
+ resetty ();
+
+ wclear (win1);
+ mvwaddstr(win1, 1, 1, "The screen should now be reset");
+ Continue(win1);
+
+ delwin(win1);
+
+ clear();
+ refresh();
+
+}
+#ifdef __STDC__
+void padTest(WINDOW *dummy)
+#else
+void padTest(dummy)
+WINDOW *dummy;
+#endif
+{
+WINDOW *pad;
+
+ pad = newpad(50,100);
+ mvwaddstr(pad, 5, 2, "This is a new pad");
+ mvwaddstr(pad, 8, 0, "The end of this line should be truncated here:abcd");
+ mvwaddstr(pad,11, 1, "This line should not appear.");
+ 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);
+
+ 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);
+}
+
+#ifdef __STDC__
+void display_menu(int old_option,int new_option)
+#else
+void display_menu(old_option,new_option)
+int old_option,new_option;
+#endif
+{
+ register int 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/lib/libncurses/TESTS/worm.c b/lib/libncurses/TESTS/worm.c
new file mode 100644
index 0000000..abbe241
--- /dev/null
+++ b/lib/libncurses/TESTS/worm.c
@@ -0,0 +1,268 @@
+/*
+
+ @@@ @@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@
+ @@@ @@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@
+ @@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@
+ @@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
+ @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
+ @@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@
+ @@@@@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@
+ @@@@ @@@@ @@@@@@@@@@@@ @@@ @@@ @@@ @@@
+ @@ @@ @@@@@@@@@@ @@@ @@@ @@@ @@@
+
+ Eric P. Scott
+ Caltech High Energy Physics
+ October, 1980
+
+*/
+
+#include <ncurses.h>
+#include <signal.h>
+
+#define cursor(col,row) move(row,col)
+
+int Wrap;
+short *ref[128];
+static char flavor[]={
+ 'O', '*', '#', '$', '%', '0'
+};
+static 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 char *field;
+static int length=16, number=3, trail=' ';
+static 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 } }
+};
+
+void onsig();
+float ranf();
+
+main(argc,argv)
+int argc;
+char *argv[];
+{
+int x, y;
+int n;
+struct worm *w;
+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);
+ exit(1);
+ }
+ 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);
+ exit(1);
+ }
+ break;
+ case 't':
+ trail='.';
+ break;
+ default:
+ usage:
+ fprintf(stderr, "usage: %s [-field] [-length #] [-number #] [-trail]\n",*argv);
+ exit(1);
+ break;
+ }
+ }
+
+ signal(SIGINT, onsig);
+ initscr();
+ bottom = LINES-1;
+ last = COLS-1;
+
+ 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;
+ ref[bottom][last]=1;
+ for (n=number, w= &worm[0];--n>=0;w++) {
+ w->orientation=w->head=0;
+ if (!(ip=(short *)malloc(length*sizeof (short)))) {
+ fprintf(stderr,"%s: out of memory\n",*argv);
+ exit(1);
+ }
+ w->xpos=ip;
+ for (x=length;--x>=0;) *ip++ = -1;
+ if (!(ip=(short *)malloc(length*sizeof (short)))) {
+ fprintf(stderr,"%s: out of memory\n",*argv);
+ exit(1);
+ }
+ w->ypos=ip;
+ for (y=length;--y>=0;) *ip++ = -1;
+ }
+ if (field) {
+ register char *p;
+ p=field;
+ for (y=bottom;--y>=0;) {
+ for (x=COLS;--x>=0;) {
+ addch(*p++);
+ if (!*p) p=field;
+ }
+ addch('\n');
+ }
+ }
+ refresh();
+
+ for (;;) {
+ 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%6]);
+ 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();
+ endwin();
+ exit(0);
+ 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 (!Wrap||x!=last||y!=bottom) addch(flavor[n%6]);
+ ref[w->ypos[h]=y][w->xpos[h]=x]++;
+ }
+ refresh();
+ }
+}
+
+void
+onsig()
+{
+ endwin();
+ exit(0);
+}
+
+float
+ranf()
+{
+float rv;
+long r = rand();
+
+ r &= 077777;
+ rv =((float)r/32767.);
+ return rv;
+}
diff --git a/lib/libncurses/TESTS/xmas.c b/lib/libncurses/TESTS/xmas.c
new file mode 100644
index 0000000..57cc0ea
--- /dev/null
+++ b/lib/libncurses/TESTS/xmas.c
@@ -0,0 +1,1192 @@
+/******************************************************************************/
+/* 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 */
+/* */
+/* */
+/* */
+/******************************************************************************/
+
+#include <ncurses.h>
+#include <signal.h>
+
+#define FROMWHO "Mark Hessling - (M.Hessling@gu.edu.au)"
+
+int y_pos, x_pos;
+
+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;
+
+void main()
+{
+ void done();
+ int loopy;
+
+ initscr();
+ noecho();
+ nonl();
+ refresh();
+ signal(SIGINT,done);
+ signal(SIGTERM,done);
+#if !defined DOS && !defined OS2
+ signal(SIGHUP,done);
+ signal(SIGQUIT,done);
+#endif
+
+
+
+ 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,12,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);
+ do
+ {
+ clear();
+ werase(treescrn);
+ touchwin(treescrn);
+ werase(treescrn2);
+ touchwin(treescrn2);
+ werase(treescrn8);
+ touchwin(treescrn8);
+ refresh();
+ usleep(1000);
+ boxit();
+ refresh();
+ usleep(1000);
+ seas();
+ refresh();
+ usleep(1000);
+ greet();
+ refresh();
+ usleep(1000);
+ fromwho();
+ refresh();
+ usleep(1000);
+ tree();
+ usleep(1000);
+ balls();
+ usleep(1000);
+ star();
+ usleep(1000);
+ 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, ' ');
+
+
+ usleep(1000);
+ reindeer();
+
+ touchwin(w_holiday);
+ wrefresh(w_holiday);
+ wrefresh(w_del_msg);
+
+ usleep(1000);
+ for(loopy = 0;loopy < 100;loopy++)
+ {
+ blinkit();
+ }
+
+#ifdef NOLOOP
+ done();
+#endif
+
+ }
+ while(getch() == (ERR));
+/* while(!typeahead(stdin));*/
+ done();
+}
+
+boxit()
+{
+ 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 );
+}
+
+seas()
+{
+ 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 );
+}
+
+
+greet()
+{
+ 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 );
+}
+
+
+fromwho()
+{
+ mvaddstr(21, 13, FROMWHO);
+ return( 0 );
+}
+
+
+del_msg()
+{
+ mvwaddstr(w_del_msg, 0, 0, "Hit any key to quit");
+ wrefresh(w_del_msg);
+
+ refresh();
+
+ return( 0 );
+}
+
+
+tree()
+{
+ 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, "|_|");
+
+ wrefresh(treescrn);
+ wrefresh(w_del_msg);
+
+ return( 0 );
+}
+
+
+balls()
+{
+
+ overlay(treescrn, treescrn2);
+
+ 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)'@');
+
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+star()
+{
+ wstandout(treescrn2);
+ mvwaddch(treescrn2, 0, 12, (chtype)'*');
+ wstandend(treescrn2);
+
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+strng1()
+{
+ mvwaddch(treescrn2, 3, 13, (chtype)'\'');
+ mvwaddch(treescrn2, 3, 12, (chtype)':');
+ mvwaddch(treescrn2, 3, 11, (chtype)'.');
+
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+strng2()
+{
+ 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)':');
+
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+strng3()
+{
+ 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)',');
+
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+strng4()
+{
+ 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)'\'');
+
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+strng5()
+{
+ 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)',');
+
+ /* save a fully lit tree */
+ overlay(treescrn2, treescrn);
+
+ wrefresh(treescrn2);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+
+blinkit()
+{
+ 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 );
+}
+
+
+reindeer()
+{
+ 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);
+ }
+ }
+
+ 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++)
+ {
+ mvwin(lildeer3, y_pos, x_pos);
+ wrefresh(lildeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(lildeer2, y_pos, x_pos);
+ wrefresh(lildeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(lildeer1, y_pos, x_pos);
+ wrefresh(lildeer1);
+ wrefresh(w_del_msg);
+
+ mvwin(lildeer2, y_pos, x_pos);
+ wrefresh(lildeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(lildeer3, y_pos, x_pos);
+ wrefresh(lildeer3);
+ wrefresh(w_del_msg);
+
+ 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++)
+ {
+ mvwin(middeer3, y_pos, x_pos);
+ wrefresh(middeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(middeer2, y_pos, x_pos);
+ wrefresh(middeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(middeer1, y_pos, x_pos);
+ wrefresh(middeer1);
+ wrefresh(w_del_msg);
+
+ mvwin(middeer2, y_pos, x_pos);
+ wrefresh(middeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(middeer3, y_pos, x_pos);
+ wrefresh(middeer3);
+ wrefresh(w_del_msg);
+
+ touchwin(middeer0);
+ wrefresh(middeer0);
+ wrefresh(w_del_msg);
+
+ x_pos -= 3;
+ }
+ }
+
+ usleep(2000);
+
+ y_pos = 1;
+
+ for(x_pos = 8; x_pos < 16; x_pos++)
+ {
+
+ mvwin(bigdeer4, y_pos, x_pos);
+ wrefresh(bigdeer4);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer3, y_pos, x_pos);
+ wrefresh(bigdeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer2, y_pos, x_pos);
+ wrefresh(bigdeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer1, y_pos, x_pos);
+ wrefresh(bigdeer1);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer2, y_pos, x_pos);
+ wrefresh(bigdeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer3, y_pos, x_pos);
+ wrefresh(bigdeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer4, y_pos, x_pos);
+ wrefresh(bigdeer4);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer0, y_pos, x_pos);
+ wrefresh(bigdeer0);
+ wrefresh(w_del_msg);
+ }
+
+ --x_pos;
+
+ for(looper = 0; looper < 6; looper++)
+ {
+ mvwin(lookdeer4, y_pos, x_pos);
+ wrefresh(lookdeer4);
+ wrefresh(w_del_msg);
+
+ mvwin(lookdeer3, y_pos, x_pos);
+ wrefresh(lookdeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(lookdeer2, y_pos, x_pos);
+ wrefresh(lookdeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(lookdeer1, y_pos, x_pos);
+ wrefresh(lookdeer1);
+ wrefresh(w_del_msg);
+
+ mvwin(lookdeer2, y_pos, x_pos);
+ wrefresh(lookdeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(lookdeer3, y_pos, x_pos);
+ wrefresh(lookdeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(lookdeer4, y_pos, x_pos);
+ wrefresh(lookdeer4);
+ wrefresh(w_del_msg);
+
+ }
+
+ mvwin(lookdeer0, y_pos, x_pos);
+ wrefresh(lookdeer0);
+ wrefresh(w_del_msg);
+
+ for(; y_pos < 10; y_pos++)
+ {
+
+ for(looper = 0; looper < 2; looper++)
+ {
+ mvwin(bigdeer4, y_pos, x_pos);
+ wrefresh(bigdeer4);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer3, y_pos, x_pos);
+ wrefresh(bigdeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer2, y_pos, x_pos);
+ wrefresh(bigdeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer1, y_pos, x_pos);
+ wrefresh(bigdeer1);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer2, y_pos, x_pos);
+ wrefresh(bigdeer2);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer3, y_pos, x_pos);
+ wrefresh(bigdeer3);
+ wrefresh(w_del_msg);
+
+ mvwin(bigdeer4, y_pos, x_pos);
+ wrefresh(bigdeer4);
+ wrefresh(w_del_msg);
+ }
+ mvwin(bigdeer0, y_pos, x_pos);
+ wrefresh(bigdeer0);
+ wrefresh(w_del_msg);
+ }
+
+ --y_pos;
+
+ mvwin(lookdeer3, y_pos, x_pos);
+ wrefresh(lookdeer3);
+ wrefresh(w_del_msg);
+ return( 0 );
+}
+
+
+
+void done()
+{
+ signal(SIGINT,done);
+ signal(SIGTERM,done);
+#if !defined DOS && !defined OS2
+ signal(SIGHUP,done);
+ signal(SIGQUIT,done);
+#endif
+ clear();
+ refresh();
+ endwin();
+ exit(0);
+}
diff --git a/lib/libncurses/copyright.c b/lib/libncurses/copyright.c
new file mode 100644
index 0000000..5964afc
--- /dev/null
+++ b/lib/libncurses/copyright.c
@@ -0,0 +1,19 @@
+char _ncurses_copyright[] = "\n\
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992, 1993, 1994 *
+* by Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, not removed *
+* from header files, and is reproduced in any documentation *
+* accompanying it or the applications linked with it. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+\n";
diff --git a/lib/libncurses/curs_addch.3 b/lib/libncurses/curs_addch.3
new file mode 100644
index 0000000..5b26e32
--- /dev/null
+++ b/lib/libncurses/curs_addch.3
@@ -0,0 +1,115 @@
+.\" $Id$
+.\"
+.TH curs_addch 3 ""
+.SH NAME
+\fBaddch\fR, \fBwaddch\fR, \fBmvaddch\fR, \fBmvwaddch\fR,
+\fBechochar\fR,
+\fBwechochar\fR - add a character (with attributes) to a \fBncurses\fR window, then advance the cursor
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBaddch(chtype ch);\fR
+.br
+\fBwaddch(WINDOW *win, chtype ch);\fR
+.br
+\fBmvaddch(int y, int x, chtype ch);\fR
+.br
+\fBmvwaddch(WINDOW *win, int y, int x, chtype ch);\fR
+.br
+\fBechochar(chtype ch);\fR
+.br
+\fBwechochar(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 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. A newline also does a \fBclrtoeol\fR before moving. 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 control character, but instead returns
+the representation of the control character. (To emit control characters
+literally, use \fBechochar\fR.)
+
+Video attributes can be combined with a character by OR-ing them into the
+parameter. This results in these attributes also being set. (The intent here
+is that text, including attributes, can be copied from one place to another
+using \fBinch\fR and \fBaddch\fR.) [see \fBstandout\fR, predefined video
+attribute constants, on the curs_attr(3) page].
+
+The \fBechochar\fR and \fBwechochar\fR routines are functionally 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 taken into consideration and, for
+non-control characters, a considerable performance gain might 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. The names are taken from the VT100 nomenclature.
+
+.TS
+l l l
+_ _ _
+l l l.
+\fIName\fR \fIDefault\fR \fIDescription\fR
+ACS_ULCORNER + upper left-hand corner
+ACS_LLCORNER + lower left-hand corner
+ACS_URCORNER + upper right-hand corner
+ACS_LRCORNER + lower right-hand corner
+ACS_RTEE + right tee
+ACS_LTEE + left tee
+ACS_BTEE + bottom tee
+ACS_TTEE + top tee
+ACS_HLINE - horizontal line
+ACS_VLINE | vertical line
+ACS_PLUS + plus
+ACS_S1 - scan line 1
+ACS_S9 \&_ scan line 9
+ACS_DIAMOND + diamond
+ACS_CKBOARD : checker board (stipple)
+ACS_DEGREE ' degree symbol
+ACS_PLMINUS # plus/minus
+ACS_BULLET o bullet
+ACS_LARROW < arrow pointing left
+ACS_RARROW > arrow pointing right
+ACS_DARROW v arrow pointing down
+ACS_UARROW ^ arrow pointing up
+ACS_BOARD # board of squares
+ACS_LANTERN # lantern symbol
+ACS_BLOCK # solid square block
+.TE
+
+.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 BUGS
+.SH NOTES
+Note that \fBaddch\fR, \fBmvaddch\fR, \fBmvwaddch\fR, and
+\fBechochar\fR may be macros.
+
+On 386 and 486 consoles, giving \fBwechochar\fR an argument with its high
+bit set will produce the corresponding high-half ASCIIZ graphic (SVr4 curses
+also has this feature but does not document it). A control-character argument,
+however, will not typically produce the corresponding graphic;
+characters such as CR, NL, FF and TAB are typically interpreted by the console
+driver itself, and ESC will be interpreted as the leader of a control sequence.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_attr\fR(3), \fBcurs_clear\fR(3),
+\fBcurs_inch\fR(3), \fBcurs_outopts\fR(3), \fBcurs_refresh\fR(3),
+\fBputc\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_addchst.3 b/lib/libncurses/curs_addchst.3
new file mode 100644
index 0000000..2991dcd
--- /dev/null
+++ b/lib/libncurses/curs_addchst.3
@@ -0,0 +1,49 @@
+.TH curs_addchstr 3 ""
+.SH NAME
+\fBaddchstr\fR, \fBaddchnstr\fR, \fBwaddchstr\fR,
+\fBwaddchnstr\fR, \fBmvaddchstr\fR, \fBmvaddchnstr\fR, \fBmvwaddchstr\fR,
+\fBmvwaddchnstr\fR - add string of characters (and attributes) to a \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBint addchstr(chtype *chstr);\fR
+.br
+\fBint addchnstr(chtype *chstr, int n);\fR
+.br
+\fBint waddchstr(WINDOW *win, chtype *chstr);\fR
+.br
+\fBint waddchnstr(WINDOW *win, chtype *chstr, int n);\fR
+.br
+\fBint mvaddchstr(int y, int x, chtype *chstr);\fR
+.br
+\fBint mvaddchnstr(int y, int x, chtype *chstr, int n);\fR
+.br
+\fBint mvwaddchstr(WINDOW *win, int y, int x, chtype *chstr);\fR
+.br
+\fBint mvwaddchnstr(WINDOW *win, int y, int x, 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, care must be taken when using them because
+they don't perform any kind of checking (such as for the newline character),
+they don't advance the current cursor position, and they truncate the string if
+it crosses the right margin, rather then wrapping it around to the new line.
+.SH RETURN VALUES
+All these 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 NOTES
+Note that all routines except \fBwaddchnstr\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_addstr.3 b/lib/libncurses/curs_addstr.3
new file mode 100644
index 0000000..c55c2f5
--- /dev/null
+++ b/lib/libncurses/curs_addstr.3
@@ -0,0 +1,44 @@
+.TH curs_addstr 3 ""
+.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 \fBncurses\fR window and advance cursor
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBint addstr(char *str);\fR
+.br
+\fBint addnstr(char *str, int n);\fR
+.br
+\fBint waddstr(WINDOW *win, char *str);\fR
+.br
+\fBint waddnstr(WINDOW *win, char *str, int n);\fR
+.br
+\fBint mvaddstr(y, int x, char *str);\fR
+.br
+\fBint mvaddnstr(y, int x, char *str, int n);\fR
+.br
+\fBint mvwaddstr(WINDOW *win, int y, int x, char *str);\fR
+.br
+\fBint mvwaddnstr(WINDOW *win, int y, int x, 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 negative, then the
+entire string will be added.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and 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 SEE ALSO
+\fBncurses\fR(3), \fBcurs_addch\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_attr.3 b/lib/libncurses/curs_attr.3
new file mode 100644
index 0000000..a7a2b45
--- /dev/null
+++ b/lib/libncurses/curs_attr.3
@@ -0,0 +1,84 @@
+.TH curs_attr 3 ""
+.SH NAME
+\fBattroff\fR, \fBwattroff\fR, \fBattron\fR, \fBwattron\fR,
+\fBattrset\fR, \fBwattrset\fR, \fBstandend\fR, \fBwstandend\fR, \fBstandout\fR,
+\fBwstandout\fR - \fBncurses\fR character and window attribute control routines
+.SH SYNOPSIS
+\fB#include <ncurses.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 standend(void);\fR
+.br
+\fBint wstandend(WINDOW *win);\fR
+.br
+\fBint standout(void);\fR
+.br
+\fBint wstandout(WINDOW *win);\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.
+.SS Attributes
+The following video attributes, defined in \fB<ncurses.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.
+
+.nf
+\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_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
+.fi
+
+The following macro is the reverse of \fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR:
+
+.DS C
+\fBPAIR_NUMBER(\fIattrs\fR) Returns the pair number associated
+ with the \fBCOLOR_PAIR(\fR\fIn\fR\fB)\fR attribute.
+.DE
+
+The return values of these routines are not meaningful (many 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 SEE ALSO
+\fBncurses\fR(3), \fBcurs_addch\fR(3), \fBcurs_addstr\fR(3),
+\fBcurs_printw\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_beep.3 b/lib/libncurses/curs_beep.3
new file mode 100644
index 0000000..b80fd52
--- /dev/null
+++ b/lib/libncurses/curs_beep.3
@@ -0,0 +1,29 @@
+.TH curs_beep 3 ""
+.SH NAME
+\fBbeep\fR, \fBflash\fR - \fBncurses\fR bell and screen flash routines
+.SH SYNOPSIS
+\fB#include <ncurses.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 always return \fBOK\fR.
+.SH CAPABILITIES
+\fBbell\fR, \fBflash_screen\fR.
+.SH SEE ALSO
+\fBncurses\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_bkgd.3 b/lib/libncurses/curs_bkgd.3
new file mode 100644
index 0000000..7e360705
--- /dev/null
+++ b/lib/libncurses/curs_bkgd.3
@@ -0,0 +1,50 @@
+.TH curs_bkgd 3 ""
+.SH NAME
+\fBbkgdset\fR, \fBwbkgdset\fR, \fBbkgd\fR,
+\fBwbkgd\fR - \fBncurses\fR window background manipulation routines
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBvoid bkgdset(chtype ch);\fR
+.br
+\fBvoid wbkgdset(WINDOW *win, chtype ch);\fR
+.br
+\fBint bkgd(chtype ch);\fR
+.br
+\fBint wbkgd(WINDOW *win, chtype ch);\fR
+.br
+.SH DESCRIPTION
+The \fBbkgdset\fR and \fBwbkgdset\fR routines manipulate the
+background of the named window. Background is a \fBchtype\fR
+consisting of any combination of attributes and a character. The
+attribute part of the background is combined (ORed) 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 routines combine the new background
+with every position in the window. Background is any combination of
+attributes and a character. Only the attribute part is used to set
+the background of non-blank characters, while both character and
+attributes are used for blank positions. 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.
+.SH RETURN VALUE
+\fBbkgd\fR and \fBwbkgd\fR return the integer \fBOK\fR, or a
+non-negative integer, if \fBimmedok\fR is set.
+.SH NOTES
+Note that \fBbkgdset\fR and \fBbkgd\fR may be macros.
+.SH BUGS
+\fBimmedok\fR is not yet implemented in ncurses 1.8.6.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_addch\fR(3), \fBcurs_outopts\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_border.3 b/lib/libncurses/curs_border.3
new file mode 100644
index 0000000..1fa94fd
--- /dev/null
+++ b/lib/libncurses/curs_border.3
@@ -0,0 +1,67 @@
+.TH curs_border 3 ""
+.SH NAME
+\fBborder\fR, \fBwborder\fR, \fBbox\fR,
+\fBhline\fR, \fBwhline\fR, \fBvline\fR,
+\fBwvline\fR - create \fBncurses\fR borders, horizontal and vertical lines
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+.br
+\fBint border(chtype ls, chtype rs, chtype ts, chtype bs,
+ chtype tl, chtype tr, chtype bl, chtype br);\fR
+.br
+\fBint wborder(WINDOW *win, chtype ls, chtype rs,
+ chtype ts, chtype bs, chtype tl, chtype tr,
+ chtype 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
+.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 \fBncurses.h\fR) are used instead: \fBACS_VLINE,
+ACS_VLINE, ACS_HLINE, ACS_HLINE, \fBACS_ULCORNER, ACS_URCORNER, ACS_LLCORNER,
+ACS_LRCORNER.\fR
+
+\fBbox(\fR\fIwin\fR\gB, \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 BUGS
+The \fBimmedok\fR function is not yet implemented in ncurses 1.8.6.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_outopts\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_clear.3 b/lib/libncurses/curs_clear.3
new file mode 100644
index 0000000..60c637b
--- /dev/null
+++ b/lib/libncurses/curs_clear.3
@@ -0,0 +1,53 @@
+.TH curs_clear 3 ""
+.SH NAME
+\fBerase\fR, \fBwerase\fR, \fBclear\fR,
+\fBwclear\fR, \fBclrtobot\fR, \fBwclrtobot\fR, \fBclrtoeol\fR,
+\fBwclrtoeol\fR - clear all or part of a \fBncurses\fR window
+.SH SYNOPSIS
+\fB# include <ncurses.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.
+.SH RETURN VALUE
+All routines return the integer \fBOK\fR, or a non-negative integer if
+\fBimmedok\fR is set.
+.SH NOTES
+Note that \fBerase\fR, \fBwerase\fR, \fBclear\fR, \fBwclear\fR,
+\fBclrtobot\fR, and \fBclrtoeol\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_outopts\fR(3), \fBcurs_refresh\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_color.3 b/lib/libncurses/curs_color.3
new file mode 100644
index 0000000..cd32cf3
--- /dev/null
+++ b/lib/libncurses/curs_color.3
@@ -0,0 +1,138 @@
+.TH curs_color 3 ""
+.SH NAME
+\fBstart_color\fR, \fBinit_pair\fR,
+\fBinit_color\fR, \fBhas_colors\fR, \fBcan_change_color\fR,
+\fBcolor_content\fR,
+\fBpair_content\fR - \fBncurses\fR color manipulation routines
+.SH SYNOPSIS
+\fB# include <ncurses.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
+\fBncurses\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<ncurses.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<ncurses.h>\fR the following macros are defined. These are the default
+colors. \fBncurses\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
+All routines that return an integer return \fBERR\fR upon failure and \fBOK\fR
+upon successful completion.
+.SH NOTES
+Several caveats apply onn 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 CAPABILITIES
+\fBsetf\fR, \fBsetb\fR, \fBsetaf\fR, \fBsetab\fR. The ncurses library uses
+the second pair by preference, falling back to the first.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_initscr\fR(3), \fBcurs_attr\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
diff --git a/lib/libncurses/curs_delch.3 b/lib/libncurses/curs_delch.3
new file mode 100644
index 0000000..441eaac
--- /dev/null
+++ b/lib/libncurses/curs_delch.3
@@ -0,0 +1,34 @@
+.TH curs_delch 3 ""
+.SH NAME
+\fBdelch\fR, \fBwdelch\fR, \fBmvdelch\fR,
+\fBmvwdelch\fR - delete character under the cursor in a \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.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 integer value
+other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that \fBdelch\fR, \fBmvdelch\fR, and \fBmvwdelch\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_delln.3 b/lib/libncurses/curs_delln.3
new file mode 100644
index 0000000..6ae1025
--- /dev/null
+++ b/lib/libncurses/curs_delln.3
@@ -0,0 +1,50 @@
+.TH curs_deleteln 3 ""
+.SH NAME
+\fBdeleteln\fR, \fBwdeleteln\fR, \fBinsdelln\fR,
+\fBwinsdelln\fR, \fBinsertln\fR,
+\fBwinsertln\fR - delete and insert lines in a \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.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 integer
+value other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that all but \fBwinsdelln\fR may be a 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
+\fBncurses\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_getch.3 b/lib/libncurses/curs_getch.3
new file mode 100644
index 0000000..8a5c9ae
--- /dev/null
+++ b/lib/libncurses/curs_getch.3
@@ -0,0 +1,188 @@
+.TH curs_getch 3 ""
+.SH NAME
+\fBgetch\fR, \fBwgetch\fR, \fBmvgetch\fR,
+\fBmvwgetch\fR,
+\fBungetch\fR - get (or push back) characters from \fBncurses\fR terminal keyboard
+.SH SYNOPSIS
+\fB#include <ncurses.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
+.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. Unless \fBnoecho\fR has been set, the
+character will also be echoed into the designated window.
+
+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<ncurses.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), \fBncurses\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<ncurses.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.
+.nf
+__________________________________________________________________
+\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 Function keys; space for 64 keys is reserved.
+KEY_F(\fIn\fR) For 0 \fI<\fR \fIn\fR \fI<\fR 63
+KEY_DL Delete line
+KEY_IL Insert line
+KEY_DC Delete character
+KEY_IC Insert char or enter insert mode
+KEY_EIC Exit insert char mode
+KEY_CLEAR Clear screen
+KEY_EOS Clear to end of screen
+KEY_EOL Clear to end of line
+KEY_SF Scroll 1 line forward
+KEY_SR Scroll 1 line backward (reverse)
+KEY_NPAGE Next page
+KEY_PPAGE Previous page
+KEY_STAB Set tab
+KEY_CTAB Clear tab
+KEY_CATAB Clear all tabs
+KEY_ENTER Enter or send
+KEY_SRESET Soft (partial) reset
+KEY_RESET Reset or hard reset
+KEY_PRINT Print or copy
+KEY_LL Home down or bottom (lower left). Keypad is
+ arranged like this:
+ \fBA1\fR \fBup\fR \fBA3\fR
+ \fBleft\fR \fBB2\fR \fBright\fR
+ \fBC1\fR \fBdown\fR \fBC3\fR
+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_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_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
+.fi
+
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer
+value other than \fBERR\fR 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 CAPABILITIES
+All of the key_* capabilities; also \fBkeypad_local\fR and \fBkeypad_xmit\fR.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_inopts\fR(3), \fBcurs_move\fR(3),
+\fBcurs_refresh\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_getstr.3 b/lib/libncurses/curs_getstr.3
new file mode 100644
index 0000000..91d934b
--- /dev/null
+++ b/lib/libncurses/curs_getstr.3
@@ -0,0 +1,53 @@
+.TH curs_getstr 3 ""
+.SH NAME
+\fBgetstr\fR, \fBwgetstr\fR, \fBmvgetstr\fR,
+\fBmvwgetstr\fR,
+\fBwgetnstr\fR - accept character strings from \fBncurses\fR terminal keyboard
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBint getstr(char *str);\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 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.
+
+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.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH BUGS
+When the window is in keypad mode and the user types any special key
+other than those named above, the `character' value appended to the
+string by the ncurses implementation is predictable but not useful
+(being, in fact, the low-order eight bits of the key's KEY_ value).
+
+The SVr4.0 documentation claims that "special keys (such as function
+keys, "home" key, "clear" key, \fIetc\fR.) are interpreted" without
+giving details. It lies. The actual behavior is like that of ncurses.
+.SH NOTES
+Note that \fBgetstr\fR, \fBmvgetstr\fR, and \fBmvwgetstr\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_getch\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_getyx.3 b/lib/libncurses/curs_getyx.3
new file mode 100644
index 0000000..8d46126
--- /dev/null
+++ b/lib/libncurses/curs_getyx.3
@@ -0,0 +1,41 @@
+.TH curs_getyx 3 ""
+.SH NAME
+\fBgetyx\fR, \fBgetparyx\fR, \fBgetbegyx\fR,
+\fBgetmaxyx\fR - get \fBncurses\fR cursor and window coordinates
+.SH SYNOPSIS
+\fB#include <ncurses.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 cursor position of the 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 SEE ALSO
+\fBncurses\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_inch.3 b/lib/libncurses/curs_inch.3
new file mode 100644
index 0000000..7e9e218
--- /dev/null
+++ b/lib/libncurses/curs_inch.3
@@ -0,0 +1,40 @@
+.TH curs_inch 3 ""
+.SH NAME
+\fBinch\fR, \fBwinch\fR, \fBmvinch\fR,
+\fBmvwinch\fR - get a character and attributes from a \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.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<ncurses.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.
+
+.nf
+\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
+.fi
+.SH NOTES
+Note that all of these routines may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_inchstr.3 b/lib/libncurses/curs_inchstr.3
new file mode 100644
index 0000000..83e7ee7
--- /dev/null
+++ b/lib/libncurses/curs_inchstr.3
@@ -0,0 +1,45 @@
+.TH curs_inchstr 3 ""
+.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 \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.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.
+Constants defined in \fB<ncurses.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 curs_inch(3)].
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that all routines except \fBwinchnstr\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_inch\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_initscr.3 b/lib/libncurses/curs_initscr.3
new file mode 100644
index 0000000..20ee121
--- /dev/null
+++ b/lib/libncurses/curs_initscr.3
@@ -0,0 +1,84 @@
+.TH curs_initscr 3 ""
+.SH NAME
+\fBinitscr\fR, \fBnewterm\fR, \fBendwin\fR,
+\fBisendwin\fR, \fBset_term\fR,
+\fBdelscreen\fR - \fBncurses\fR screen initialization and manipulation routines
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBWINDOW *initscr(void);\fR
+.br
+\fBint endwin(void);\fR
+.br
+\fBint isendwin(void);\fR
+.br
+\fBSCREEN *newterm(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 \fBncurses\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, or in order to test
+for the presence of given capabilities, \fBnewterm\fR may be called before
+\fBinitscr\fR.
+
+The initscr code determines the terminal type and initializes all \fBncurses\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 ncurses. 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
+\fBncurses\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 SEE ALSO
+\fBncurses\fR(3), \fBcurs_kernel\fR(3), \fBcurs_refresh\fR(3),
+\fBcurs_slk\fR(3), \fBcurs_util\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_inopts.3 b/lib/libncurses/curs_inopts.3
new file mode 100644
index 0000000..f8cd814
--- /dev/null
+++ b/lib/libncurses/curs_inopts.3
@@ -0,0 +1,170 @@
+.TH curs_inopts 3 ""
+.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 - \fBncurses\fR input options
+.SH SYNOPSIS
+\fB#include <ncurses.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 notimeout(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
+\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 \fBncurses\fR set the \fBcbreak\fR
+mode. Note that \fBcbreak\fR overrides \fBraw\fR. [See curs_getch(3) 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 curs_getch(3) 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 \fBncurses\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), \fBncurses\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 termios(4)].
+To force 8 bits to be returned, invoke \fBmeta\fR(\fIwin\fR,
+\fBTRUE\fR). To force 7 bits to be returned, invoke
+\fBmeta\fR(\fIwin\fR, \fBFALSE\fR). 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.
+
+With the \fBraw\fR and \fBnoraw\fR routines, the terminal is placed
+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
+\fBncurses\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 termios(4)]. When
+\fBqiflush\fR is called, the queues will be flushed when these control
+characters are read.
+
+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).
+
+\fBncurses\fR 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 an
+integer value other than \fBERR\fR upon successful completion, unless otherwise
+noted in the preceding routine descriptions.
+.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.
+.SH BUGS
+The entry points \fBintrflush\fR, \fBqiflush\fR, \fBnoqiflush\fR, and
+\fBtypeahead\fR are not yet implemented in ncurses 1.8.6. The ncurses
+code does not do typeahead checking during input as SVr4 curses does.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_getch\fR(3), \fBcurs_initscr\fR(3), \fBtermios\fR(4)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_insch.3 b/lib/libncurses/curs_insch.3
new file mode 100644
index 0000000..a4ab456
--- /dev/null
+++ b/lib/libncurses/curs_insch.3
@@ -0,0 +1,36 @@
+.TH curs_insch 3 ""
+.SH NAME
+\fBinsch\fR, \fBwinsch\fR, \fBmvinsch\fR,
+\fBmvwinsch\fR - insert a character before cursor in a \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.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 return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.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 SEE ALSO
+\fBncurses\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_insstr.3 b/lib/libncurses/curs_insstr.3
new file mode 100644
index 0000000..735dd1b
--- /dev/null
+++ b/lib/libncurses/curs_insstr.3
@@ -0,0 +1,59 @@
+.\" $Id$
+.\"
+.TH curs_insstr 3 ""
+.SH NAME
+\fBinsstr\fR, \fBinsnstr\fR, \fBwinsstr\fR, \fBwinsnstr\fR,
+\fBmvinsstr\fR, \fBmvinsnstr\fR, \fBmvwinsstr\fR,
+\fBmvwinsnstr\fR - insert string before cursor a \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+.br
+\fBint insstr(char *str);\fR
+.br
+\fBint insnstr(char *str, int n);\fR
+.br
+\fBint winsstr(WINDOW *win, char *str);\fR
+.br
+\fBint winsnstr(WINDOW *win, char *str, int n);\fR
+.br
+\fBint mvinsstr(int y, int x, char *str);\fR
+.br
+\fBint mvinsnstr(int y, int x, char *str, int n);\fR
+.br
+\fBint mvwinsstr(WINDOW *win, int y, int x, char *str);\fR
+.br
+\fBint mvwinsnstr(WINDOW *win, int y, int x, 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 return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH BUGS
+Entry points for these functions are in ncurses.h but they are not
+implemented as of ncurses 1.8.6.
+.SH NOTES
+Note that all but \fBwinsnstr\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_clear\fR(3), \fBcurs_inch\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_instr.3 b/lib/libncurses/curs_instr.3
new file mode 100644
index 0000000..0aa539b
--- /dev/null
+++ b/lib/libncurses/curs_instr.3
@@ -0,0 +1,44 @@
+.TH curs_instr 3 ""
+.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 \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.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 and ending at the right
+margin of the 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.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that all routines except \fBwinnstr\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
+
diff --git a/lib/libncurses/curs_kernel.3 b/lib/libncurses/curs_kernel.3
new file mode 100644
index 0000000..1eff4e1
--- /dev/null
+++ b/lib/libncurses/curs_kernel.3
@@ -0,0 +1,115 @@
+.TH curs_kernel 3 ""
+.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 \fBncurses\fR routines
+.SH SYNOPSIS
+\fB#include <ncurses.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
+\fBint getsyx(int y, int x);\fR
+.br
+\fBint 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 \fBncurses\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 \fBncurses\fR) or "shell"
+(not in \fBncurses\fR) state for use by the \fBreset_prog_mode\fR and
+\fBreset_shell_mode\fR routines. This is done automatically by
+\fBinitscr\fR.
+
+The \fBreset_prog_mode\fR and \fBreset_shell_mode\fR routines restore
+the terminal to "program" (in \fBncurses\fR) or "shell" (out of
+\fBncurses\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.
+
+With the \fBgetsyx\fR routine, the current coordinates of the virtual
+screen cursor are returned 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.
+
+With the \fBsetsyx\fR routine, the virtual screen cursor is set 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
+\fBncurses\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 curs_slk(3)] 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<ncurses.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.
+
+The 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 SEE ALSO
+\fBncurses\fR(3), \fBcurs_initscr\fR(3), \fBcurs_outopts\fR(3), \fBcurs_refresh\fR(3),
+\fBcurs_scr_dmp\fR(3), \fBcurs_slk\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_move.3 b/lib/libncurses/curs_move.3
new file mode 100644
index 0000000..fcb36f3
--- /dev/null
+++ b/lib/libncurses/curs_move.3
@@ -0,0 +1,28 @@
+.TH curs_move 3 ""
+.SH NAME
+\fBmove\fR, \fBwmove\fR - move \fBncurses\fR window cursor
+.SH SYNOPSIS
+\fB#include <ncurses.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 the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that \fBmove\fR may be a macro.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_refresh\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_outopts.3 b/lib/libncurses/curs_outopts.3
new file mode 100644
index 0000000..6c1f382
--- /dev/null
+++ b/lib/libncurses/curs_outopts.3
@@ -0,0 +1,115 @@
+.TH curs_outopts 3 ""
+.SH NAME
+\fBclearok\fR, \fBidlok\fR, \fBidcok immedok\fR,
+\fBleaveok\fR, \fBsetscrreg\fR, \fBwsetscrreg\fR, \fBscrollok\fR,
+\fBnl\fR, \fBnonl\fR - \fBncurses\fR output options
+.SH SYNOPSIS
+\fB#include <ncurses.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
+\fBncurses\fR. All options are initially \fBFALSE\fR, unless otherwise stated.
+It is not necessary to turn these options off before calling \fBendwin\fR.
+
+With the \fBclearok\fR routine, if enabled (\fIbf\fR is \fBTRUE\fR), 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.
+
+With the \fBidlok\fR routine, if enabled (\fIbf\fR is \fBTRUE\fR),
+\fBncurses\fR considers using the hardware insert/delete line feature of
+terminals so equipped. If disabled (\fIbf\fR is \fBFALSE\fR), \fBncurses\fR
+very seldom uses this feature. (The insert/delete character feature is always
+considered.) 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, \fBncurses\fR redraws the changed portions of all lines.
+
+With the \fBidcok\fR routine, if enabled (\fIbf\fR is \fBTRUE\fR),
+\fBncurses\fR considers using the hardware insert/delete character feature of
+terminals so equipped. This is enabled by default.
+
+With the \fBimmedok\fR routine, if enabled (\fIbf\fR is \fBTRUE)\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 the 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 up one 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), \fBwrefresh\fR is called on the
+window, and the physical terminal and window are 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 newline is translated into
+carriage return and linefeed on output, and whether return is translated into
+newline on input. Initially, the translations do occur. By disabling these
+translations using \fBnonl\fR, \fBncurses\fR is able to make better use of the
+linefeed capability, resulting in faster cursor motion.
+.SH RETURN VALUE
+\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 BUGS
+The entry points \fBidcok\fR, \fBimmedok\fR are not yet implemented in
+ncurses 1.8.6. Setting \fIidlok\fR has unfortunate effects on scrolling
+windows.
+.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
+\fBncurses\fR(3), \fBcurs_addch\fR(3), \fBcurs_clear\fR(3),
+\fBcurs_initscr\fR(3), \fBcurs_scroll\fR(3), \fBcurs_refresh\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_overlay.3 b/lib/libncurses/curs_overlay.3
new file mode 100644
index 0000000..302fa17
--- /dev/null
+++ b/lib/libncurses/curs_overlay.3
@@ -0,0 +1,41 @@
+.TH curs_overlay 3 ""
+.SH NAME
+\fBoverlay\fR, \fBoverwrite\fR,
+\fBcopywin\fR - overlay and manipulate overlapped \fBncurses\fR windows
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBint overlay(WINDOW *srcwin, WINDOW *dstwin);\fR
+.br
+\fBint overwrite(WINDOW *srcwin, WINDOW *dstwin);\fR
+.br
+\fBint copywin(WINDOW *srcwin, WINDOW *dstwin, int sminrow,
+ int smincol, int dminrow, int dmincol, int dmaxrow,
+ int 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 an integer
+value other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that \fBoverlay\fR and \fBoverwrite\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_pad\fR(3), \fBcurs_refresh\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_pad.3 b/lib/libncurses/curs_pad.3
new file mode 100644
index 0000000..cba5e92
--- /dev/null
+++ b/lib/libncurses/curs_pad.3
@@ -0,0 +1,74 @@
+.TH curs_pad 3 ""
+.SH NAME
+\fBnewpad\fR, \fBsubpad\fR, \fBprefresh\fR,
+\fBpnoutrefresh\fR, \fBpechochar\fR - create and display \fBncurses\fR pads
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBWINDOW *newpad(int nlines, int ncols);\fR
+.br
+\fBWINDOW *subpad(WINDOW *orig, int nlines, int ncols,
+ int begin_y, int begin_x);\fR
+\fBint prefresh(WINDOW *pad, int pminrow, int pmincol,
+ int sminrow, int smincol, int smaxrow, int smaxcol);\fR
+\fBint pnoutrefresh(WINDOW *pad, int pminrow, int pmincol,
+ int sminrow, int smincol, int smaxrow, int smaxcol);\fR
+\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 an integer
+value other than \fBERR\fR upon successful completion.
+
+Routines that return pointers return \fBNULL\fR on error.
+.SH NOTES
+Note that \fBpechochar\fR may be a macro.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_refresh\fR(3), \fBcurs_touch\fR(3), \fBcurs_addch\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_printw.3 b/lib/libncurses/curs_printw.3
new file mode 100644
index 0000000..d2f6688
--- /dev/null
+++ b/lib/libncurses/curs_printw.3
@@ -0,0 +1,41 @@
+.TH curs_printw 3 ""
+.SH NAME
+\fBprintw\fR, \fBwprintw\fR, \fBmvprintw\fR,
+\fBmvwprintw\fR, \fBvwprintw\fR - print formatted output in \fBncurses\fR windows
+.SH SYNOPSIS
+\fB#include <ncurses.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,
+ \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(3)]. 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(3)] 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
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBprintf\fR(3), \fBvprintf(3)\fR
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_refresh.3 b/lib/libncurses/curs_refresh.3
new file mode 100644
index 0000000..3c204e2
--- /dev/null
+++ b/lib/libncurses/curs_refresh.3
@@ -0,0 +1,69 @@
+.TH curs_refresh 3 ""
+.SH NAME
+\fBrefresh\fR, \fBwrefresh\fR, \fBwnoutrefresh\fR,
+\fBdoupdate\fR, \fBredrawwin\fR,
+\fBwredrawln\fR - refresh \fBncurses\fR windows and lines
+.SH SYNOPSIS
+\fB#include <ncurses.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, \fBncurses\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 \fBredrawwin\fR routine indicates to \fBncurses\fR that some screen lines
+are corrupted and should be thrown away before anything is written over them.
+These routines could be used for programs such as editors, which want a command
+to redraw some part of the screen or the entire screen. The routine
+\fBredrawln\fR is preferred over \fBredrawwin\fR where a noisy communication
+line exists and redrawing the entire window could be subject to even more
+communication noise. Just redrawing several lines offers the possibility that
+they would show up unblemished.
+.SH RETURN VALUE
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that \fBrefresh\fR and \fBredrawwin\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_outopts\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_scanw.3 b/lib/libncurses/curs_scanw.3
new file mode 100644
index 0000000..22a8b60
--- /dev/null
+++ b/lib/libncurses/curs_scanw.3
@@ -0,0 +1,43 @@
+.TH curs_scanw 3 ""
+.SH NAME
+\fBscanw\fR, \fBwscanw\fR, \fBmvscanw\fR,
+\fBmvwscanw\fR, \fBvwscanw\fR - convert formatted input from a \fBncurses\fR widow
+.SH SYNOPSIS
+\fB#include <ncurses.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,
+ char *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(3)]. 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 SEE ALSO
+\fBncurses\fR(3), \fBcurs_getstr\fR(3), \fBcurs_printw\fR(3), \fBscanf\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_scr_dmp.3 b/lib/libncurses/curs_scr_dmp.3
new file mode 100644
index 0000000..622b0f9
--- /dev/null
+++ b/lib/libncurses/curs_scr_dmp.3
@@ -0,0 +1,58 @@
+.TH curs_scr_dump 3 ""
+.SH NAME
+\fBscr_dump\fR, \fBscr_restore\fR,
+\fBscr_init\fR,
+\fBscr_set\fR - read (write) a \fBncurses\fR screen from (to) a file
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBint scr_dump(char *filename);\fR
+.br
+\fBint scr_restore(char *filename);\fR
+.br
+\fBint scr_init(char *filename);\fR
+.br
+\fBint scr_set(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 \fBncurses\fR data structures about what the terminal
+currently has on its screen. If the data is determined to be valid,
+\fBncurses\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 time-stamp of the tty
+is old or the terminfo capabilities \fBrmcup\fR and \fBnrrmc\fR exist.
+
+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(3)].
+.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.
+.BUGS
+The time-stamp and rmcup/nrrmc checks are not implemented in \fBncurses\fR(3).
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_initscr\fR(3), \fBcurs_refresh\fR(3),
+\fBcurs_util\fR(3), \fBsystem\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_scroll.3 b/lib/libncurses/curs_scroll.3
new file mode 100644
index 0000000..a779a90
--- /dev/null
+++ b/lib/libncurses/curs_scroll.3
@@ -0,0 +1,37 @@
+.TH curs_scroll 3 ""
+.SH NAME
+\fBscroll\fR, \fBscrl\fR, \fBwscrl\fR - scroll a \fBncurses\fR window
+.SH SYNOPSIS
+\fB#include <ncurses.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 is scrolled at
+the same time.
+
+With the \fBscrl\fR and \fBwscrl\fR routines, for positive \fIn\fR 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
+All routines return the integer \fBERR\fR upon failure and an integer value
+other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that \fBscrl\fR and \fBscroll\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_outopts\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_slk.3 b/lib/libncurses/curs_slk.3
new file mode 100644
index 0000000..c391701
--- /dev/null
+++ b/lib/libncurses/curs_slk.3
@@ -0,0 +1,85 @@
+.TH curs_slk 3 ""
+.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 - \fBncurses\fR soft label routines
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBint slk_init(int fmt);\fR
+.br
+\fBint slk_set(int labnum, 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(chtype attrs);\fR
+.br
+\fBint slk_attrset(chtype attrs);\fR
+.br
+\fBint slk_attroff(chtype attrs);\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,
+\fBncurses\fR takes over the bottom line of \fBstdscr\fR, reducing the size of
+\fBstdscr\fR and the variable \fBLINES\fR. \fBncurses\fR standardizes on eight
+labels of up to eight characters each.
+
+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.
+
+With the \fBslk_set\fR routine, \fIlabnum\fR is the label number, from \fB1\fR
+to \fB8\fR. \fIlabel\fR is the string to be put on the label, up to eight
+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 and \fBslk_attroff\fR routines
+correspond to \fBattron\fR, \fBattrset\fR, and \fBattroff\fR. They
+have an effect only if soft labels are simulated on the bottom line of
+the screen.
+.SH RETURN VALUE
+Routines that return an integer return \fBERR\fR upon failure and an integer
+value other than \fBERR\fR upon successful completion.
+
+\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 SEE ALSO
+\fBncurses\fR(3), \fBcurs_attr\fR(3), \fBcurs_initscr\fR(3), \fBcurs_refresh\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_termatt.3 b/lib/libncurses/curs_termatt.3
new file mode 100644
index 0000000..ea4a62c
--- /dev/null
+++ b/lib/libncurses/curs_termatt.3
@@ -0,0 +1,74 @@
+.TH curs_termattrs 3 ""
+.SH NAME
+\fBbaudrate\fR, \fBerasechar\fR, \fBhas_ic\fR,
+\fBhas_il\fR, \fBkillchar\fR, \fBlongname\fR, \fBtermattrs\fR,
+\fBtermname\fR - \fBncurses\fR environment query routines
+.SH SYNOPSIS
+\fB#include <ncurses.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
+\fBchtype 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, \fBncurses\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 \fBncurses\fR program
+needs complete control over the appearance of the screen.
+
+The \fBtermname\fR routine returns the value of the environment
+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 an integer
+value other than \fBERR\fR upon successful completion.
+.SH NOTES
+Note that \fBtermattrs\fR may be a macro.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_initscr\fR(3), \fBcurs_outopts\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_termin.3 b/lib/libncurses/curs_termin.3
new file mode 100644
index 0000000..a624b65
--- /dev/null
+++ b/lib/libncurses/curs_termin.3
@@ -0,0 +1,191 @@
+.TH curs_terminfo 3 ""
+.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 - \fBncurses\fR interfaces to terminfo database
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+.br
+\fB#include <term.h>\fR
+
+\fBint setupterm(char *term, int fildes, int *errret);\fR
+.br
+\fBint setterm(char *term);\fR
+.br
+\fBint set_curterm(TERMINAL *nterm);\fR
+.br
+\fBint del_curterm(TERMINAL *oterm);\fR
+.br
+\fBint restartterm(char *term, int fildes, int *errret);\fR
+.br
+\fBchar *tparm(char *str, long int p1, long int p2,
+ long int p3, long int p4, long int p5, long int p6,
+ long int p7, long int p8, long int p9);\fR
+.br
+\fBint tputs(char *str, int affcnt, int (*putc)(char));\fR
+.br
+\fBint putp(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(char *capname);\fR
+.br
+\fBint tigetnum(char *capname);\fR
+.br
+\fBint tigetstr(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, \fBncurses\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(5)]. 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 \fBncurses.h\fR and \fBnterm.h\fR should be included (in this
+order) to get the definitions for these strings, numbers, and flags (these
+correspond to the SVr4 headers \fBcurses.h\fR and \fBterm.h\fR). 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(3)]. 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 \fBncurses\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 status of \fB1\fR in \fIerrret\fR is normal, \fB0\fR
+means that the terminal could not be found, and \fB-1\fR means that
+the \fBterminfo\fR database could not be found. 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.
+
+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. 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.
+
+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 \fBncurses\fR(3). 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.
+
+With the \fBtigetflag\fR routine, the value \fB-1\fR is returned if
+\fIcapname\fR is not a boolean capability.
+
+With the \fBtigetnum\fR routine, the value \fB-2\fR is returned if
+\fIcapname\fR is not a numeric capability.
+
+With the \fBtigetstr\fR routine, the value \fB(char *)-1\fR is
+returned if \fIcapname\fR is not a string capability.
+
+The \fIcapname\fR for each capability is given in the table column entitled
+\fIcapname\fR code in the capabilities section of \fBterminfo\fR(5).
+
+\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
+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.
+
+Routines that return pointers always return \fBNULL\fR on error.
+.SH NOTES
+The \fBsetupterm\fR routine should be used in place of \fBsetterm\fR.
+
+Note that \fBvidattr\fR and \fBvidputs\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_initscr\fR(3), \fBcurs_kernel\fR(3),
+\fBputc\fR(3), \fBterminfo\fR(5)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_touch.3 b/lib/libncurses/curs_touch.3
new file mode 100644
index 0000000..5d3a620
--- /dev/null
+++ b/lib/libncurses/curs_touch.3
@@ -0,0 +1,57 @@
+.TH curs_touch 3 ""
+.SH NAME
+\fBtouchwin\fR, \fBtouchline\fR, \fBuntouchwin\fR,
+\fBwtouchln\fR, \fBis_linetouched\fR,
+\fBis_wintouched\fR - \fBncurses\fR refresh control routines
+.SH SYNOPSIS
+\fB#include <ncurses.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 NOTES
+Note that all routines except \fBwtouchln\fR may be macros.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_refresh\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_util.3 b/lib/libncurses/curs_util.3
new file mode 100644
index 0000000..ee46fad
--- /dev/null
+++ b/lib/libncurses/curs_util.3
@@ -0,0 +1,81 @@
+.TH curs_util 3 ""
+.SH NAME
+\fBunctrl\fR, \fBkeyname\fR, \fBfilter\fR,
+\fBuse_env\fR, \fBputwin\fR, \fBgetwin\fR, \fBdelay_output\fR,
+\fBflushinp\fR - miscellaneous \fBncurses\fR utility routines
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBchar *unctrl(chtype c);\fR
+.br
+\fBchar *keyname(int c);\fR
+.br
+\fBint 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. It makes \fBncurses\fR think that there is a
+one-line screen. \fBncurses\fR does not use any terminal capabilities
+that assume that they know on what line of the screen the cursor is
+positioned.
+
+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
+\fBncurses\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 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 BUGS
+The \fBfilter\fR entry point is not yet supported.
+.SH NOTES
+Note that \fBunctrl\fR is a macro, which is defined in <\fBunctrl.h\fR>.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_initscr\fR(3), \fBcurs_scr_dmp\fR(3).
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curs_window.3 b/lib/libncurses/curs_window.3
new file mode 100644
index 0000000..5ac63f4
--- /dev/null
+++ b/lib/libncurses/curs_window.3
@@ -0,0 +1,123 @@
+.TH curs_window 3 ""
+.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 \fBncurses\fR windows
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+
+\fBWINDOW *newwin(int nlines, int ncols, int begin_y,\fR
+ \fBintbegin_x);\fR
+
+\fBint delwin(WINDOW *win);\fR
+.br
+\fBint mvwin(WINDOW *win, int y, int x);\fR
+.br
+\fBWINDOW *subwin(WINDOW *orig, int nlines, int ncols,
+ int begin_y, int begin_x);\fR
+\fBWINDOW *derwin(WINDOW *orig, int nlines, int ncols,
+ int begin_y, int begin_x);\fR
+\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
+The \fBnewwin\fR routine 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.
+
+The \fBdelwin\fR routine 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.
+
+The \fBmvwin\fR routine 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.
+
+The \fBsubwin\fR routine 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.
+
+The \fBderwin\fR routine is the same as \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.
+
+The \fBmvderwin\fR routine 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.
+
+The \fBdupwin\fR routine creates an exact duplicate of the window \fIwin\fR.
+
+Each \fBncurses\fR window maintains two data structures: the character
+image structure and the status structure. The character image
+structure is shared among all windows in the window hierarchy
+(\fIi\fR.\fIe\fR., the window with all subwindows). The status
+structure, which contains information about individual line changes in
+the window, is private to each window. The routine \fBwrefresh\fR
+uses the status data structure when performing screen updating. Since
+status structures are not shared, changes made to one window in the
+hierarchy may not be properly reflected on the screen.
+
+The routine \fBwsyncup\fR causes the changes in the status structure
+of a window to be reflected in the status structures of its ancestors.
+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 routine \fBwcursyncup\fR updates the current cursor position of all the
+ancestors of the window to reflect the current cursor position of the
+window.
+
+The routine \fBwsyncdown\fR updates the status structure of the window
+to reflect the changes in the status structures of its ancestors.
+Applications seldom call this routine because it is called
+automatically by \fBwrefresh\fR.
+.SH RETURN VALUE
+Routines that return an integer return the integer \fBERR\fR upon failure and
+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, etc.) are flaky,
+incompletely implemented, and not well tested, especially in their
+interaction with scrolling.
+.SH SEE ALSO
+\fBncurses\fR(3), \fBcurs_refresh\fR(3), \fBcurs_touch\fR(3)
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/curses.h b/lib/libncurses/curses.h
new file mode 100644
index 0000000..0800a8a
--- /dev/null
+++ b/lib/libncurses/curses.h
@@ -0,0 +1,544 @@
+
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992, 1993, 1994 *
+* by Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, not removed *
+* from header files, and is reproduced in any documentation *
+* accompanying it or the applications linked with it. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+
+#ifndef __NCURSES_H
+#define __NCURSES_H
+#define CURSES 1
+#define CURSES_H 1
+
+/* This is defined in more than one ncurses header, for identification */
+#undef NCURSES_VERSION
+#define NCURSES_VERSION "1.8.6/ache"
+
+typedef unsigned long chtype;
+
+#include <stdio.h>
+#include <stdarg.h>
+#ifndef NOTERMIOS
+#include <termios.h>
+#ifndef TERMIOS
+#define TERMIOS 1
+#endif
+#else
+#include <sgtty.h>
+#include <sys/ioctl.h>
+#endif
+#include <unctrl.h>
+
+#define bool char
+
+/* attributes */
+#define A_ATTRIBUTES 0xffffff00
+#define A_NORMAL 0x00000000
+#define A_STANDOUT 0x00010000
+#define A_UNDERLINE 0x00020000
+#define A_REVERSE 0x00040000
+#define A_BLINK 0x00080000
+#define A_DIM 0x00100000
+#define A_BOLD 0x00200000
+#define A_ALTCHARSET 0x00400000
+#define A_INVIS 0x00800000
+#define A_PROTECT 0x01000000
+#define A_CHARTEXT 0x000000ff
+#define A_COLOR 0x0000ff00
+#define COLOR_PAIR(n) (n << 8)
+#define PAIR_NUMBER(a) ((a & A_COLOR) >> 8)
+
+/* colors */
+extern int COLORS;
+extern int COLOR_PAIRS;
+extern unsigned char *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[];
+
+
+#define ACS_ULCORNER (acs_map['l'])
+#define ACS_LLCORNER (acs_map['m'])
+#define ACS_URCORNER (acs_map['k'])
+#define ACS_LRCORNER (acs_map['j'])
+#define ACS_RTEE (acs_map['u'])
+#define ACS_LTEE (acs_map['t'])
+#define ACS_BTEE (acs_map['v'])
+#define ACS_TTEE (acs_map['w'])
+#define ACS_HLINE (acs_map['q'])
+#define ACS_VLINE (acs_map['x'])
+#define ACS_PLUS (acs_map['n'])
+#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 */
+#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 */
+
+#ifndef TRUE
+# define TRUE (1)
+# define FALSE (0)
+#endif
+
+#define ERR (-1)
+#define OK (0)
+
+#define _SUBWIN 0x01
+#define _ENDLINE 0x02
+#define _FULLWIN 0x04
+#define _SCROLLWIN 0x08
+#define _ISPAD 0x10
+#define _HASMOVED 0x20
+
+#define _NOCHANGE -1
+
+typedef struct screen SCREEN;
+typedef struct _win_st WINDOW;
+
+struct _win_st {
+ short _cury, _curx; /* current cursor position */
+ short _maxy, _maxx; /* maximum values of x and y NOT the screen dimensions */
+ short _begy, _begx;
+ short _flags;
+ chtype _attrs;
+ chtype _bkgd;
+
+ /* The following should be consolidated into one bitset */
+ bool _notimeout;
+ bool _use_idc;
+ bool _clear;
+ bool _leave;
+ bool _scroll;
+ bool _idlok;
+ bool _immed;
+ bool _sync;
+ bool _use_keypad; /* 0=no, 1=yes */
+ bool _use_meta; /* T=use the meta key */
+
+ int _delay; /* 0 = nodelay
+ <0 = blocking
+ >0 = delay */
+ chtype **_line;
+ short *_firstchar; /* First changed character in the line */
+ short *_lastchar; /* Last changed character in the line */
+ short _regtop; /* Top and bottom of scrolling region */
+ short _regbottom;
+ int _parx;
+ int _pary;
+ WINDOW *_parent; /* parent if a sub-window */
+};
+
+extern WINDOW *stdscr, *curscr, *newscr;
+
+extern int LINES, COLS;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int resizeterm (int, int);
+
+#if 0 /* MYTINFO not have it */
+extern char ttytype[]; /* needed for backward compatibility */
+#endif
+
+extern int tigetflag(char *);
+extern int tigetnum(char *);
+extern char *tigetstr(char *);
+
+/* Debugging : use with libdcurses.a */
+
+extern void _init_trace(void);
+extern void _tracef(char *, ...);
+extern char *_traceattr(int mode);
+extern char *_tracechar(const unsigned char mode);
+extern void trace(const unsigned int tracelevel);
+
+/* trace masks */
+#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 */
+
+/* function prototypes */
+
+extern int baudrate(void);
+extern int beep(void);
+extern int cbreak(void);
+extern int clearok(WINDOW *,int);
+extern int copywin(WINDOW *,WINDOW *,int,int,int,int,int,int,int);
+extern int curs_set(int);
+extern int def_prog_mode(void);
+extern int def_shell_mode(void);
+extern int delwin(WINDOW *);
+extern WINDOW *derwin(WINDOW *,int,int,int,int);
+extern int doupdate(void);
+extern WINDOW *dupwin(WINDOW *);
+extern int echo(void);
+extern int endwin(void);
+extern char erasechar(void);
+extern int flash(void);
+extern int flushinp(void);
+extern int halfdelay(int);
+extern int idlok(WINDOW *,int);
+extern int intrflush(WINDOW *,bool);
+extern int is_linetouched(WINDOW *,int);
+extern int is_wintouched(WINDOW *);
+extern WINDOW *initscr(void);
+extern int isendwin(void);
+extern char *keyname(int);
+extern int keypad(WINDOW *,int);
+extern char killchar(void);
+extern int leaveok(WINDOW *,int);
+extern char *longname(void);
+extern int meta(WINDOW *,int);
+extern int mvcur(int,int,int,int);
+extern int mvprintw(int,int,char *,...);
+extern int mvscanw(int,int,char *,...);
+extern int mvwin(WINDOW *,int,int);
+extern int mvwprintw(WINDOW *,int,int,char *,...);
+extern int mvwscanw(WINDOW *,int,int,char *,...);
+extern WINDOW *newpad(int,int);
+extern SCREEN *newterm(char *,FILE *,FILE *);
+extern WINDOW *newwin(int,int,int,int);
+extern int nl(void);
+extern int nocbreak(void);
+extern int nodelay(WINDOW *,int);
+extern int noecho(void);
+extern int nonl(void);
+extern int noraw(void);
+extern int notimeout(WINDOW *,bool);
+extern int overlay(WINDOW *,WINDOW *);
+extern int overwrite(WINDOW *,WINDOW *);
+extern int pnoutrefresh(WINDOW *,int,int,int,int,int,int);
+extern int prefresh(WINDOW *,int,int,int,int,int,int);
+extern int printw(char *,...);
+extern int putp(char *);
+extern int raw(void);
+extern int reset_prog_mode(void);
+extern int reset_shell_mode(void);
+extern int resetty(void);
+extern int ripoffline(int line, int (*init)(WINDOW *, int));
+extern int savetty(void);
+extern int scanw(char *,...);
+extern int scrollok(WINDOW *,int);
+extern SCREEN *set_term(SCREEN *);
+extern int setupterm(char *,int,int *);
+extern WINDOW *subwin(WINDOW *,int,int,int,int);
+extern int timeout(int);
+extern char *tparm(const char *, ...);
+extern int tputs(const char *,int,int (*)(int));
+extern int typeahead(int);
+extern int ungetch(int);
+extern int vidattr(chtype);
+extern int vidputs(chtype,int (*)(int));
+extern int vwscanw(WINDOW *,char *,va_list);
+extern int vwprintw(WINDOW *,char *,va_list);
+extern int waddch(WINDOW *,chtype);
+extern int waddchnstr(WINDOW *,chtype *,int);
+extern int waddnstr(WINDOW *,char *,int);
+extern int wattron(WINDOW *,chtype);
+extern int wattroff(WINDOW *,chtype);
+extern int wbkgd(WINDOW *,chtype);
+extern int wborder(WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype);
+extern int wclear(WINDOW *);
+extern int wclrtobot(WINDOW *);
+extern int wclrtoeol(WINDOW *);
+extern int wdelch(WINDOW *);
+extern int wechochar(WINDOW *, chtype);
+extern int werase(WINDOW *);
+extern int wgetch(WINDOW *);
+extern int wgetnstr(WINDOW *,char *,int maxlen);
+extern int whline(WINDOW *,chtype,int);
+extern int winnstr(WINDOW *, char *, int);
+extern int winsch(WINDOW *,chtype);
+extern int winsdelln(WINDOW *,int);
+extern int winsnstr(WINDOW *,char *,int);
+extern int wmove(WINDOW *,int,int);
+extern int wnoutrefresh(WINDOW *);
+extern int wprintw(WINDOW *,char *,...);
+extern int wredrawln(WINDOW *,int,int);
+extern int wrefresh(WINDOW *);
+extern int wscanw(WINDOW *,char *,...);
+extern int wscrl(WINDOW *,int);
+extern int wsetscrreg(WINDOW *,int,int);
+extern int wtimeout(WINDOW *,int);
+extern int wtouchln(WINDOW *,int,int,int);
+extern int wvline(WINDOW *,chtype,int);
+
+extern bool can_change_color(void);
+extern int color_content(short,short *,short *, short *);
+extern int has_colors(void);
+extern int init_color(short,short,short,short);
+extern int init_pair(short,short,short);
+extern int pair_content(short,short*,short*);
+extern int start_color(void);
+
+extern int slk_init(int);
+extern int slk_set(int,char *,int);
+extern int slk_refresh(void);
+extern int slk_noutrefresh(void);
+extern char *slk_label(int);
+extern int slk_clear(void);
+extern int slk_restore(void);
+extern int slk_touch(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*
+ * pseudo functions
+ */
+#define wgetstr(w, s) wgetnstr(w, s, -1)
+
+#define napms(x) usleep(1000*x)
+#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)->_cury, x = (win)->_curx)
+#define getbegyx(win,y,x) (y = (win)->_begy, x = (win)->_begx)
+#define getmaxyx(win,y,x) (y = (win)->_maxy + 1, x = (win)->_maxx + 1)
+#define getsyx(y,x) getyx(stdscr, y, x)
+#define setsyx(y,x) (stdscr->_cury = y, stdscr->_curx = x)
+
+#define wbkgdset(win,ch) ((win)->_bkgd = ch)
+#define getbkgd(win) ((win)->_bkgd)
+
+/* It seems older SYSV curses define these */
+#define getattrs(win) (win->_attrs)
+#define getmaxx(win) ((win)->_maxx + 1)
+#define getmaxy(win) ((win)->_maxy + 1)
+
+#define winch(win) ((win)->_line[(win)->_cury][(win)->_curx])
+#define wstandout(win) (wattrset(win,A_STANDOUT))
+#define wstandend(win) (wattrset(win,A_NORMAL))
+#define wattrset(win,at) ((win)->_attrs = (at))
+
+#define subpad(p,l,c,y,x) derwin(p,l,c,y,x)
+#define scroll(win) wscrl(win,1)
+
+#define touchwin(win) wtouchln((win), 0, (win)->_maxy + 1, 1)
+#define touchline(win, s, c) wtouchln((win), s, c, 1)
+#define untouchwin(win) wtouchln((win), 0, (win)->_maxy + 1, 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 winsstr(w, s) winsnstr(w, s, 0)
+#define winstr(w, s) winnstr(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 bkgdset(ch) wbkgdset(stdscr,ch)
+#define bkgd(ch) wbkgd(stdscr,ch)
+#define inch() winch(stdscr)
+#define standout() wstandout(stdscr)
+#define standend() wstandend(stdscr)
+#define attron(at) wattron(stdscr,at)
+#define attroff(at) wattroff(stdscr,at)
+#define attrset(at) wattrset(stdscr,at)
+#define addch(ch) waddch(stdscr,ch)
+#define echochar(c) wechochar(stdscr, c)
+#define getch() wgetch(stdscr)
+#define addstr(str) waddnstr(stdscr,str,-1)
+#define getstr(str) wgetstr(stdscr,str)
+#define move(y, x) wmove(stdscr,y,x)
+#define clear() wclear(stdscr)
+#define erase() werase(stdscr)
+#define clrtobot() wclrtobot(stdscr)
+#define clrtoeol() wclrtoeol(stdscr)
+#define insertln() winsdelln(stdscr, 1)
+#define winsertln(w) winsdelln(w, 1)
+#define deleteln() winsdelln(stdscr, -1)
+#define wdeleteln(w) winsdelln(w, -1)
+#define refresh() wrefresh(stdscr)
+#define innstr(s,n) winnstr(stdscr,s,n)
+#define insch(c) winsch(stdscr,c)
+#define delch() wdelch(stdscr)
+#define setscrreg(t,b) wsetscrreg(stdscr,t,b)
+#define scrl(n) wscrl(stdscr,n)
+#define timeout(delay) wtimeout(stdscr, delay)
+#define addnstr(str,n) waddnstr(stdscr,str,n)
+#define addchstr(str) waddchstr(stdscr,str)
+#define addchnstr(str,n) waddchnstr(stdscr,str, n)
+#define insdelln(n) winsdelln(stdscr, n)
+#define insstr(s) winsstr(stdscr, s)
+#define insnstr(s,n) winsnstr(stdscr, s, n)
+
+/*
+ * mv functions
+*/
+
+#define mvwaddch(win,y,x,ch) (wmove(win,y,x) == ERR ? ERR : waddch(win,ch))
+#define mvwgetch(win,y,x) (wmove(win,y,x) == ERR ? ERR : wgetch(win))
+#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 mvwgetstr(win,y,x,str) (wmove(win,y,x) == ERR ? ERR : wgetstr(win,str))
+#define mvwinch(win,y,x) (wmove(win,y,x) == ERR ? ERR : winch(win))
+#define mvwdelch(win,y,x) (wmove(win,y,x) == ERR ? ERR : wdelch(win))
+#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 mvaddch(y,x,ch) mvwaddch(stdscr,y,x,ch)
+#define mvgetch(y,x) mvwgetch(stdscr,y,x)
+#define mvaddnstr(y,x,str,n) mvwaddnstr(stdscr,y,x,str,n)
+#define mvaddstr(y,x,str) mvwaddstr(stdscr,y,x,str)
+#define mvgetstr(y,x,str) mvwgetstr(stdscr,y,x,str)
+#define mvinch(y,x) mvwinch(stdscr,y,x)
+#define mvdelch(y,x) mvwdelch(stdscr,y,x)
+#define mvinnstr(y,x,s,n) mvwinnstr(stdscr,y,x,s,n)
+#define mvinsch(y,x,c) mvwinsch(stdscr,y,x,c)
+#define mvwinsstr(w, y, x, s) (wmove(w,y,x) == ERR ? ERR : winsstr(w,s))
+#define mvwinsnstr(w, y, x, s, n) (wmove(w,y,x) == ERR ? ERR : winsnstr(w,s,n))
+#define mvinsstr(y,x,s) mvwinsstr(stdscr,y,x,s)
+#define mvinsnstr(y,x,s,n) mvwinsnstr(stdscr,y,x,s,n)
+
+/* Funny "characters" enabled for various special function keys for input */
+/* Whether such a key exists depend if its definition is in the terminfo entry */
+
+#define KEY_MIN 0401 /* Minimum curses key */
+#define KEY_BREAK 0401 /* break key (unreliable) */
+#define KEY_DOWN 0402 /* The four arrow keys ... */
+#define KEY_UP 0403
+#define KEY_LEFT 0404
+#define KEY_RIGHT 0405 /* ... */
+#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)) /* keys is reserved. */
+#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 backwards (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 or copy */
+#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 key */
+#define KEY_BEG 0542 /* beg(inning) key */
+#define KEY_CANCEL 0543 /* cancel key */
+#define KEY_CLOSE 0544 /* close key */
+#define KEY_COMMAND 0545 /* cmd (command) key */
+#define KEY_COPY 0546 /* copy key */
+#define KEY_CREATE 0547 /* create key */
+#define KEY_END 0550 /* end key */
+#define KEY_EXIT 0551 /* exit key */
+#define KEY_FIND 0552 /* find key */
+#define KEY_HELP 0553 /* help key */
+#define KEY_MARK 0554 /* mark key */
+#define KEY_MESSAGE 0555 /* message key */
+#define KEY_MOVE 0556 /* move key */
+#define KEY_NEXT 0557 /* next object key */
+#define KEY_OPEN 0560 /* open key */
+#define KEY_OPTIONS 0561 /* options key */
+#define KEY_PREVIOUS 0562 /* previous object key */
+#define KEY_REDO 0563 /* redo key */
+#define KEY_REFERENCE 0564 /* ref(erence) key */
+#define KEY_REFRESH 0565 /* refresh key */
+#define KEY_REPLACE 0566 /* replace key */
+#define KEY_RESTART 0567 /* restart key */
+#define KEY_RESUME 0570 /* resume key */
+#define KEY_SAVE 0571 /* save key */
+#define KEY_SBEG 0572 /* shifted beginning key */
+#define KEY_SCANCEL 0573 /* shifted cancel key */
+#define KEY_SCOMMAND 0574 /* shifted command key */
+#define KEY_SCOPY 0575 /* shifted copy key */
+#define KEY_SCREATE 0576 /* shifted create key */
+#define KEY_SDC 0577 /* shifted delete char key */
+#define KEY_SDL 0600 /* shifted delete line key */
+#define KEY_SELECT 0601 /* select key */
+#define KEY_SEND 0602 /* shifted end key */
+#define KEY_SEOL 0603 /* shifted clear line key */
+#define KEY_SEXIT 0604 /* shifted exit key */
+#define KEY_SFIND 0605 /* shifted find key */
+#define KEY_SHELP 0606 /* shifted help key */
+#define KEY_SHOME 0607 /* shifted home key */
+#define KEY_SIC 0610 /* shifted input key */
+#define KEY_SLEFT 0611 /* shifted left arrow key */
+#define KEY_SMESSAGE 0612 /* shifted message key */
+#define KEY_SMOVE 0613 /* shifted move key */
+#define KEY_SNEXT 0614 /* shifted next key */
+#define KEY_SOPTIONS 0615 /* shifted options key */
+#define KEY_SPREVIOUS 0616 /* shifted prev key */
+#define KEY_SPRINT 0617 /* shifted print key */
+#define KEY_SREDO 0620 /* shifted redo key */
+#define KEY_SREPLACE 0621 /* shifted replace key */
+#define KEY_SRIGHT 0622 /* shifted right arrow */
+#define KEY_SRSUME 0623 /* shifted resume key */
+#define KEY_SSAVE 0624 /* shifted save key */
+#define KEY_SSUSPEND 0625 /* shifted suspend key */
+#define KEY_SUNDO 0626 /* shifted undo key */
+#define KEY_SUSPEND 0627 /* suspend key */
+#define KEY_UNDO 0630 /* undo key */
+#define KEY_MAX 0777 /* Maximum curses key */
+
+#endif
diff --git a/lib/libncurses/curses.priv.h b/lib/libncurses/curses.priv.h
new file mode 100644
index 0000000..85f54b7
--- /dev/null
+++ b/lib/libncurses/curses.priv.h
@@ -0,0 +1,135 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+ * curses.priv.h
+ *
+ * Header file for curses library objects which are private to
+ * the library.
+ *
+ */
+
+#ifndef __GNUC__
+#define inline
+#endif
+
+#ifndef NOACTION
+#include <unistd.h>
+typedef struct sigaction sigaction_t;
+#else
+#include "SigAction.h"
+#endif
+
+#include "curses.h"
+
+#define min(a,b) ((a) > (b) ? (b) : (a))
+#define max(a,b) ((a) < (b) ? (b) : (a))
+
+#define FG(n) ((n) & 0x0f)
+#define BG(n) (((n) & 0xf0) >> 4)
+
+#define TextOf(c) ((c) & (chtype)A_CHARTEXT)
+#define AttrOf(c) ((c) & (chtype)A_ATTRIBUTES)
+
+#define BLANK (' '|A_NORMAL)
+
+#define CHANGED -1
+
+#define ALL_BUT_COLOR ((chtype)~(A_COLOR))
+
+/* Macro to put together character and attribute info and return it.
+ If colors are in the attribute, they have precedence. */
+#define ch_or_attr(ch,at) \
+ ((PAIR_NUMBER(at) > 0) ? \
+ ((((chtype)ch) & ALL_BUT_COLOR) | (at)) : ((((chtype)ch) | (at))))
+
+extern WINDOW *newscr;
+
+#ifdef TRACE
+#define T(a) if (_tracing & TRACE_ORDINARY) _tracef a
+#define TR(n, a) if (_tracing & (n)) _tracef a
+extern int _tracing;
+extern char *visbuf(const char *);
+#else
+#define T(a)
+#define TR(n, a)
+#endif
+
+extern int _outch(int);
+extern void init_acs(void);
+extern void tstp(int);
+extern WINDOW *makenew(int, int, int, int);
+extern int timed_wait(int fd, int wait, int *timeleft);
+extern chtype _nc_background(WINDOW *);
+extern chtype _nc_render(WINDOW *, chtype);
+
+struct try {
+ struct try *child; /* ptr to child. NULL if none */
+ struct try *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. */
+};
+
+/*
+ * Structure for soft labels.
+ */
+
+typedef struct {
+ char dirty; /* all labels have changed */
+ char hidden; /* soft lables are hidden */
+ WINDOW *win;
+ struct slk_ent {
+ char text[9]; /* text for the label */
+ char form_text[9]; /* formatted text (left/center/...) */
+ int x; /* x coordinate of this field */
+ char dirty; /* this label has changed */
+ char visible; /* field is visible */
+ } ent[8];
+} SLK;
+
+#define FIFO_SIZE 32
+
+struct screen {
+ FILE *_ifp; /* input file ptr for this terminal */
+ FILE *_ofp; /* output file ptr for this terminal */
+ int _checkfd;
+#ifdef MYTINFO
+ struct _terminal *_term;
+#else
+ struct term *_term; /* used by terminfo stuff */
+#endif
+ WINDOW *_curscr; /* windows specific to a given terminal */
+ WINDOW *_newscr;
+ WINDOW *_stdscr;
+ struct try *_keytry; /* "Try" for use with keypad mode */
+ unsigned int _fifo[FIFO_SIZE]; /* Buffer for pushed back characters */
+ signed char _fifohead,
+ _fifotail,
+ _fifopeek;
+ bool _endwin;
+ chtype _current_attr;
+ bool _coloron;
+ int _cursor; /* visibility of the cursor */
+ int _cursrow; /* Row and column of physical cursor */
+ int _curscol;
+ bool _nl; /* True if NL -> CR/NL is on */
+ bool _raw; /* True if in raw mode */
+ int _cbreak; /* 1 if in cbreak mode */
+ /* > 1 if in halfdelay mode */
+ bool _echo; /* True if echo on */
+ bool _nlmapping; /* True if terminal is really doing */
+ /* NL mapping (fn of raw and nl) */
+ SLK *_slk; /* ptr to soft key struct / NULL */
+ int _costs[9]; /* costs of cursor movements for mvcur */
+ int _costinit; /* flag wether costs[] is initialized */
+};
+
+extern struct screen *SP;
+
+extern int _slk_format; /* format specified in slk_init() */
+
+#define MAXCOLUMNS 135
+#define MAXLINES 66
+#define UNINITIALISED ((struct try * ) -1)
diff --git a/lib/libncurses/doc/color.doc b/lib/libncurses/doc/color.doc
new file mode 100644
index 0000000..55f3346
--- /dev/null
+++ b/lib/libncurses/doc/color.doc
@@ -0,0 +1,71 @@
+
+ 5.10. Color Manipulation
+
+ Ncurses provides support for the use of color on terminals
+ that are capable of display it. Note the BSD and older SYSV
+ curses don't support color. Color support in the PC version
+ is not compatible with SYSR4.
+
+ has_colors()
+ this function returns TRUE if the terminal supports color,
+ FALSE otherwise. Other color handling funtions will return
+ ERR if has_colors() is FALSE. You should always check before
+ using color and use other video attributes to replace color.
+
+ can_change_color()
+ This function returns TRUE if the terminal is capable of
+ redefining colors using the init_color function, FALSE if it
+ can't. Don't use init_color and color_content if it returns
+ FALSE.
+
+ start_color()
+ This function must be called before any other color handling
+ function is called. It initializes the 8 basic colors (see
+ appendix I) and sets the global variables COLORS and COLOR_
+ PAIRS to the maximum number of colors and color-pairs a
+ terminal can handle.
+
+ init_pair(pair, fg, bg)
+ This function changes the definition of a color-pair, pair.
+ Each pair has a foregroung color fg, and a background color
+ bg. Both values must be between 0 and COLORS-1. pair must be
+ between 1 and COLOR_PAIRS-1.
+ [If a pair is changed from a previous definition, the screen
+ is refreshed and all occurances of the color-pair are
+ changed to reflect the change.]
+
+ pair_content(pair, f, b)
+ This function stores the foreground and background colors of
+ the color-pair pair into the variables pointed to by f, b.
+ pair should be between 1 and COLOR_PAIRS-1.
+
+ init_color(color, r, g, b)
+ This function changes the value of a given color. A color is
+ defined by its red, green, and blue components, r, g, and b.
+ These values must be between 0 and 1000. color should be
+ between 0 and COLORS-1.
+
+ color_content(color, r, g, b)
+ This function puts the red, green, and blue components of
+ color into the variable pointed to by r, g, b respectively.
+ color should be between 0 and COLORS-1.
+
+ COLOR_PAIR(n) set color-pair to that stored in n
+ PAIR_NUMBER(a) get color-pair stored in attribute a
+
+
+ Appendix II: COLORS
+ -------------------
+
+ Colors are defined in <ncurses.h> are used with init_pair().
+
+ COLOR_BLACK 0
+ COLOR_RED 1
+ COLOR_GREEN 2
+ COLOR_YELLOW 3
+ COLOR_BLUE 4
+ COLOR_MAGENTA 5
+ COLOR_CYAN 6
+ COLOR_WHITE 7
+
+
diff --git a/lib/libncurses/doc/manual.doc b/lib/libncurses/doc/manual.doc
new file mode 100644
index 0000000..5ae7d39
--- /dev/null
+++ b/lib/libncurses/doc/manual.doc
@@ -0,0 +1,1361 @@
+
+
+
+
+
+
+
+
+
+ The Curses Reference Manual
+
+ Pavel Curtis 1982
+ Zeyd M. Ben-Halim 1993
+ zmbenhal@netcom.com
+
+
+
+
+
+
+ Caveat Emptor:
+ I'm slowly but surely updating the documentation of
+ ncurses to reflect the current status of the code. The text
+ below may refer to yet to be implemented functions or
+ missing functionality. Description of functions may be
+ missing or out of date. ncurses is aimed at being compatible
+ with AT&T curses as defined in SysVR4.
+
+ There is no ?roff sources for this document. I may one day
+ go nuts and create one, but don't hold your breath :-)
+
+ 1. Introduction
+
+ Terminfo is a database describing many capabilities of over
+ 150 different terminals. Curses is a subroutine package
+ which presents a high level screen model to the programmer,
+ while dealing with issues such as terminal differences and
+ optimization of output to change one screenfull of text into
+ another.
+ Terminfo is based on Berkeley's termcap database, but con-
+ tains a number of improvements and extensions. Parameterized
+ strings are introduced, making it possible to describe such
+ capabilities as video attributes, and to handle far more
+ unusual terminals than possible with termcap.
+ Curses is also based on Berkeley's curses package, with many
+ improvements. The 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.+
+
+ 2. An Overview of the Package
+
+ 2.1. Terminology
+
+ In this document, the following terminology is kept
+ to with reasonable consistency:
+
+ window An internal representation containing an image of
+ what a section of the terminal screen may look
+ like at some point in time. This subsection can
+ either encompass the entire terminal screen, or
+ any smaller portion down to a single character
+ within that screen.
+ terminal Sometimes called terminal screen. The package's
+ idea of what the terminal's screen currently looks
+ like, i.e., what the user sees now. This is a
+ special screen.
+ screen This is 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 automati-
+ cally provided for the programmer.
+
+ 2.2. Compiling Programs using the Package
+
+ In order to use the library, it is necessary to have
+ certain types and variables defined. Therefore, the pro-
+ grammer must have a line:
+ #include <ncurses.h>
+ at the top of the program source. The screen package
+ uses the Standard I/O library, so <ncurses.h> includes
+ <stdio.h>. Ncurses also includes <termios.h>, <termio.h>, or
+ <sgtty.h> depending on your system. It is redundant (but
+ harmless) for the programmer to do it, too. In linking with
+ ncurses you need to have `-lncurses' in your LDFLAGS or on
+ the command line. There is no need for any other libraries.
+
+ 2.3. 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 is more like an
+ array of characters on which to make changes.
+ When one has a window which describes what some part of
+ the terminal screen should look like, the routine refresh()
+ (or wrefresh() if the window is not stdscr) is called.
+ Refresh() in the area covered by the window, look like that
+ window. Note, therefore, that changing something on a win-
+ dow does not change the terminal. Actual updates to the
+ terminal screen are made only by calling refresh() or wre-
+ fresh(). This allows the programmer to maintain several
+ different ideas of what a portion of the terminal screen
+ should look like. 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 worry about the best way to do
+ this.
+
+ 2.4. 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 pro-
+ grammer wants the terminal to look like next. The user
+ should never really access curscr directly. Changes should
+ be made to the appropriate screen, and then the routine
+ refresh() (or wrefresh()) should be called.
+ Many functions are set up to deal with stdscr as a
+ default screen. For example, to add a character to stdscr,
+ one calls addch() with the desired character. If a differ-
+ ent window is to be used, 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 rou-
+ tines which do not do this are those to 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 clumsy-
+ ness, most I/O routines can be preceded by the prefix 'mv'
+ and the desired (y, x) coordinates then can be added 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 such pointers are need,
+ they are always the first parameters passed.
+
+ 3. Variables
+
+ Many variables which are used to describe the terminal
+ environment are available to the programmer. They are:
+
+ type name description
+ ------------------------------------------------------------------
+ WINDOW *curscr current version of the screen (terminal screen).
+ WINDOW *stdscr standard screen. Most updates are done here.
+ int LINES number of lines on the terminal
+ int COLS number of columns on the terminal
+
+ There are also several `#define' constants and types which
+ are of general usefulness:
+
+ bool boolean type, actually a `char' (e.g., bool doneit;)
+ TRUE boolean `true' flag (1).
+ FALSE boolean `false' flag (0).
+ ERR -1 error flag returned by routines on a fail.
+ OK 0 error flag returned by routines when things
+ go right.
+
+ 4. Usage
+
+ This is a description of how to actually use the screen
+ package. In it, we assume all updating, reading, etc. is
+ applied to stdscr. All instructions will work on any win-
+ dow, with changing the function name and parameters as men-
+ tioned above.
+
+ 4.1. 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 functions are
+ performed by initscr(). Since it must allocate space for the
+ windows, it can overflow memory when attempting to do so. On
+ this rather rare occasion, initscr() returns ERR.
+ 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().
+ Now that the screen windows have been allocated, you
+ can set them up for the run. If you want to, say, allow the
+ window to scroll, use scrollok(). If you want the cursor to
+ be left 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. New windows of your
+ own can be created, too, by using the functions newwin(),
+ derwin(), and subwin(). delwin() will allow you to get rid
+ of old windows.
+
+ 4.2. Output
+
+ Now that we have set things up, we will want to actu-
+ ally 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,
+ returning ERR if it would cause the window to illegally
+ scroll, i.e., printing a character in the lower right-hand
+ corner of a terminal which automatically scrolls if
+ scrolling is not allowed. 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 win-
+ dow has been changed, thus making refresh() check the whole
+ subsection of the terminal for changes.
+ If you call wrefresh() with curscr(), it will make the
+ screen look like curscr thinks it looks like. This is use-
+ ful for implementing a command which would redraw the screen
+ in case it get messed up.
+
+ 4.3. Input
+
+ Input is essentially a mirror image of output. 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 echo-
+ ing enable and is in nocreak mode, one or the other has to
+ changed before calling getch(). The result of not doing this
+ is unpredictable output.
+
+ 4.4. Miscellaneous
+
+ A plethora of other functions exist for maintaining and
+ changing information about the windows. For the most part,
+ the descriptions in section 5 should suffice.
+
+ 4.5. Finishing Up
+
+ In order to do certain optimizations, and, on some ter-
+ minals, to work at all, some things must be done before the
+ screen routines start up. In order to clean up after the
+ routines, the routine endwin() is provided. It restores tty
+ modes to what they were when initscr() was first called,
+ moves the cursor down to the lower-left corner, etc. Thus,
+ anytime after the call to initscr, endwin() should be called
+ before exiting.
+
+ 5. Descriptions of the Functions
+
+ This section describes all the functions available to the
+ programmer in the curses package. For an alphabetical list,
+ see the manual page ncurses(3).
+
+ 5.1. Initialization
+
+ These functions are called when initializing a program.
+
+ initscr()
+ The first function called should 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 writen to standard error and the program exits. Otherwise
+ it returns a pointer to stdscr. Some function may be called
+ before initscr (slk_init, filter, ripofflines, use_env, and
+ if you are using multiple terminals newterm.)
+
+ endwin()
+ A 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 nonvisual mode.
+ Calling refresh() or doupdate() after a temporary escape
+ from the program will restore the screen to its original
+ status.
+
+ 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
+ must called for each terminal opened using this function.
+
+ set_term(new)
+ This function is used to switch to a different terminal.
+ The screen reference for the new terminal is passed as the
+ parameter. The previous terminal is returned by the func-
+ tion. All other calls affect only the current terminal.
+
+ delscreen(sp)
+
+ longname()
+ This function returns a pointer to a static area containing
+ a verbose description of the current terminal. It is defined
+ only after a call to initscr or newterm.
+
+ termattrs()
+
+ termname()
+
+ 5.2. Option Setting
+
+ These functions set options within curses. In each case,
+ win is the window affected, and bf is a boolean flag with
+ value TRUE or FALSE indicating whether to enable or disable
+ the option. All options are initially FALSE. It is not
+ necessary to turn these options off before calling endwin.
+
+ clearok(win,bf)
+ If set, the next call to wrefresh with this window will
+ clear the screen and redraw the entire screen. If win is
+ curscr, the next call to wrefresh with any window will cause
+ the screen to be cleared. This is useful when the contents
+ of the screen are uncertain, or in some cases for a more
+ pleasing visual effect.
+
+ idlok(win,bf)
+ If enabled, curses will consider using the hardware
+ insert/delete line feature of terminals so equipped. If
+ disabled, curses will not use this feature. Enable this
+ option only if your application needs insert/delete line,
+ for example, for a screen editor. It is disabled by default
+ because insert/delete line is visually annoying when used in
+ applications where it isn't really needed.
+
+ idcok(win,bf)
+ This option allows curses will use inset/delete character
+ capabilities if any are defined. This option is on be
+ default.
+
+ immedok(win,bf)
+ If this option is enabled any change in the window's image
+ causes a call to wrefresh. Enabling this option can degrade
+ performance; it is disabled by default.
+
+ keypad(win,bf)
+ This option enables the keypad of the users terminal. If
+ enabled, the user can press a function key (such as an arrow
+ key) and getch will return a single value representing the
+ function key. If disabled, curses will not treat function
+ keys specially. If the keypad in the terminal can be turned
+ on (made to transmit) and off (made to work locally), turn-
+ ing on this option will turn on the terminal keypad. All the
+ possible function keys are defined in ncurses.h as KEY_*.
+
+ leaveok(win,bf)
+ Normally, the hardware cursor is left at the location of the
+ window cursor being refreshed. This option allows the cur-
+ sor to be left wherever the update happens to leave it. It
+ is useful for applications where the cursor is not used,
+ since it saves cursor motions. If possible, the cursor is
+ made invisible when this option is enabled.
+
+ meta(win,bf)
+ If enabled, characters returned by getch are transmitted
+ with all 8 bits, instead of stripping the highest bit. It
+ is useful for extending the non-text command set in applica-
+ tions where the terminal has a meta shift key, such as
+ EMACS. NOTE: This function is currently unsupported.
+
+ notimeout(win,bf)
+ This option controls whether a timer is set when wgetch is
+ trying to interpret an input sequence. See keypad.
+
+ scrollok(win,bf)
+ This option controls what happens when the cursor of a win-
+ dow is moved off the edge of the window, either from a new-
+ line on the bottom line, or typing the last character of the
+ last line. If disabled, the cursor is left on the bottom
+ line. If enabled, wrefresh is called on the window, and then
+ the physical terminal and window are scrolled up one line.
+
+ setscrreg(t,b)
+ wsetscrreg(win,t,b)
+ These functions allow the user to set a software scrolling
+ region in a window win or stdscr. t and b are the line num-
+ bers of the top and bottom margin of the scrolling region.
+ (Line 0 is the top line of the screen.) If this option and
+ scrollok are enabled, an attempt to move off the bottom mar-
+ gin line will cause all lines in the scrolling region to
+ scroll up one line. Note that this has nothing to do with
+ use of a physical scrolling region capability in the termi-
+ nal, like that in the VT100. Only the text of the window is
+ scrolled.
+ The scrolling region really acts as a sort of barrier, lim-
+ iting the area of a window over which changes take place.
+ For this reason, an attempt to create a scrolling region in
+ an area of the screen which does not contain the current (y,
+ x) coordinates for that window is an error. Similarly,
+ attempts to move the (y, x) coordinates out of the region
+ will also fail with an ERR return.
+ When a scrolling region is in place, all changes are limited
+ to the region. For example, erase() will only erase the
+ area inside the region; insertln() will only shift lines
+ down to the bottom of the region, etc. It is anticipated
+ that this method of controlling the area of change will
+ prove quite handy in a number of applications.
+ To disable the scrolling region, once defined, simply rede-
+ fine it to be the whole window. For example, to disable the
+ scrolling region on stdscr, the following call would be
+ used:
+ setscrreg(0, LINES - 1)
+ For other windows, the height of the window should be used
+ instead of (LINES - 1).
+
+ 5.3. Terminal Mode Setting
+
+ These functions are used to set modes in the tty driver. The
+ initial mode usually depends on the setting when the program
+ was called: the initial modes documented here represenet the
+ normal situation.
+
+ cbreak()
+ nocbreak()
+ crmode()
+ nocrmode()
+ These functions put the terminal into and out of CBREAK
+ mode. In this mode, characters typed by the user are immedi-
+ ately available to the program. When out of this mode, the
+ device driver will buffer characters typed until newline is
+ typed. Interrupt and flow control characters are unaffected
+ by this mode. Initially the terminal is not in CBREAK mode.
+ Most interactive programs using curses will set this mode.
+ The functions crmode() and nocrmode() are the result of an
+ accident in the first version of curses and are retained
+ solely for upward compatibility. crmode() is the same as
+ cbreak() and nocrmode() is the same as nocbreak(). See 4.3
+ for a important note on using these functions.
+
+ raw()
+ noraw()
+ These functions put the terminal into and out of RAW mode.
+ RAW mode is just like CBREAK mode except that no special
+ character processing is done (e.g. the interrupt character
+ will be passed through to the program, uninterpreted, as
+ will the kill character, etc.) and all 8 bits of the input
+ character are retained; in CBREAK mode, the eighth bit is
+ stripped off before it is given to the program. Because of
+ the lack of interpretation of special characters, it is not
+ recommended that programs use this mode.
+
+ echo()
+ noecho()
+ These functions control whether characters typed by the user
+ are echoed as typed. Initially, characters typed are echoed
+ by the teletype driver. Authors of most interactive pro-
+ grams prefer to do their own echoing in a controlled area of
+ the screen, or not to echo at all, so they disable echoing.
+
+ halfdelay(t)
+ This options is similar to cbreak mode except that if after
+ blocking for t tenth of a seconds no input is received ERR
+ is returned. t must between 1 and 255. Use nocbreak to leave
+ this mode.
+
+ nodelay(win,bf)
+ This option causes getch to be a non-blocking call. If no
+ input is ready, getch will return ERR. If disabled, getch
+ will hang until a key is pressed.
+
+ timeout(t)
+ wtimeout(win,t)
+ These functions offer control over the blocking action of a
+ read. If t is negative, reading will block until there is
+ input. If t is zero, no blocking will occur, read returns
+ ERR if no input is available. If t is posistive, the read
+ will block for t milliseconds and return ERR if there is
+ still no input.
+ These routines offer better and finer control than nodelay()
+ and halfdelay() and their use is recommended.
+
+ nl()
+ nonl()
+ These functions control whether newline is translated into
+ carriage return and linefeed on output, and whether return
+ is translated into newline on input. Initially, the trans-
+ lations do occur. By disabling these translations, curses
+ is able to make better use of the linefeed capability,
+ resulting in faster cursor motion.
+
+ savetty()
+ resetty()
+ These functions save and restore the state of the tty modes.
+ savetty saves the current state in a buffer, resetty
+ restores the state to what it was at the last call to save-
+ tty.
+
+ 5.4. Window Manipulation
+
+ newwin(num_lines, num_cols, begy, begx)
+ Create a new window with the given number of lines and
+ columns. The upper left corner of the window is at line
+ begy column begx. If either num_lines or num_cols is zero,
+ they will be defaulted to LINES-begy and COLS-begx. A new
+ full-screen window is created by calling newwin(0,0,0,0).
+
+ subwin(orig, num_lines, num_cols, begy, begx)
+ Create a new window with the given number of lines and
+ columns. The window is at position (begy, begx) on the
+ screen. (It is relative to the screen, not orig.) The win-
+ dow is made in the middle of the window orig, so that
+ changes made to one window will affect both windows. When
+ using this function, often it will be necessary to call
+ touchwin before calling wrefresh.
+
+ derwin(orig, num_lines, num_cols, begy, begx)
+ Is similar to subwin only the new window is created relative
+ to the original window, not the screen.
+
+ delwin(win)
+ Deletes the named window, freeing up all memory associated
+ with it. In the case of sub-windows, they should be deleted
+ before the main window.
+
+ dupwin(win)
+
+ mvderwin(win,y,x)
+
+ syncok(win,bf)
+ wsyncup(win)
+ wcursyncup(win)
+ wsyncdown(win)
+
+ mvwin(win, by, bx)
+ Move the window so that the upper left corner will be at
+ position (by, bx). If the move would cause the window to be
+ off the screen, it is an error and the window is not moved.
+
+ touchline(win,start,count)
+ touchwin(win)
+ Throw away all optimization information about which parts of
+ the window have been touched, by pretending the entire win-
+ dow has been drawn on. This is sometimes necessary when
+ using overlapping windows, since a change to one window will
+ affect the other window, but the optimization records of the
+ other window will not reflect the change.
+
+ wtouchln(win,y,n,changed)
+ Throw away optimization information, or mark as unchanged,
+ n lines starting at y, depending on the value of changed.
+
+ untouchwin(win)
+ Mark the whole window as unchcnged since the lat wrefresh.
+
+ is_linetouched(win,line)
+ is_wintouched(win)
+ These routines are used to check if the given line/window
+ has been modified since the last wrefresh. They will return
+ TRUE is that is the case, FALSE otherwise. is_linetouched
+ will return ERR if there is no such line.
+
+ overlay(win1, win2)
+ overwrite(win1, win2)
+ These functions overlay win1 on top of win2, that is, all
+ text in win1 is copied into win2, after lining up the two
+ windows' origins. The difference between the functions is
+ that overlay is nondestructive (blanks are not copied) while
+ overwrite is destructive.
+
+ copywin(win,win,sminrow,smincol,dminrow,dmincol,dmaxrow,
+ dmaxcol,overlay)
+ Low level function used to implement overlay/overwrite.
+
+ 5.5. Causing Output to the Terminal
+
+ refresh()
+ 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 physi-
+ cal terminal screen, taking into account what is already
+ there in order to do optimizations. refresh is the same,
+ using stdscr as a default screen. Unless leaveok has been
+ enabled, the physical cursor of the terminal is left at the
+ location of the window's cursor.
+
+ doupdate()
+ wnoutrefresh(win)
+ These two functions allow multiple updates with more effi-
+ ciency 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 wre-
+ fresh 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 out-
+ put, with probably fewer total characters transmitted.
+
+ redrawwin(win)
+ wredrawln(win,start,count)
+
+ 5.6. Writing on Window Structures
+
+ These routines are used to ``draw'' text on windows. In all
+ cases, a missing win is taken to be stdscr. y and x are the
+ row and column, respectively. The upper left corner is
+ always (0, 0) not (1, 1). The mv functions imply a call to
+ move before the call to the other function.
+
+ 5.6.1. Moving the Cursor
+
+ move(y, x)
+ wmove(win, y, x)
+ The cursor associated with the window is moved to the given
+ location. This does not move the physical cursor of the
+ terminal until refresh is called.
+
+ 5.6.2. Writing One Character
+
+ addch(ch)
+ waddch(win, ch)
+ mvaddch(y, x, ch)
+ mvwaddch(win, y, x, ch)
+ The character ch is put in the window at the current cursor
+ position of the window. If ch is a tab, newline, or
+ backspace, the cursor will be moved appropriately in the
+ window. If ch is a different control character, it will be
+ drawn in the ^X notation. The position of the window cursor
+ is advanced. At the right margin, an automatic newline is
+ performed. At the bottom of the scrolling region, if scrol-
+ lok is enabled, the scrolling region will be scrolled up one
+ line.
+
+ 5.6.3. Writing a String
+
+ addstr(str)
+ addnstr(str,n)
+ waddstr(win,str)
+ waddnstr(win,str,n)
+ mvaddstr(y,x,str)
+ mvaddnstr(y,x,str,n)
+ mvwaddstr(win,y,x,str)
+ mvwaddnstr(win,y,x,str,n)
+ These functions write all the characters of the null termi-
+ nated character string str on the given window. They are
+ identical to a series of calls to addch. Routines with 'n'
+ write n characters of str. If n is -1 then the entire string
+ is written.
+
+ addchstr(chstr)
+ addchnstr(chstr,n)
+ waddchstr(win,chstr)
+ waddchnstr(win,chstr,n)
+ mvaddchstr(y,x,chstr)
+ mvaddchnstr(y,x,chstr,n)
+ mvwaddchstr(win,y,x,chstr)
+ mvwaddchnstr(win,y,x,chstr,n)
+ These functions copy chstr onto the window image starting at
+ the current cursor position. Routines with 'n' write at most
+ n characters of chstr (as many as will fit on the line). If
+ n is -1 then the entire string is written. The cursor is not
+ advanced and no checking for control characters is done.
+ These routines are faster than the addstr() group. chstr is
+ a pointer to an array of chtype.
+
+ 5.6.4. Clearing Areas of the Screen
+
+ erase()
+ werase(win)
+ These functions copy blanks to every position in the window.
+
+ clear()
+ wclear(win)
+ These functions are like erase and werase but they also call
+ clearok, arranging that the screen will be cleared on the
+ next refresh. The result can visually annoying.
+
+ clrtobot()
+ wclrtobot(win)
+ All lines below the cursor in this window are erased. Also,
+ the current line to the right of the cursor is erased.
+
+ clrtoeol()
+ wclrtoeol(win)
+ The current line to the right of the cursor is erased.
+
+ 5.6.5. Inserting and Deleting Text
+
+ delch()
+ wdelch(win)
+ mvdelch(y,x)
+ mvwdelch(win,y,x)
+ The character under the cursor in the window is deleted.
+ All characters to the right on the same line are moved to
+ the left one position. This does not imply use of the hard-
+ ware delete character feature.
+
+ deleteln()
+ wdeleteln(win)
+ The line under the cursor in the window is deleted. All
+ lines below the current line are moved up one line. The
+ bottom line of the window is cleared. This does not imply
+ use of the hardware delete line feature.
+
+ insch(c)
+ winsch(win, c)
+ mvinsch(y,x,c)
+ mvwinsch(win,y,x,c)
+ The character c is inserted before the character under the
+ cursor. All characters to the right are moved one space to
+ the right, possibly losing the rightmost character on the
+ line. This does not imply use of the hardware insert char-
+ acter feature.
+
+ insertln()
+ winsertln(win)
+ A blank line is inserted above the current line. The bottom
+ line is lost. This does not imply use of the hardware
+ insert line feature.
+
+ 5.6.6. Formatted Output
+
+ printw(fmt, ...)
+ wprintw(win, fmt, ...)
+ mvprintw(y, x, fmt, ...)
+ mvwprintw(win, y, x, fmt, ...)
+ vwprintw(win, fmt, va_list)
+ These functions correspond to printf. The characters which
+ would be output by printf are instead output using waddch on
+ the given window. vwprintw() acts like vprintf().
+
+ 5.6.7. Line drawing
+
+ Borders are drawn inside a window and not around it.
+
+ border(ls, rs, ts, bs, tl, tr, bl, br)
+ wborder(win, ls, rs, ts, bs, tl, tr, bl, br)
+ box(win, vert, hor)
+ A border is drawn around the edges of the window. ls, rs,
+ ts, bs, tl, tr, bl, and br are the character and attribute
+ to draw the left side, right side, top side, bottom side,
+ top left, top right, bottom left, and bottom right respec-
+ tively.
+ If any of these are 0, the follwing defaults are used:
+ ACS_VLINE. ACS_VLINE, ACS_HLINE, ACS_HLINE, ACS_ULCORNER,
+ ACS_URCORNER, ACS_LLCORNER, ACS_LRCORNER. box is shorthand
+ for wborder(win, vert, vert, hor, hor, 0, 0, 0, 0).
+
+ vline(ch,n)
+ wvline(win,ch,n)
+ These functions draw a vertical line starting at the current
+ cursor position using ch for n characters or as many as will
+ fit on the window. The cursor position is not advanced.
+
+ hline(ch,n)
+ whline(win,ch,n)
+ These functions draw a horizontal line starting at the
+ current cursor position using ch for n characters or as many
+ as will fit on the window. The cursor position is not
+ advanced.
+
+ 5.6.8 Scrolling
+
+ Scrolling only works if enabled via scrollok(). The cursor
+ position is unchanged by these functions. As an optimization
+ the physical screen is scrolled if the window in question is
+ covering the entire screen.
+
+ scroll(win)
+ The window is scrolled up one line. This involves moving
+ the lines in the window data structure.
+
+ scrl(n)
+ wscrl(win,n)
+ These functions scroll thw window up/down n lines depending
+ on the sign on n (+ for up, - for down).
+
+ 5.7. Querying the Contents of a Window
+
+ getyx(win,y,x)
+ The cursor position of the window is placed in the two
+ integer variables y and x. Since this is a macro, no & is
+ necessary.
+
+ inch()
+ winch(win)
+ mvinch(y,x)
+ mvwinch(win,y,x)
+ The character at the current position in the named window is
+ returned.
+
+ 5.8. Input from the Terminal
+
+ getch()
+ wgetch(win)
+ mvgetch(y,x)
+ mvwgetch(win,y,x)
+ A character is read from the terminal associated with the
+ window. In nodelay mode, if there is no input waiting, the
+ value -1 is returned. In delay mode, the program will hang
+ until a character is typed.
+
+ If keypad mode is enabled, and a function key is pressed,
+ the code for that function key will be returned instead of
+ the raw characters. Possible function keys are defined with
+ integers beginning with 0401, whose names begin with KEY_,
+ defined in <ncurses.h>. If a character is received that
+ could be the beginning of a function key (such as escape),
+ curses will set a one second timer. If the remainder of the
+ sequence does not come in within one second, the character
+ will be passed through, otherwise the function key value
+ will be returned. For this reason, on many terminals, there
+ will be a one second delay after a user presses the escape
+ key. (Use by a programmer of the escape key for a single
+ character function is discouraged.) The one second delay can
+ be turned off using the notimeout() function.
+
+ getstr(str)
+ wgetstr(win,str)
+ mvgetstr(y,x,str)
+ mvwgetstr(win,y,x,str)
+ A series of calls to getch is made, until a newline is
+ received. The resulting value is placed in the area pointed
+ at by the character pointer str. The users erase and kill
+ characters are interpreted, and the string is echoed.
+
+ scanw(fmt, ...)
+ wscanw(win, fmt, ...)
+ mvscanw(y, x, fmt, ...)
+ mvwscanw(win, y, x, fmt, ...)
+ vwscanw(win,fmt,va_list)
+ These functions corresponds to scanf. wgetstr is called on
+ the window, and the resulting line is used as input for the
+ scan.
+
+ 5.9. Video Attributes
+
+ attroff(at)
+ wattroff(win, attrs)
+ attron(at)
+ wattron(win, attrs)
+ attrset(at)
+ wattrset(win, attrs)
+ standout()
+ standend()
+ wstandout(win)
+ wstandend(win)
+ These functions set the current attributes of the named win-
+ dow. These attributes can be any combination of A_STANDOUT,
+ A_REVERSE, A_BOLD, A_DIM, A_BLINK, A_BLANK, A_UNDERLINE,
+ A_PROTECT, A_INVIS, and A_ALTCHARSET. These constants are
+ defined in <ncurses.h> and can be combined with the C | (or)
+ operator. The current attributes of a window are applied to
+ all characters that are written into the window. Attributes
+ are a property of the character, and move with the char-
+ acter through any scrolling and insert/delete line/character
+ operations. To the extent possible on the particular
+ terminal, they will be displayed as the graphic rendition
+ of characters put on the screen.
+ attrset(at) sets the current attributes of the given window
+ to at. attroff(at) turns off the named attributes without
+ affecting any other attributes. attron(at) turns on the
+ named attributes without affecting any others. standout is
+ the same as attrset(A_STANDOUT), standend is the same as
+ attrset(0), that is, it turns off all attributes.
+
+ 5.10. Color Manipulation
+
+ Ncurses provides support for the use of color on terminals
+ that are capable of display it. Note the BSD and older SYSV
+ curses don't support color. Color support in the PC version
+ is not compatible with SYSR4.
+
+ has_colors()
+ this function returns TRUE if the terminal supports color,
+ FALSE otherwise. Other color handling funtions will return
+ ERR if has_colors() is FALSE. You should always check before
+ using color and use other video attributes to replace color.
+
+ can_change_color()
+ This function returns TRUE if the terminal is capable of
+ redefining colors using the init_color function, FALSE if it
+ can't. Don't use init_color and color_content if it returns
+ FALSE.
+
+ start_color()
+ This function must be called before any other color handling
+ function is called. It initializes the 8 basic colors (see
+ appendix I) and sets the global variables COLORS and COLOR_
+ PAIRS to the maximum number of colors and color-pairs a
+ terminal can handle.
+
+ init_pair(pair, fg, bg)
+ This function changes the definition of a color-pair, pair.
+ Each pair has a foregroung color fg, and a background color
+ bg. Both values must be between 0 and COLORS-1. pair must be
+ between 1 and COLOR_PAIRS-1.
+ [If a pair is changed from a previous definition, the screen
+ is refreshed and all occurances of the color-pair are
+ changed to reflect the change.]
+
+ pair_content(pair, f, b)
+ This function stores the foreground and background colors of
+ the color-pair pair into the variables pointed to by f, b.
+ pair should be between 1 and COLOR_PAIRS-1.
+
+ init_color(color, r, g, b)
+ This function changes the value of a given color. A color is
+ defined by its red, green, and blue components, r, g, and b.
+ These values must be between 0 and 1000. color should be
+ between 0 and COLORS-1.
+
+ color_content(color, r, g, b)
+ This function puts the red, green, and blue components of
+ color into the variable pointed to by r, g, b respectively.
+ color should be between 0 and COLORS-1.
+
+ 5.11. Pads
+
+ 5.12. Soft Labels
+
+ 5.13. Bells and Flashing Lights
+
+ beep()
+ flash()
+ These functions are used to signal the programmer. beep
+ will sound the audible alarm on the terminal, if possible,
+ and if not, will flash the screen (visible bell), if that is
+ possible. flash will flash the screen, and if that is not
+ possible, will sound the audible signal. If neither signal
+ is possible, nothing will happen. Nearly all terminals have
+ an audible signal (bell or beep) but only some can flash the
+ screen.
+
+ 5.14. Portability Functions
+
+ These functions do not have anything to do with terminal
+ dependent character output, but tend to be needed by pro-
+ grams that use curses. Unfortunately, their implemention
+ varies from one version of UNIX* to another. They have been
+ included here to enhance the portability of programs using
+ curses.
+
+ baudrate()
+ baudrate returns the output speed of the terminal. The num-
+ ber returned is the integer baud rate, for example, 9600,
+ rather than a table index such as B9600.
+
+ erasechar()
+ The erase character chosen by the user is returned. This is
+ the character typed by the user to erase the character just
+ typed.
+
+ killchar()
+ The line kill character chosen by the user is returned.
+ This is the character typed by the user to forget the entire
+ line being typed.
+
+ flushinp()
+ flushinp throws away any typeahead that has been typed by
+ the user and has not yet been read by the program.
+
+ 5.15. Debugging
+
+ These functions are useful when debugging a program with
+ curses.
+
+ unctrl(ch)
+ This macro expands to a character string which is a print-
+ able representation of the character ch. The program must
+ include the file <unctrl.h>. Control characters are dis-
+ played in the ^x notation. Printing characters are displayed
+ as is.
+
+ traceoff()
+ traceon()
+ It is possible to compile a debugging version of curses with
+ tracing turned on, and with the -g option for gdb. This
+ library may be available on your system as -ldcurses. When
+ using this version, the file ``trace'' will be created each
+ time the program is run, containing verbose information
+ showing each step done by curses. This output is useful for
+ finding bugs in curses, and may be useful for finding bugs
+ in user programs. Since the output is so verbose, with any
+ bug that cannot be easily and quickly reproduced, it may be
+ necessary to turn the debugging output off in some parts of
+ the program. These functions can be used to turn tracing
+ off and back on. When initscr is first called, tracing is
+ automatically turned on.
+ You should use -DTRACE when compiling programs that use
+ tracing.
+
+ _tracef()
+ This function can be used to output your own debugging info-
+ rmation. It is only available only if you compile with the
+ -DTRACE flag and linking with -ldcurses. It can be used the
+ same way as printf, only it outputs a newline after the end
+ of arguments.
+
+ 6. Lower Level Functions
+
+ These functions are provided for programs not needing the
+ screen optimization capabilities of curses. Programs are
+ discouraged from working at this level, since they must han-
+ dle various glitches in certain terminals. However, a pro-
+ gram can be smaller if it only brings in the low level rou-
+ tines.
+
+ gettmode()
+ setterm(type)
+ These two initialization routines are provided for upward
+ compatibility with the old curses. gettmode does nothing.
+ setterm results in a call to setupterm with appropriate
+ arguments.
+
+ def_prog_mode()
+ def_shell_mode()
+ These functions define "program" mode and "shell" mode. The
+ first describes the status of a terminal while in curses,
+ the second the status outside curses.
+
+ reset_prog_mode()
+ reset_shell_mode()
+ These functions restore a terminal to "program" mode after
+ shelling out, or to "shell" mode before shelling out.
+
+ fixterm()
+ resetterm()
+ These functions are obselete and have been replaced by
+ reset_prog_mode() and reset_prog_mode() respectively.
+
+ saveterm()
+ This fucntion is obselete and is replaced by
+ def_prog_mode().
+
+ mvcur(oldrow, oldcol, newrow, newcol)
+ This routine optimally moves the cursor from (oldrow, old-
+ col) to (newrow, newcol). The user program is expected to
+ keep track of the current cursor position. Note that unless
+ a full screen image is kept, curses will have to make pes-
+ simistic assumptions, sometimes resulting in less than opti-
+ mal cursor motion. For example, moving the cursor a few
+ spaces to the right can be done by transmitting the charac-
+ ters being moved over, but if curses does not have access to
+ the screen image, it doesn't know what these characters are.
+ If either of oldcol or oldrow are negative, mvcur() will
+ refrain from using any relative motions. This is handy for
+ occasions when a program is unsure as to the current cursor
+ location.
+
+ 7. Terminfo Level
+
+ These routines are called by low level programs that need
+ access to specific capabilities of terminfo. A program
+ working at this level should include both <ncurses.h> and
+ <term.h>. After a call to setupterm, the capabilities will
+ be available with macro names defined in <term.h>. See ter-
+ minfo(5) for a detailed description of the capabilies. If
+ the program only needs to handle one terminal, the defini-
+ tion -DSINGLE can be passed to the C compiler, resulting in
+ static references to capabilities instead of dynamic refer-
+ ences. This can result in smaller code, but prevents use of
+ more than one terminal at a time. Very few programs use
+ more than one terminal, so almost all programs can use this
+ flag.
+
+ setupterm(term, filenum, errret)
+ This routine is called to initialize a terminal. term is
+ the character string representing the name of the terminal
+ being used. filenum is the UNIX file descriptor of the ter-
+ minal being 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 0, which will cause the
+ value of TERM in the environment to be used. The errret
+ pointer can also be given as 0, 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.
+ setupterm will check the tty driver mode bits, and change
+ any that might prevent the correct operation of other low
+ level routines. Currently, the mode that expands tabs into
+ spaces is disabled, because the tab character is sometimes
+ used for different functions by different terminals. (Some
+ terminals use it to move right one space. Others use it to
+ address the cursor to row or column 9.) If the system is
+ expanding tabs, setupterm will remove the definition of the
+ tab and backtab functions, assuming that since the user is
+ not using hardware tabs, they may not be properly set in the
+ terminal.
+ After the call to setupterm, the global variable cur_term is
+ set to point to the current structure of terminal capabili-
+ ties. 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 your-
+ self if need be.
+ The mode that turns newlines into CRLF on output is not dis-
+ abled. Programs that use cud1 or ind should avoid these
+ capabilities if their value is linefeed unless they disable
+ this mode. setupterm calls fixterm after any changes it
+ makes.
+
+ vidattr(newmode)
+ vidputs(newmode, outc)
+ newmode is any combination of attributes, defined in
+ <ncurses.h>. The proper string to put the terminal in the
+ given video mode is output. The routine vidattr() sends the
+ output characters to putchar; vidputs sends them to the
+ given routine outc, one character at a time. That routine
+ should therefore expect one char parameter. The previous
+ mode is remembered by this routine.
+
+ tparm(instring, p1, p2, p3, p4, p5, p6, p7, p8, p9)
+ tparm is used to instantiate a parameterized string. The
+ character string returned is suitable for tputs. Up to 9
+ parameters can be passed, in addition to the parameterized
+ string.
+
+ tputs(cp, affcnt, outc)
+ A string capability, possibly containing padding informa-
+ tion, is processed. Enough padding characters to delay for
+ the specified time replace the padding specification, and
+ the resulting string is passed, one character at a time, to
+ the routine outc, which should expect one character parame-
+ ter. (This routine often just calls putchar.) cp is the
+ capability string. affcnt is the number of units affected
+ by the capability, which varies with the particular capabil-
+ ity. (For example, the affcnt for insert_line is the number
+ of lines below the inserted line on the screen, that is, the
+ number of lines that will have to be moved by the terminal.)
+ affcnt is used by the padding information of some terminals
+ as a multiplication factor. If the capability does not have
+ a factor, the value 1 should be passed.
+
+ putp(str)
+ This is a convenient function to output a capability with no
+ affcnt. The string is output to putchar with an affcnt of
+ 1. It can be used in simple applications that do not need
+ to process the output of tputs.
+
+
+ 8. Termcap Emulation
+
+ Appendix I: Attributes
+ ----------------------
+
+ Attributes are used with wattron(), wattroff(), wattrset(),
+ or or'ed with the character passed to waddch(). They are
+ defined in <ncurses.h>
+
+ A_ATTRIBUTES mask chtype for attributes
+ A_NORMAL reset all attributes
+ A_STANDOUT best highlighting mode
+ A_UNDERLINE underline
+ A_REVERSE reverse video, background and foreground reversed
+ A_BLINK blinking
+ A_DIM dim or half bright
+ A_BOLD bold or extra bright
+ A_ALTCHARSET use alternate character set
+ A_INVIS invisible, background same as foreground
+ A_PROTECT I haven't a clue
+ A_CHARTEXT mask chtype for actual character
+ A_COLOR mask for color
+ COLOR_PAIR(n) set color-pair to that stored in n
+ PAIR_NUMBER(a) get color-pair stored in attribute a
+
+
+ Appendix II: COLORS
+ -------------------
+
+ Colors are defined in <ncurses.h> are used with init_pair().
+
+ COLOR_BLACK 0
+ COLOR_RED 1
+ COLOR_GREEN 2
+ COLOR_YELLOW 3
+ COLOR_BLUE 4
+ COLOR_MAGENTA 5
+ COLOR_CYAN 6
+ COLOR_WHITE 7
+
+ Appendix III: Alternative character sets
+ ----------------------------------------
+
+ ACS variables are used to add line-drawing capability to
+ ncurses on terminals that support it. When defined for a
+ given terminal (using acs) the A_ALTCHARSET attribute is
+ set for that variable, otherwise the default value is
+ used.
+
+ ACS_ULCORNER +
+ ACS_LLCORNER +
+ ACS_URCORNER +
+ ACS_LRCORNER +
+ ACS_RTEE +
+ ACS_LTEE +
+ ACS_BTEE +
+ ACS_TTEE +
+ ACS_HLINE -
+ ACS_VLINE |
+ ACS_PLUS +
+ ACS_S1 ~ /* scan line 1 */
+ ACS_S9 _ /* scan line 9 */
+ ACS_DIAMOND + /* diamond */
+ ACS_CKBOARD : /* checker board (stipple) */
+ ACS_DEGREE ' /* degree symbol */
+ ACS_PLMINUS # /* plus/minus */
+ ACS_BULLET 0 /* bullet */
+ ACS_LARROW < /* arrow pointing left */
+ ACS_RARROW > /* arrow pointing right */
+ ACS_DARROW v /* arrow pointing down */
+ ACS_UARROW ^ /* arrow pointing up */
+ ACS_BOARD # /* board of squares */
+ ACS_LANTERN # /* lantern symbol */
+ ACS_BLOCK # /* solid square block */
+
+
+ Appendix IV: Function keys, their codes, and their definition
+ -------------------------------------------------------------
+
+ Function keys can return their respective codes if keypad()
+ is enabled and they are defined in the terminal's terminfo
+ description (assuming the terminal transmits unique sequences
+ for the key. They are defined in <ncurses.h>
+
+ KEY_BREAK 0401 /* break key (unreliable) */
+ KEY_DOWN 0402 /* The four arrow keys ... */
+ KEY_UP 0403
+ KEY_LEFT 0404
+ KEY_RIGHT 0405 /* ... */
+ KEY_HOME 0406 /* Home key (upward+left arrow) */
+ KEY_BACKSPACE 0407 /* backspace (unreliable) */
+ KEY_F0 0410 /* Function keys. Space for 64 */
+ KEY_F(n) (KEY_F0+(n)) /* keys is reserved. */
+ KEY_DL 0510 /* Delete line */
+ KEY_IL 0511 /* Insert line */
+ KEY_DC 0512 /* Delete character */
+ KEY_IC 0513 /* Insert char or enter insert mode */
+ KEY_EIC 0514 /* Exit insert char mode */
+ KEY_CLEAR 0515 /* Clear screen */
+ KEY_EOS 0516 /* Clear to end of screen */
+ KEY_EOL 0517 /* Clear to end of line */
+ KEY_SF 0520 /* Scroll 1 line forward */
+ KEY_SR 0521 /* Scroll 1 line backwards (reverse) */
+ KEY_NPAGE 0522 /* Next page */
+ KEY_PPAGE 0523 /* Previous page */
+ KEY_STAB 0524 /* Set tab */
+ KEY_CTAB 0525 /* Clear tab */
+ KEY_CATAB 0526 /* Clear all tabs */
+ KEY_ENTER 0527 /* Enter or send (unreliable) */
+ KEY_SRESET 0530 /* soft (partial) reset (unreliable) */
+ KEY_RESET 0531 /* reset or hard reset (unreliable) */
+ KEY_PRINT 0532 /* print or copy */
+ KEY_LL 0533 /* home down or bottom (lower left) */
+
+ /* The keypad is arranged like this: */
+ /* a1 up a3 */
+ /* left b2 right */
+ /* c1 down c3 */
+
+ KEY_A1 0534 /* Upper left of keypad */
+ KEY_A3 0535 /* Upper right of keypad */
+ KEY_B2 0536 /* Center of keypad */
+ KEY_C1 0537 /* Lower left of keypad */
+ KEY_C3 0540 /* Lower right of keypad */
+ KEY_BTAB 0541 /* Back tab key */
+ KEY_BEG 0542 /* beg(inning) key */
+ KEY_CANCEL 0543 /* cancel key */
+ KEY_CLOSE 0544 /* close key */
+ KEY_COMMAND 0545 /* cmd (command) key */
+ KEY_COPY 0546 /* copy key */
+ KEY_CREATE 0547 /* create key */
+ KEY_END 0550 /* end key */
+ KEY_EXIT 0551 /* exit key */
+ KEY_FIND 0552 /* find key */
+ KEY_HELP 0553 /* help key */
+ KEY_MARK 0554 /* mark key */
+ KEY_MESSAGE 0555 /* message key */
+ KEY_MOVE 0556 /* move key */
+ KEY_NEXT 0557 /* next object key */
+ KEY_OPEN 0560 /* open key */
+ KEY_OPTIONS 0561 /* options key */
+ KEY_PREVIOUS 0562 /* previous object key */
+ KEY_REDO 0563 /* redo key */
+ KEY_REFERENCE 0564 /* ref(erence) key */
+ KEY_REFRESH 0565 /* refresh key */
+ KEY_REPLACE 0566 /* replace key */
+ KEY_RESTART 0567 /* restart key */
+ KEY_RESUME 0570 /* resume key */
+ KEY_SAVE 0571 /* save key */
+ KEY_SBEG 0572 /* shifted beginning key */
+ KEY_SCANCEL 0573 /* shifted cancel key */
+ KEY_SCOMMAND 0574 /* shifted command key */
+ KEY_SCOPY 0575 /* shifted copy key */
+ KEY_SCREATE 0576 /* shifted create key */
+ KEY_SDC 0577 /* shifted delete char key */
+ KEY_SDL 0600 /* shifted delete line key */
+ KEY_SELECT 0601 /* select key */
+ KEY_SEND 0602 /* shifted end key */
+ KEY_SEOL 0603 /* shifted clear line key */
+ KEY_SEXIT 0604 /* shifted exit key */
+ KEY_SFIND 0605 /* shifted find key */
+ KEY_SHELP 0606 /* shifted help key */
+ KEY_SHOME 0607 /* shifted home key */
+ KEY_SIC 0610 /* shifted input key */
+ KEY_SLEFT 0611 /* shifted left arrow key */
+ KEY_SMESSAGE 0612 /* shifted message key */
+ KEY_SMOVE 0613 /* shifted move key */
+ KEY_SNEXT 0614 /* shifted next key */
+ KEY_SOPTIONS 0615 /* shifted options key */
+ KEY_SPREVIOUS 0616 /* shifted prev key */
+ KEY_SPRINT 0617 /* shifted print key */
+ KEY_SREDO 0620 /* shifted redo key */
+ KEY_SREPLACE 0621 /* shifted replace key */
+ KEY_SRIGHT 0622 /* shifted right arrow */
+ KEY_SRSUME 0623 /* shifted resume key */
+ KEY_SSAVE 0624 /* shifted save key */
+ KEY_SSUSPEND 0625 /* shifted suspend key */
+ KEY_SUNDO 0626 /* shifted undo key */
+ KEY_SUSPEND 0627 /* suspend key */
+ KEY_UNDO 0630 /* undo key */
+ KEY_MAX 0777 /* Maximum curses key */
+
diff --git a/lib/libncurses/keys.list b/lib/libncurses/keys.list
new file mode 100644
index 0000000..e766f32
--- /dev/null
+++ b/lib/libncurses/keys.list
@@ -0,0 +1,149 @@
+key_a1 KEY_A1
+key_a3 KEY_A3
+key_b2 KEY_B2
+key_backspace KEY_BACKSPACE
+key_beg KEY_BEG
+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_f0 KEY_F(0)
+key_f1 KEY_F(1)
+key_f2 KEY_F(2)
+key_f3 KEY_F(3)
+key_f4 KEY_F(4)
+key_f5 KEY_F(5)
+key_f6 KEY_F(6)
+key_f7 KEY_F(7)
+key_f8 KEY_F(8)
+key_f9 KEY_F(9)
+key_f10 KEY_F(10)
+key_f11 KEY_F(11)
+key_f12 KEY_F(12)
+key_f13 KEY_F(13)
+key_f14 KEY_F(14)
+key_f15 KEY_F(15)
+key_f16 KEY_F(16)
+key_f17 KEY_F(17)
+key_f18 KEY_F(18)
+key_f19 KEY_F(19)
+key_f20 KEY_F(20)
+key_f21 KEY_F(21)
+key_f22 KEY_F(22)
+key_f23 KEY_F(23)
+key_f24 KEY_F(24)
+key_f25 KEY_F(25)
+key_f26 KEY_F(26)
+key_f27 KEY_F(27)
+key_f28 KEY_F(28)
+key_f29 KEY_F(29)
+key_f30 KEY_F(30)
+key_f31 KEY_F(31)
+key_f32 KEY_F(32)
+key_f33 KEY_F(33)
+key_f34 KEY_F(34)
+key_f35 KEY_F(35)
+key_f36 KEY_F(36)
+key_f37 KEY_F(37)
+key_f38 KEY_F(38)
+key_f39 KEY_F(39)
+key_f40 KEY_F(40)
+key_f41 KEY_F(41)
+key_f42 KEY_F(42)
+key_f43 KEY_F(43)
+key_f44 KEY_F(44)
+key_f45 KEY_F(45)
+key_f46 KEY_F(46)
+key_f47 KEY_F(47)
+key_f48 KEY_F(48)
+key_f49 KEY_F(49)
+key_f50 KEY_F(50)
+key_f51 KEY_F(51)
+key_f52 KEY_F(52)
+key_f53 KEY_F(53)
+key_f54 KEY_F(54)
+key_f55 KEY_F(55)
+key_f56 KEY_F(56)
+key_f57 KEY_F(57)
+key_f58 KEY_F(58)
+key_f59 KEY_F(59)
+key_f60 KEY_F(60)
+key_f61 KEY_F(61)
+key_f62 KEY_F(62)
+key_f63 KEY_F(63)
+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_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_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_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/lib/libncurses/lib_acs.c b/lib/libncurses/lib_acs.c
new file mode 100644
index 0000000..2b6d25b
--- /dev/null
+++ b/lib/libncurses/lib_acs.c
@@ -0,0 +1,98 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+
+#include "curses.priv.h"
+#include "terminfo.h"
+#include <string.h>
+
+/* line graphics */
+
+
+chtype acs_map[128];
+
+void init_acs()
+{
+
+/*
+ ACS_ULCORNER (acs_map['l'])
+ ACS_LLCORNER (acs_map['m'])
+ ACS_URCORNER (acs_map['k'])
+ ACS_LRCORNER (acs_map['j'])
+ ACS_RTEE (acs_map['u'])
+ ACS_LTEE (acs_map['t'])
+ ACS_BTEE (acs_map['v'])
+ ACS_TTEE (acs_map['w'])
+ ACS_HLINE (acs_map['q'])
+ ACS_VLINE (acs_map['x'])
+ ACS_PLUS (acs_map['n'])
+ ACS_S1 (acs_map['o']) scan line 1
+ ACS_S9 (acs_map['s']) scan line 9
+ ACS_DIAMOND (acs_map['`']) diamond
+ ACS_CKBOARD (acs_map['a']) checker board (stipple)
+ ACS_DEGREE (acs_map['f']) degree symbol
+ ACS_PLMINUS (acs_map['g']) plus/minus
+ ACS_BULLET (acs_map['~']) bullet
+ ACS_LARROW (acs_map[',']) arrow pointing left
+ ACS_RARROW (acs_map['+']) arrow pointing right
+ ACS_DARROW (acs_map['.']) arrow pointing down
+ ACS_UARROW (acs_map['-']) arrow pointing up
+ ACS_BOARD (acs_map['h']) board of squares
+ ACS_LANTERN (acs_map['I']) lantern symbol
+ ACS_BLOCK (acs_map['0']) solid square block
+*/
+
+ T(("initializing ACS map"));
+
+ acs_map['l'] = acs_map['m'] = acs_map['k'] = acs_map['j'] =
+ acs_map['u'] = acs_map['t'] = acs_map['v'] = acs_map['w'] = (chtype)'+' & A_CHARTEXT;
+ acs_map['q'] = (chtype)'-' & A_CHARTEXT;
+ acs_map['x'] = (chtype)'|' & A_CHARTEXT;
+ acs_map['n'] = (chtype)'+' & A_CHARTEXT;
+ acs_map['o'] = (chtype)'~' & A_CHARTEXT;
+ acs_map['s'] = (chtype)'_' & A_CHARTEXT;
+ acs_map['`'] = (chtype)'+' & A_CHARTEXT;
+ acs_map['a'] = (chtype)':' & A_CHARTEXT;
+ acs_map['f'] = (chtype)'\'' & A_CHARTEXT;
+ acs_map['g'] = (chtype)'#' & A_CHARTEXT;
+ acs_map['~'] = (chtype)'o' & A_CHARTEXT;
+ acs_map[','] = (chtype)'<' & A_CHARTEXT;
+ acs_map['+'] = (chtype)'>' & A_CHARTEXT;
+ acs_map['.'] = (chtype)'v' & A_CHARTEXT;
+ acs_map['-'] = (chtype)'^' & A_CHARTEXT;
+ acs_map['h'] = (chtype)'#' & A_CHARTEXT;
+ acs_map['I'] = (chtype)'#' & A_CHARTEXT;
+ acs_map['0'] = (chtype)'#' & A_CHARTEXT;
+
+ if (ena_acs != NULL)
+ putp(ena_acs);
+
+ if (acs_chars != NULL) {
+ int i = 0;
+ int 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':
+ acs_map[(unsigned int)(unsigned char)acs_chars[i]] =
+ (acs_chars[++i] & A_CHARTEXT) | A_ALTCHARSET;
+ default:
+ i++;
+ break;
+ }
+ }
+#ifdef TRACE
+ else {
+ T(("acsc not defined, using default mapping"));
+ }
+#endif
+}
+
diff --git a/lib/libncurses/lib_addch.c b/lib/libncurses/lib_addch.c
new file mode 100644
index 0000000..60386b4
--- /dev/null
+++ b/lib/libncurses/lib_addch.c
@@ -0,0 +1,127 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_addch.c
+**
+** The routine waddch().
+**
+*/
+
+#include "curses.priv.h"
+#include "unctrl.h"
+
+static inline chtype render_char(WINDOW *win, chtype ch)
+/* compute a rendition of the given char correct for the current context */
+{
+ if (TextOf(ch) == ' ')
+ ch = ch_or_attr(ch, win->_bkgd);
+ else if (!(ch & A_ATTRIBUTES))
+ ch = ch_or_attr(ch, (win->_bkgd & A_ATTRIBUTES));
+ TR(TRACE_CHARPUT, ("bkg = %#lx -> ch = %#lx", win->_bkgd, ch));
+
+ return(ch);
+}
+
+chtype _nc_background(WINDOW *win)
+/* make render_char() visible while still allowing us to inline it below */
+{
+ return(render_char(win, BLANK));
+}
+
+chtype _nc_render(WINDOW *win, chtype ch)
+/* make render_char() visible while still allowing us to inline it below */
+{
+ chtype c = render_char(win,ch);
+ return (ch_or_attr(c,win->_attrs));
+}
+
+static int
+wladdch(WINDOW *win, chtype c, bool literal)
+{
+int x, y;
+int newx;
+chtype ch = c;
+
+ x = win->_curx;
+ y = win->_cury;
+
+ if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0)
+ return(ERR);
+
+ /* ugly, but necessary --- and, bizarrely enough, even portable! */
+ if (literal)
+ goto noctrl;
+
+ switch (ch&A_CHARTEXT) {
+ case '\t':
+ for (newx = x + (8 - (x & 07)); x < newx; x++)
+ if (waddch(win, ' ') == ERR)
+ return(ERR);
+ return(OK);
+ case '\n':
+ wclrtoeol(win);
+ x = 0;
+ goto newline;
+ case '\r':
+ x = 0;
+ break;
+ case '\b':
+ if (--x < 0)
+ x = 0;
+ break;
+ default:
+ if (ch < ' ')
+ return(waddstr(win, unctrl(ch)));
+
+ /* FALL THROUGH */
+ noctrl:
+ T(("win attr = %x", win->_attrs));
+ ch = render_char(win, ch);
+ ch = ch_or_attr(ch,win->_attrs);
+
+ if (win->_line[y][x] != ch) {
+ if (win->_firstchar[y] == _NOCHANGE)
+ win->_firstchar[y] = win->_lastchar[y] = x;
+ else if (x < win->_firstchar[y])
+ win->_firstchar[y] = x;
+ else if (x > win->_lastchar[y])
+ win->_lastchar[y] = x;
+
+ }
+
+ T(("char %d of line %d is %x", x, y, ch));
+ win->_line[y][x++] = ch;
+ if (x > win->_maxx) {
+ x = 0;
+newline:
+ y++;
+ if (y > win->_regbottom) {
+ y--;
+ if (win->_scroll)
+ scroll(win);
+ }
+ }
+ break;
+ }
+
+ win->_curx = x;
+ win->_cury = y;
+
+ return(OK);
+}
+
+int waddch(WINDOW *win, chtype ch)
+{
+ TR(TRACE_CHARPUT, ("waddch(%x,%c (%x)) called", win, ch&A_CHARTEXT, ch));
+ return wladdch(win, ch, FALSE);
+}
+
+int wechochar(WINDOW *win, chtype ch)
+{
+ T(("wechochar(%x,%c (%x)) called", win, ch&A_CHARTEXT, ch));
+
+ return wladdch(win, ch, TRUE);
+}
diff --git a/lib/libncurses/lib_addstr.c b/lib/libncurses/lib_addstr.c
new file mode 100644
index 0000000..d9cb30a
--- /dev/null
+++ b/lib/libncurses/lib_addstr.c
@@ -0,0 +1,56 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_addstr.c
+*
+** The routines waddnstr(), waddchnstr().
+**
+*/
+
+#include "curses.priv.h"
+
+int
+waddnstr(WINDOW *win, char *str, int n)
+{
+ T(("waddnstr(%x,\"%s\",%d) called", win, visbuf(str), n));
+
+ if (str == NULL)
+ return ERR;
+
+ if (n < 0) {
+ while (*str != '\0') {
+ if (waddch(win, (chtype)(unsigned char)*str++) == ERR)
+ return(ERR);
+ }
+ return OK;
+ }
+
+ while((n-- > 0) && (*str != '\0')) {
+ if (waddch(win, (chtype)(unsigned char)*str++) == ERR)
+ return ERR;
+ }
+ return OK;
+}
+
+int
+waddchnstr(WINDOW *win, chtype *str, int n)
+{
+ T(("waddchnstr(%x,%x,%d) called", win, str, n));
+
+ if (n < 0) {
+ while (*str) {
+ if (waddch(win, (chtype)(unsigned char)*str++) == ERR)
+ return(ERR);
+ }
+ return OK;
+ }
+
+ while(n-- > 0) {
+ if (waddch(win, (chtype)(unsigned char)*str++) == ERR)
+ return ERR;
+ }
+ return OK;
+}
diff --git a/lib/libncurses/lib_beep.c b/lib/libncurses/lib_beep.c
new file mode 100644
index 0000000..60ce592
--- /dev/null
+++ b/lib/libncurses/lib_beep.c
@@ -0,0 +1,56 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+ * beep.c
+ *
+ * Routines beep() and flash()
+ *
+ */
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+/*
+ * beep()
+ *
+ * Sound the current terminal's audible bell if it has one. If not,
+ * flash the screen if possible.
+ *
+ */
+
+int beep()
+{
+ T(("beep() called"));
+
+ /* should make sure that we are not in altchar mode */
+ if (bell)
+ return(putp(bell));
+ else if (flash_screen)
+ return(putp(flash_screen));
+ else
+ return(ERR);
+}
+
+/*
+ * flash()
+ *
+ * Flash the current terminal's screen if possible. If not,
+ * sound the audible bell if one exists.
+ *
+ */
+
+int flash()
+{
+ T(("flash() called"));
+
+ /* should make sure that we are not in altchar mode */
+ if (flash_screen)
+ return(putp(flash_screen));
+ else if (bell)
+ return(putp(bell));
+ else
+ return(ERR);
+}
diff --git a/lib/libncurses/lib_bkgd.c b/lib/libncurses/lib_bkgd.c
new file mode 100644
index 0000000..d75585c
--- /dev/null
+++ b/lib/libncurses/lib_bkgd.c
@@ -0,0 +1,49 @@
+
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992, 1993, 1994 *
+* by Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, not removed *
+* from header files, and is reproduced in any documentation *
+* accompanying it or the applications linked with it. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+
+#include "curses.h"
+#include "curses.priv.h"
+
+int wbkgd(WINDOW *win, chtype ch)
+{
+int x, y;
+chtype old_bkgd = getbkgd(win);
+chtype new_bkgd = ch;
+
+ T(("wbkgd(%x, %x) called", win, ch));
+
+ if (TextOf(new_bkgd) == 0)
+ new_bkgd |= BLANK;
+ wbkgdset(win, new_bkgd);
+ wattrset(win, AttrOf(new_bkgd));
+
+ for (y = 0; y <= win->_maxy; y++) {
+ for (x = 0; x <= win->_maxx; x++) {
+ if (win->_line[y][x] == old_bkgd)
+ win->_line[y][x] = new_bkgd;
+ else
+ win->_line[y][x] =
+ TextOf(win->_line[y][x])
+ | AttrOf(new_bkgd);
+ }
+ }
+ touchwin(win);
+ return OK;
+}
+
diff --git a/lib/libncurses/lib_box.c b/lib/libncurses/lib_box.c
new file mode 100644
index 0000000..a467808
--- /dev/null
+++ b/lib/libncurses/lib_box.c
@@ -0,0 +1,131 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_box.c
+**
+** line drawing routines:
+** wborder()
+** whline()
+** wvline()
+**
+*/
+
+#include "curses.priv.h"
+
+int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts,
+ chtype bs, chtype tl, chtype tr, chtype bl, chtype br)
+{
+int i;
+int endx, endy;
+
+ T(("wborder() called"));
+
+ 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 %x, %x, %x, %x, %x, %x, %x, %x", ls, rs, ts, bs, tl, tr, bl, br));
+
+ endx = win->_maxx;
+ endy = win->_maxy;
+
+ for (i = 0; i <= endx; i++) {
+ win->_line[0][i] = ts;
+ win->_line[endy][i] = bs;
+ }
+ win->_firstchar[endy] = win->_firstchar[0] = 0;
+ win->_lastchar[endy] = win->_lastchar[0] = endx;
+
+ for (i = 0; i <= endy; i++) {
+ win->_line[i][0] = ls;
+ win->_line[i][endx] = rs;
+ win->_firstchar[i] = 0;
+ win->_lastchar[i] = endx;
+ }
+ win->_line[0][0] = tl;
+ win->_line[0][endx] = tr;
+ win->_line[endy][0] = bl;
+ win->_line[endy][endx] = br;
+
+#if 0
+ if (! win->_scroll && (win->_flags & _SCROLLWIN))
+ fp[0] = fp[endx] = lp[0] = lp[endx] = ' ';
+#endif
+
+ return OK;
+}
+
+int whline(WINDOW *win, chtype ch, int n)
+{
+int line;
+int start;
+int end;
+
+ T(("whline(%x,%x,%d) called", win, ch, n));
+
+ line = win->_cury;
+ start = win->_curx;
+ end = start + n - 1;
+ if (end > win->_maxx)
+ end = win->_maxx;
+
+ if (win->_firstchar[line] == _NOCHANGE || win->_firstchar[line] > start)
+ win->_firstchar[line] = start;
+ if (win->_lastchar[line] == _NOCHANGE || win->_lastchar[line] < start)
+ win->_lastchar[line] = end;
+
+ if (ch == 0)
+ ch = ACS_HLINE;
+ while ( end >= start) {
+ win->_line[line][end] = ch | win->_attrs;
+ end--;
+ }
+
+ return OK;
+}
+
+int wvline(WINDOW *win, chtype ch, int n)
+{
+int row, col;
+int end;
+
+ T(("wvline(%x,%x,%d) called", win, ch, n));
+
+ row = win->_cury;
+ col = win->_curx;
+ end = row + n - 1;
+ if (end > win->_maxy)
+ end = win->_maxy;
+
+ if (ch == 0)
+ ch = ACS_VLINE;
+
+ while(end >= row) {
+ win->_line[end][col] = ch | win->_attrs;
+ if (win->_firstchar[end] == _NOCHANGE || win->_firstchar[end] > col)
+ win->_firstchar[end] = col;
+ if (win->_lastchar[end] == _NOCHANGE || win->_lastchar[end] < col)
+ win->_lastchar[end] = col;
+ end--;
+ }
+
+ return OK;
+}
+
diff --git a/lib/libncurses/lib_clear.c b/lib/libncurses/lib_clear.c
new file mode 100644
index 0000000..c82db9b
--- /dev/null
+++ b/lib/libncurses/lib_clear.c
@@ -0,0 +1,24 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_clear.c
+**
+** The routine wclear().
+**
+*/
+
+#include "curses.priv.h"
+
+int wclear(WINDOW *win)
+{
+ T(("wclear(%x) called", win));
+
+ werase(win);
+
+ win->_clear = TRUE;
+
+ return OK;
+}
diff --git a/lib/libncurses/lib_clrbot.c b/lib/libncurses/lib_clrbot.c
new file mode 100644
index 0000000..e803920
--- /dev/null
+++ b/lib/libncurses/lib_clrbot.c
@@ -0,0 +1,53 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_clrbot.c
+**
+** The routine wclrtobot().
+**
+*/
+
+#include "curses.priv.h"
+
+int wclrtobot(WINDOW *win)
+{
+chtype *ptr, *end, *maxx = NULL;
+int y, startx, minx;
+
+ T(("wclrtobot(%x) called", win));
+
+ startx = win->_curx;
+
+ 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++) {
+ minx = _NOCHANGE;
+ end = &win->_line[y][win->_maxx];
+
+ for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) {
+ chtype blank = _nc_background(win);
+
+ if (*ptr != blank) {
+ maxx = ptr;
+ if (minx == _NOCHANGE)
+ minx = ptr - win->_line[y];
+ *ptr = blank;
+ }
+ }
+
+ if (minx != _NOCHANGE) {
+ if (win->_firstchar[y] > minx
+ || win->_firstchar[y] == _NOCHANGE)
+ win->_firstchar[y] = minx;
+
+ if (win->_lastchar[y] < maxx - win->_line[y])
+ win->_lastchar[y] = maxx - win->_line[y];
+ }
+
+ startx = 0;
+ }
+ return OK;
+}
diff --git a/lib/libncurses/lib_clreol.c b/lib/libncurses/lib_clreol.c
new file mode 100644
index 0000000..b0a15b9
--- /dev/null
+++ b/lib/libncurses/lib_clreol.c
@@ -0,0 +1,48 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_clreol.c
+**
+** The routine wclrtoeol().
+**
+*/
+
+#include "curses.priv.h"
+
+int wclrtoeol(WINDOW *win)
+{
+chtype *maxx, *ptr, *end;
+int y, x, minx;
+
+ T(("wclrtoeol(%x) called", win));
+
+ y = win->_cury;
+ x = win->_curx;
+
+ end = &win->_line[y][win->_maxx];
+ minx = _NOCHANGE;
+ maxx = &win->_line[y][x];
+
+ for (ptr = maxx; ptr <= end; ptr++) {
+ chtype blank = _nc_background(win);
+
+ if (*ptr != blank) {
+ maxx = ptr;
+ if (minx == _NOCHANGE)
+ minx = ptr - win->_line[y];
+ *ptr = blank;
+ }
+ }
+
+ if (minx != _NOCHANGE) {
+ if (win->_firstchar[y] > minx || win->_firstchar[y] == _NOCHANGE)
+ win->_firstchar[y] = minx;
+
+ if (win->_lastchar[y] < maxx - win->_line[y])
+ win->_lastchar[y] = maxx - win->_line[y];
+ }
+ return(OK);
+}
diff --git a/lib/libncurses/lib_color.c b/lib/libncurses/lib_color.c
new file mode 100644
index 0000000..3d40a69
--- /dev/null
+++ b/lib/libncurses/lib_color.c
@@ -0,0 +1,107 @@
+/* This work is copyrighted. See COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/* lib_color.c
+ *
+ * Handles color emulation of SYS V curses
+ *
+ */
+
+#include <stdlib.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+
+int COLOR_PAIRS;
+int COLORS;
+unsigned char *color_pairs;
+
+int start_color()
+{
+ T(("start_color() called."));
+
+ if (orig_pair != NULL)
+ putp(orig_pair);
+ else return ERR;
+ if (max_pairs != -1)
+ COLOR_PAIRS = max_pairs;
+ else return ERR;
+ color_pairs = malloc(max_pairs);
+ if (max_colors != -1)
+ COLORS = max_colors;
+ else return ERR;
+ SP->_coloron = 1;
+
+ T(("started color: COLORS = %d, COLOR_PAIRS = %d", COLORS, COLOR_PAIRS));
+
+ return OK;
+}
+
+int init_pair(short pair, short f, short b)
+{
+ T(("init_pair( %d, %d, %d )", pair, f, b));
+
+ if ((pair < 1) || (pair >= COLOR_PAIRS))
+ return ERR;
+ if ((f < 0) || (f >= COLORS) || (b < 0) || (b >= COLORS))
+ return ERR;
+
+ /* still to do:
+ if pair was initialized before a screen update is performed
+ replacing original pair colors with the new ones
+ */
+
+ color_pairs[pair] = ( (f & 0x0f) | (b & 0x0f) << 4 );
+
+ return OK;
+}
+
+int init_color(short color, short r, short g, short b)
+{
+ if (initialize_color != NULL) {
+ if (color < 0 || color >= COLORS)
+ return ERR;
+ if (hue_lightness_saturation == TRUE)
+ if (r < 0 || r > 360 || g < 0 || g > 100 || b < 0 || b > 100)
+ return ERR;
+ if (hue_lightness_saturation == FALSE)
+ if (r < 0 || r > 1000 || g < 0 || g > 1000 || b < 0 || b > 1000)
+ return ERR;
+
+ putp(tparm(initialize_color, color, r, g, b));
+ return OK;
+ }
+
+ return ERR;
+}
+
+bool can_change_color()
+{
+ return can_change;
+}
+
+int has_colors()
+{
+ return ((orig_pair != NULL) && (max_colors != -1) && (max_pairs != -1)
+ &&
+ (((set_foreground != NULL) && (set_background != NULL)) ||
+ ((set_a_foreground != NULL) && (set_a_background != NULL)))
+ );
+}
+
+int color_content(short color, short *r, short *g, short *b)
+{
+ return ERR;
+}
+
+int pair_content(short pair, short *f, short *b)
+{
+
+ if ((pair < 1) || (pair > COLOR_PAIRS))
+ return ERR;
+ *f = color_pairs[pair] & 0x0f;
+ *b = color_pairs[pair] & 0xf0;
+ *b >>= 4;
+ return OK;
+}
+
diff --git a/lib/libncurses/lib_delch.c b/lib/libncurses/lib_delch.c
new file mode 100644
index 0000000..0a0fd0a
--- /dev/null
+++ b/lib/libncurses/lib_delch.c
@@ -0,0 +1,39 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_delch.c
+**
+** The routine wdelch().
+**
+*/
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+int wdelch(WINDOW *win)
+{
+chtype *temp1, *temp2;
+chtype *end;
+chtype blank = _nc_background(win);
+
+ T(("wdelch(%x) called", win));
+
+ end = &win->_line[win->_cury][win->_maxx];
+ temp2 = &win->_line[win->_cury][win->_curx + 1];
+ temp1 = temp2 - 1;
+
+ while (temp1 < end)
+ *temp1++ = *temp2++;
+
+ *temp1 = blank;
+
+ win->_lastchar[win->_cury] = win->_maxx;
+
+ if (win->_firstchar[win->_cury] == _NOCHANGE
+ || win->_firstchar[win->_cury] > win->_curx)
+ win->_firstchar[win->_cury] = win->_curx;
+ return OK;
+}
diff --git a/lib/libncurses/lib_delwin.c b/lib/libncurses/lib_delwin.c
new file mode 100644
index 0000000..0edc73b
--- /dev/null
+++ b/lib/libncurses/lib_delwin.c
@@ -0,0 +1,36 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_delwin.c
+**
+** The routine delwin().
+**
+*/
+
+#include <stdlib.h>
+#include "curses.priv.h"
+
+int delwin(WINDOW *win)
+{
+int i;
+
+ T(("delwin(%x) called", win));
+
+ if (! (win->_flags & _SUBWIN)) {
+ for (i = 0; i < win->_maxy && win->_line[i]; i++)
+ free(win->_line[i]);
+ }
+
+ free(win->_firstchar);
+ free(win->_lastchar);
+ free(win->_line);
+
+ touchwin((win->_flags & _SUBWIN) ? win->_parent : curscr);
+
+ free(win);
+
+ return(OK);
+}
diff --git a/lib/libncurses/lib_doupdate.c b/lib/libncurses/lib_doupdate.c
new file mode 100644
index 0000000..1f42a90
--- /dev/null
+++ b/lib/libncurses/lib_doupdate.c
@@ -0,0 +1,593 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*-----------------------------------------------------------------
+ *
+ * lib_doupdate.c
+ *
+ * The routine doupdate() and its dependents
+ *
+ *-----------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <sys/time.h>
+#ifdef SYS_SELECT
+#include <sys/select.h>
+#endif
+#include <string.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+#ifdef SVR4_ACTION
+#define _POSIX_SOURCE
+#endif
+#include <signal.h>
+
+static void ClrUpdate( WINDOW *scr );
+static void TransformLine( int lineno );
+static void NoIDcTransformLine( int lineno );
+static void IDcTransformLine( int lineno );
+static void ClearScreen( void );
+static void InsStr( chtype *line, int count );
+static void DelChar( int count );
+
+static inline void PutAttrChar(chtype ch)
+{
+ TR(TRACE_CHARPUT, ("PutAttrChar(%s, %s)",
+ _tracechar(ch & A_CHARTEXT),
+ _traceattr((ch & (chtype)A_ATTRIBUTES))));
+ if (curscr->_attrs != (ch & (chtype)A_ATTRIBUTES)) {
+ curscr->_attrs = ch & (chtype)A_ATTRIBUTES;
+ vidputs(curscr->_attrs, _outch);
+ }
+ putc(ch & A_CHARTEXT, SP->_ofp);
+}
+
+static int LRCORNER = FALSE;
+
+static inline void PutChar(chtype ch)
+{
+ if (LRCORNER == TRUE && SP->_curscol == columns-1) {
+ int i = lines -1;
+ int j = columns -1;
+
+ LRCORNER = FALSE;
+ if ( (!enter_insert_mode || !exit_insert_mode)
+ && !insert_character
+ )
+ return;
+ if (cursor_left)
+ putp(cursor_left);
+ else
+ mvcur(-1, -1, i, j);
+ PutAttrChar(ch);
+ if (cursor_left)
+ putp(cursor_left);
+ else
+ mvcur(-1, -1, i, j);
+ if (enter_insert_mode && exit_insert_mode) {
+ putp(enter_insert_mode);
+ PutAttrChar(newscr->_line[i][j-1]);
+ putp(exit_insert_mode);
+ } else if (insert_character) {
+ putp(insert_character);
+ PutAttrChar(newscr->_line[i][j-1]);
+ }
+ return;
+ }
+ PutAttrChar(ch);
+ SP->_curscol++;
+ if (SP->_curscol >= columns) {
+ if (auto_right_margin) {
+ SP->_curscol = 0;
+ SP->_cursrow++;
+ } else {
+ SP->_curscol--;
+ }
+ }
+}
+
+static inline void GoTo(int row, int col)
+{
+ mvcur(SP->_cursrow, SP->_curscol, row, col);
+ SP->_cursrow = row;
+ SP->_curscol = col;
+}
+
+int _outch(int ch)
+{
+ if (SP != NULL)
+ putc(ch, SP->_ofp);
+ else
+ putc(ch, stdout);
+ return OK;
+}
+
+int doupdate(void)
+{
+int i;
+sigaction_t act, oact;
+
+ T(("doupdate() called"));
+
+ act.sa_handler = SIG_IGN;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(SIGTSTP, &act, &oact);
+
+ if (SP->_endwin == TRUE) {
+ T(("coming back from shell mode"));
+ reset_prog_mode();
+ if (enter_ca_mode)
+ putp(enter_ca_mode);
+ /* is this necessary? */
+ if (enter_alt_charset_mode)
+ init_acs();
+ newscr->_clear = TRUE;
+ SP->_endwin = FALSE;
+ }
+
+#if 0 /* Not works for output-only pgms */
+ /* check for pending input */
+ {
+ fd_set fdset;
+ struct timeval timeout = {0,0};
+
+ FD_ZERO(&fdset);
+ FD_SET(SP->_checkfd, &fdset);
+ if (select(SP->_checkfd+1, &fdset, NULL, NULL, &timeout) != 0) {
+ fflush(SP->_ofp);
+ return OK;
+ }
+ }
+#endif
+
+ if (curscr->_clear) { /* force refresh ? */
+ T(("clearing and updating curscr"));
+ ClrUpdate(newscr); /* yes, clear all & update */
+ curscr->_clear = FALSE; /* reset flag */
+ } else if (newscr->_clear) {
+ T(("clearing and updating newscr"));
+ ClrUpdate(newscr);
+ newscr->_clear = FALSE;
+ } else {
+ T(("Transforming lines"));
+ for (i = 0; i < lines ; i++) {
+ if(newscr->_firstchar[i] != _NOCHANGE)
+ TransformLine(i);
+ }
+ }
+ T(("marking screen as updated"));
+ for (i = 0; i < lines; i++) {
+ newscr->_firstchar[i] = _NOCHANGE;
+ newscr->_lastchar[i] = _NOCHANGE;
+ }
+
+ curscr->_curx = newscr->_curx;
+ curscr->_cury = newscr->_cury;
+
+ GoTo(curscr->_cury, curscr->_curx);
+
+ /* perhaps we should turn attributes off here */
+
+ if (curscr->_attrs != A_NORMAL)
+ vidattr(curscr->_attrs = A_NORMAL);
+
+ fflush(SP->_ofp);
+
+ sigaction(SIGTSTP, &oact, NULL);
+
+ return OK;
+}
+
+static int move_right_cost = -1;
+
+static int countc(int c)
+{
+ return(move_right_cost++);
+}
+
+/*
+** ClrUpdate(scr)
+**
+** Update by clearing and redrawing the entire screen.
+**
+*/
+
+static void ClrUpdate(WINDOW *scr)
+{
+int i = 0, j = 0;
+int lastNonBlank;
+
+ T(("ClrUpdate(%x) called", scr));
+ if (back_color_erase && curscr->_attrs != A_NORMAL) {
+ T(("back_color_erase, turning attributes off"));
+ vidattr(curscr->_attrs = A_NORMAL);
+ }
+ ClearScreen();
+
+ if ((move_right_cost == -1) && parm_right_cursor) {
+ move_right_cost = 0;
+ tputs(tparm(parm_right_cursor, 10), 1, countc);
+ }
+
+ T(("updating screen from scratch"));
+ for (i = 0; i < min(lines, scr->_maxy + 1); i++) {
+ lastNonBlank = scr->_maxx;
+
+ while (lastNonBlank >= 0 && scr->_line[i][lastNonBlank] == BLANK)
+ lastNonBlank--;
+
+ /* check if we are at the lr corner */
+ if (i == lines-1)
+ if ((auto_right_margin) && !(eat_newline_glitch) &&
+ (lastNonBlank == columns-1))
+ {
+ T(("Lower-right corner needs special handling"));
+ LRCORNER = TRUE;
+ }
+
+ for (j = 0; j <= lastNonBlank; j++) {
+ if (parm_right_cursor) {
+ static int inspace = 0;
+
+ if ((scr->_line[i][j]) == BLANK) {
+ inspace++;
+ continue;
+ } else if(inspace) {
+ if (inspace < move_right_cost) {
+ for (; inspace > 0; inspace--)
+ PutChar(scr->_line[i][j-1]);
+ } else {
+ T(("trying to use parm_right_cursor"));
+ putp(tparm(parm_right_cursor, inspace));
+ SP->_curscol += inspace;
+ inspace = 0;
+ }
+ }
+ }
+ PutChar(scr->_line[i][j]);
+ }
+ /* move cursor to the next line */
+ if ((!auto_right_margin) || (lastNonBlank < columns - 1) ||
+ (auto_right_margin && eat_newline_glitch && lastNonBlank == columns-1))
+ {
+ SP->_curscol = (lastNonBlank < 0) ? 0 : lastNonBlank;
+ SP->_cursrow++;
+ GoTo(i+1, 0);
+ }
+ }
+
+
+ if (scr != curscr) {
+ for (i = 0; i < lines ; i++)
+ for (j = 0; j < columns; j++)
+ curscr->_line[i][j] = scr->_line[i][j];
+ }
+}
+
+/*
+** TransformLine(lineno)
+**
+** Call either IDcTransformLine or NoIDcTransformLine to do the
+** update, depending upon availability of insert/delete character.
+*/
+
+static void TransformLine(int lineno)
+{
+
+ T(("TransformLine(%d) called",lineno));
+
+ if ( (insert_character || (enter_insert_mode && exit_insert_mode))
+ && delete_character)
+ IDcTransformLine(lineno);
+ else
+ NoIDcTransformLine(lineno);
+}
+
+
+
+/*
+** NoIDcTransformLine(lineno)
+**
+** Transform the given line in curscr to the one in newscr, without
+** using Insert/Delete Character.
+**
+** firstChar = position of first different character in line
+** lastChar = position of last different character in line
+**
+** overwrite all characters between firstChar and lastChar.
+**
+*/
+
+static void NoIDcTransformLine(int lineno)
+{
+int firstChar, lastChar;
+chtype *newLine = newscr->_line[lineno];
+chtype *oldLine = curscr->_line[lineno];
+int k;
+int attrchanged = 0;
+
+ T(("NoIDcTransformLine(%d) called", lineno));
+
+ firstChar = 0;
+ while (firstChar < columns - 1 && newLine[firstChar] == oldLine[firstChar]) {
+ if(ceol_standout_glitch) {
+ if((newLine[firstChar] & (chtype)A_ATTRIBUTES) != (oldLine[firstChar] & (chtype)A_ATTRIBUTES))
+ attrchanged = 1;
+ }
+ firstChar++;
+ }
+
+ T(("first char at %d is %x", firstChar, newLine[firstChar]));
+ if (firstChar > columns)
+ return;
+
+ if(ceol_standout_glitch && attrchanged) {
+ firstChar = 0;
+ lastChar = columns - 1;
+ GoTo(lineno, firstChar);
+ if(clr_eol) {
+ if (back_color_erase && curscr->_attrs != A_NORMAL) {
+ T(("back_color_erase, turning attributes off"));
+ vidattr(curscr->_attrs = A_NORMAL);
+ }
+ putp(clr_eol);
+ }
+ } else {
+ lastChar = columns - 1;
+ while (lastChar > firstChar && newLine[lastChar] == oldLine[lastChar])
+ lastChar--;
+ GoTo(lineno, firstChar);
+ }
+
+ /* check if we are at the lr corner */
+ if (lineno == lines-1)
+ if ((auto_right_margin) && !(eat_newline_glitch) &&
+ (lastChar == columns-1))
+ {
+ T(("Lower-right corner needs special handling"));
+ LRCORNER = TRUE;
+ }
+
+ T(("updating chars %d to %d", firstChar, lastChar));
+ for (k = firstChar; k <= lastChar; k++) {
+ PutChar(newLine[k]);
+ oldLine[k] = newLine[k];
+ }
+}
+
+/*
+** IDcTransformLine(lineno)
+**
+** Transform the given line in curscr to the one in newscr, using
+** Insert/Delete Character.
+**
+** 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 IDcTransformLine(int lineno)
+{
+int firstChar, oLastChar, nLastChar;
+chtype *newLine = newscr->_line[lineno];
+chtype *oldLine = curscr->_line[lineno];
+int k, n;
+int attrchanged = 0;
+
+ T(("IDcTransformLine(%d) called", lineno));
+
+ if(ceol_standout_glitch && clr_eol) {
+ firstChar = 0;
+ while(firstChar < columns) {
+ if((newLine[firstChar] & (chtype)A_ATTRIBUTES) != (oldLine[firstChar] & (chtype)A_ATTRIBUTES))
+ attrchanged = 1;
+ firstChar++;
+ }
+ }
+
+ firstChar = 0;
+
+ if (attrchanged) {
+ GoTo(lineno, firstChar);
+ if (back_color_erase && curscr->_attrs != A_NORMAL) {
+ T(("back_color_erase, turning attributes off"));
+ vidattr(curscr->_attrs = A_NORMAL);
+ }
+ putp(clr_eol);
+
+ /* check if we are at the lr corner */
+ if (lineno == lines-1)
+ if ((auto_right_margin) && !(eat_newline_glitch))
+ {
+ T(("Lower-right corner needs special handling"));
+ LRCORNER = TRUE;
+ }
+
+ for( k = 0 ; k <= (columns-1) ; k++ )
+ PutChar(newLine[k]);
+ } else {
+ while (firstChar < columns &&
+ newLine[firstChar] == oldLine[firstChar])
+ firstChar++;
+
+ if (firstChar >= columns)
+ return;
+
+ oLastChar = columns - 1;
+ while (oLastChar > firstChar && oldLine[oLastChar] == BLANK)
+ oLastChar--;
+
+ nLastChar = columns - 1;
+ while (nLastChar > firstChar && newLine[nLastChar] == BLANK)
+ nLastChar--;
+
+ if((nLastChar == firstChar) && clr_eol) {
+ GoTo(lineno, firstChar);
+ if (back_color_erase && curscr->_attrs != A_NORMAL) {
+ T(("back_color_erase, turning attributes off"));
+ vidattr(curscr->_attrs = A_NORMAL);
+ }
+ putp(clr_eol);
+
+ if(newLine[firstChar] != BLANK ) {
+ /* check if we are at the lr corner */
+ if (lineno == lines-1)
+ if ((auto_right_margin) && !(eat_newline_glitch) &&
+ (firstChar == columns-1))
+ {
+ T(("Lower-right corner needs special handling"));
+ LRCORNER = TRUE;
+ }
+ PutChar(newLine[firstChar]);
+ }
+ } else if( newLine[nLastChar] != oldLine[oLastChar] ) {
+ n = max( nLastChar , oLastChar );
+
+ GoTo(lineno, firstChar);
+
+ /* check if we are at the lr corner */
+ if (lineno == lines-1)
+ if ((auto_right_margin) && !(eat_newline_glitch) &&
+ (n == columns-1))
+ {
+ T(("Lower-right corner needs special handling"));
+ LRCORNER = TRUE;
+ }
+
+ for( k=firstChar ; k <= n ; k++ )
+ PutChar(newLine[k]);
+ } else {
+ while (newLine[nLastChar] == oldLine[oLastChar]) {
+ nLastChar--;
+ oLastChar--;
+ }
+
+ n = min(oLastChar, nLastChar);
+
+ GoTo(lineno, firstChar);
+
+ /* check if we are at the lr corner */
+ if (lineno == lines-1)
+ if ((auto_right_margin) && !(eat_newline_glitch) &&
+ (n == columns-1))
+ {
+ T(("Lower-right corner needs special handling"));
+ LRCORNER = TRUE;
+ }
+
+ for (k=firstChar; k <= n; k++)
+ PutChar(newLine[k]);
+
+ if (oLastChar < nLastChar)
+ InsStr(&newLine[k], nLastChar - oLastChar);
+
+ else if (oLastChar > nLastChar )
+ DelChar(oLastChar - nLastChar);
+ }
+ }
+ for (k = firstChar; k < columns; k++)
+ oldLine[k] = newLine[k];
+}
+
+/*
+** ClearScreen()
+**
+** Clear the physical screen and put cursor at home
+**
+*/
+
+static void ClearScreen()
+{
+
+ T(("ClearScreen() called"));
+
+ if (clear_screen) {
+ putp(clear_screen);
+ SP->_cursrow = SP->_curscol = 0;
+ } else if (clr_eos) {
+ SP->_cursrow = SP->_curscol = -1;
+ GoTo(0,0);
+
+ putp(clr_eos);
+ } else if (clr_eol) {
+ SP->_cursrow = SP->_curscol = -1;
+
+ while (SP->_cursrow < lines) {
+ GoTo(SP->_cursrow, 0);
+ putp(clr_eol);
+ }
+ GoTo(0,0);
+ }
+ T(("screen cleared"));
+}
+
+
+/*
+** InsStr(line, count)
+**
+** Insert the count characters pointed to by line.
+**
+*/
+
+static void InsStr(chtype *line, int count)
+{
+ T(("InsStr(%x,%d) called", line, count));
+
+ if (enter_insert_mode && exit_insert_mode) {
+ putp(enter_insert_mode);
+ while (count) {
+ PutChar(*line);
+ line++;
+ count--;
+ }
+ putp(exit_insert_mode);
+ } else if (parm_ich) {
+ putp(tparm(parm_ich, count));
+ while (count) {
+ PutChar(*line);
+ line++;
+ count--;
+ }
+ } else {
+ while (count) {
+ putp(insert_character);
+ PutChar(*line);
+ line++;
+ count--;
+ }
+ }
+}
+
+/*
+** DelChar(count)
+**
+** Delete count characters at current position
+**
+*/
+
+static void DelChar(int count)
+{
+ T(("DelChar(%d) called", count));
+
+ if (back_color_erase && curscr->_attrs != A_NORMAL) {
+ T(("back_color_erase, turning attributes off"));
+ vidattr(curscr->_attrs = A_NORMAL);
+ }
+ if (parm_dch) {
+ putp(tparm(parm_dch, count));
+ } else {
+ while (count--)
+ putp(delete_character);
+ }
+}
+
diff --git a/lib/libncurses/lib_endwin.c b/lib/libncurses/lib_endwin.c
new file mode 100644
index 0000000..4e07e8f
--- /dev/null
+++ b/lib/libncurses/lib_endwin.c
@@ -0,0 +1,50 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_endwin.c
+**
+** The routine endwin().
+**
+*/
+
+#include "terminfo.h"
+#include "curses.priv.h"
+
+int isendwin()
+{
+ if (SP == NULL)
+ return FALSE;
+ return SP->_endwin;
+}
+
+int
+endwin()
+{
+ T(("endwin() called"));
+
+ SP->_endwin = TRUE;
+
+ if (change_scroll_region)
+ putp(tparm(change_scroll_region, 0, lines - 1));
+
+ mvcur(-1, -1, lines - 1, 0);
+
+ if (exit_ca_mode)
+ putp(exit_ca_mode);
+
+ if (SP->_coloron == TRUE)
+ putp(orig_pair);
+
+ if (curscr && (curscr->_attrs != A_NORMAL))
+ vidattr(curscr->_attrs = A_NORMAL);
+
+ if (SP->_cursor != 1)
+ putp(cursor_normal);
+
+ fflush(SP->_ofp);
+
+ return(reset_shell_mode());
+}
diff --git a/lib/libncurses/lib_erase.c b/lib/libncurses/lib_erase.c
new file mode 100644
index 0000000..38bf5ea
--- /dev/null
+++ b/lib/libncurses/lib_erase.c
@@ -0,0 +1,48 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_erase.c
+**
+** The routine werase().
+**
+*/
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+int werase(WINDOW *win)
+{
+int y;
+chtype *sp, *end, *start, *maxx = NULL;
+int minx;
+
+ T(("werase(%x) called", win));
+
+ for (y = win->_regtop; y <= win->_regbottom; y++) {
+ minx = _NOCHANGE;
+ start = win->_line[y];
+ end = &start[win->_maxx];
+
+ maxx = start;
+ for (sp = start; sp <= end; sp++) {
+ maxx = sp;
+ if (minx == _NOCHANGE)
+ minx = sp - start;
+ *sp = _nc_background(win);
+ }
+
+ if (minx != _NOCHANGE) {
+ if (win->_firstchar[y] > minx ||
+ win->_firstchar[y] == _NOCHANGE)
+ win->_firstchar[y] = minx;
+
+ if (win->_lastchar[y] < maxx - win->_line[y])
+ win->_lastchar[y] = maxx - win->_line[y];
+ }
+ }
+ win->_curx = win->_cury = 0;
+ return OK;
+}
diff --git a/lib/libncurses/lib_getch.c b/lib/libncurses/lib_getch.c
new file mode 100644
index 0000000..c30f7f2
--- /dev/null
+++ b/lib/libncurses/lib_getch.c
@@ -0,0 +1,224 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_getch.c
+**
+** The routine getch().
+**
+*/
+
+#include <sys/types.h>
+#include <string.h>
+#include <signal.h>
+#include <errno.h>
+#if defined(BRAINDEAD)
+extern int errno;
+#endif
+#include "curses.priv.h"
+
+#define head SP->_fifohead
+#define tail SP->_fifotail
+#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 p_inc() { peek == FIFO_SIZE-1 ? peek = 0 : peek++;}
+
+static int fifo_peek()
+{
+ T(("peeking at %d", peek+1));
+ return SP->_fifo[++peek];
+}
+
+static inline void fifo_dump()
+{
+int i;
+ T(("head = %d, tail = %d, peek = %d", head, tail, peek));
+ for (i = 0; i < 10; i++)
+ T(("char %d = %d (%c)", i, SP->_fifo[i], (unsigned char)SP->_fifo[i]));
+}
+
+static inline int fifo_pull()
+{
+int ch;
+ ch = SP->_fifo[head];
+ T(("pulling %d from %d", ch, head));
+
+ h_inc();
+ fifo_dump();
+ return ch;
+}
+
+int ungetch(int ch)
+{
+ if (tail == -1)
+ return ERR;
+ if (head == -1) {
+ head = 0;
+ t_inc()
+ } else
+ h_dec();
+
+ SP->_fifo[head] = ch;
+ T(("ungetch ok"));
+ fifo_dump();
+ return OK;
+}
+
+static inline int fifo_push()
+{
+int n;
+unsigned char ch;
+
+ if (tail == -1) return ERR;
+again:
+ n = read(fileno(SP->_ifp), &ch, 1);
+ if (n == -1 && errno == EINTR)
+ goto again;
+ T(("read %d characters", n));
+ SP->_fifo[tail] = ch;
+ if (head == -1) head = tail;
+ t_inc();
+ T(("pushed %d at %d", ch, tail));
+ fifo_dump();
+ return ch;
+}
+
+static inline void fifo_clear()
+{
+int i;
+ for (i = 0; i < FIFO_SIZE; i++)
+ SP->_fifo[i] = 0;
+ head = -1; tail = peek = 0;
+}
+
+static int kgetch(WINDOW *);
+
+int
+wgetch(WINDOW *win)
+{
+bool setHere = FALSE; /* cbreak mode was set here */
+int ch;
+
+ T(("wgetch(%x) called", win));
+
+ /* this should be eliminated */
+ if (! win->_scroll && (SP->_echo) && (win->_flags & _FULLWIN)
+ && win->_curx == win->_maxx && win->_cury == win->_maxy)
+ return(ERR);
+
+ if ((is_wintouched(win) || (win->_flags & _HASMOVED)) &&
+ !(win->_flags & _ISPAD))
+ wrefresh(win);
+
+ if (SP->_echo && ! (SP->_raw || SP->_cbreak)) {
+ cbreak();
+ setHere = TRUE;
+ }
+
+ if (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 microseconds", delay));
+
+ if (head == -1) /* fifo is empty */
+ if (timed_wait(fileno(SP->_ifp), delay, NULL) == 0)
+ return ERR;
+ /* else go on to read data available */
+ }
+
+ if (win->_use_keypad)
+ ch = kgetch(win);
+ else {
+ if (head == -1)
+ fifo_push();
+ ch = fifo_pull();
+ }
+
+ /* This should be eliminated */
+ /* handle 8-bit input */
+ if (ch & 0x80)
+ if (!win->_use_meta)
+ ch &= 0x7f;
+
+ /* there must be a simpler way of doing this */
+ if (!(win->_flags & _ISPAD) &&
+ SP->_echo && ch < 0400) { /* ch < 0400 => not a keypad key */
+ mvwaddch(curscr, win->_begy + win->_cury,
+ win->_begx + win->_curx, ch | win->_attrs);
+ waddch(win, ch | win->_attrs);
+ }
+ if (setHere)
+ nocbreak();
+
+ T(("wgetch returning : '%c', '0x%x'", ch, ch));
+
+ return(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 a one-second alarm call. If no more of the sequence
+** is received by the time the alarm goes off, pass through the sequence
+** gotten so far.
+**
+*/
+
+static int
+kgetch(WINDOW *win)
+{
+struct try *ptr;
+int ch = 0;
+int timeleft = 1000;
+
+ T(("kgetch(%x) called", win));
+
+ ptr = SP->_keytry;
+
+ if (head == -1) {
+ ch = fifo_push();
+ peek = 0;
+ while (ptr != NULL) {
+ T(("ch = %d", ch));
+ while ((ptr != NULL) && (ptr->ch != (unsigned char)ch))
+ ptr = ptr->sibling;
+
+ if (ptr != NULL)
+ if (ptr->value != 0) { /* sequence terminated */
+ T(("end of sequence"));
+ fifo_clear();
+ return(ptr->value);
+ } else { /* go back for another character */
+ ptr = ptr->child;
+ T(("going back for more"));
+ } else
+ break;
+
+ T(("waiting for rest of sequence"));
+ if (timed_wait(fileno(SP->_ifp), timeleft, &timeleft) < 1) {
+ T(("ran out of time"));
+ return(fifo_pull());
+ } else {
+ T(("got more!"));
+ fifo_push();
+ ch = fifo_peek();
+ }
+ }
+ }
+ return(fifo_pull());
+}
diff --git a/lib/libncurses/lib_getstr.c b/lib/libncurses/lib_getstr.c
new file mode 100644
index 0000000..0eda9b9
--- /dev/null
+++ b/lib/libncurses/lib_getstr.c
@@ -0,0 +1,113 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_getstr.c
+**
+** The routine wgetstr().
+**
+*/
+
+#include "curses.priv.h"
+#include "unctrl.h"
+
+inline void backspace(WINDOW *win)
+{
+ mvwaddstr(curscr, win->_begy + win->_cury, win->_begx + win->_curx,
+ "\b \b");
+ waddstr(win, "\b \b");
+ fputs("\b \b", SP->_ofp);
+ fflush(SP->_ofp);
+ SP->_curscol--;
+}
+
+int wgetnstr(WINDOW *win, char *str, int maxlen)
+{
+bool oldnl, oldecho, oldraw, oldcbreak, oldkeypad;
+char erasec;
+char killc;
+char *oldstr;
+int ch;
+
+ T(("wgetnstr(%x,%x, %d) called", win, str, maxlen));
+
+ oldnl = SP->_nl;
+ oldecho = SP->_echo;
+ oldraw = SP->_raw;
+ oldcbreak = SP->_cbreak;
+ oldkeypad = win->_use_keypad;
+ nl();
+ noecho();
+ noraw();
+ cbreak();
+ keypad(win, TRUE);
+
+ erasec = erasechar();
+ killc = killchar();
+
+ oldstr = str;
+
+ vidattr(win->_attrs);
+ if (is_wintouched(win) || (win->_flags & _HASMOVED))
+ wrefresh(win);
+
+ while ((ch = wgetch(win)) != ERR) {
+ if (ch == '\n' || ch == '\r')
+ break;
+ if (ch == erasec || ch == KEY_LEFT || ch == KEY_BACKSPACE) {
+ if (str > oldstr) {
+ str--;
+ backspace(win);
+ }
+ } else if (ch == killc) {
+ while (str > oldstr) {
+ str--;
+ backspace(win);
+ }
+ } else if (maxlen >= 0 && str - oldstr >= maxlen) {
+ beep();
+ } else {
+ mvwaddstr(curscr, win->_begy + win->_cury,
+ win->_begx + win->_curx, unctrl(ch));
+ waddstr(win, unctrl(ch));
+ if (oldecho == TRUE) {
+ fputs(unctrl(ch), SP->_ofp);
+ fflush(SP->_ofp);
+ }
+ SP->_curscol++;
+ *str++ = ch;
+ }
+ }
+
+ win->_curx = 0;
+ if (win->_cury < win->_maxy)
+ win->_cury++;
+ wrefresh(win);
+
+ if (oldnl == FALSE)
+ nonl();
+
+ if (oldecho == TRUE)
+ echo();
+
+ if (oldraw == TRUE)
+ raw();
+
+ if (oldcbreak == FALSE)
+ nocbreak();
+
+ if (oldkeypad == FALSE)
+ keypad(win, FALSE);
+
+ if (ch == ERR) {
+ *str = '\0';
+ return ERR;
+ }
+ *str = '\0';
+
+ T(("wgetnstr returns \"%s\"", visbuf(oldstr)));
+
+ return(OK);
+}
diff --git a/lib/libncurses/lib_inchstr.c b/lib/libncurses/lib_inchstr.c
new file mode 100644
index 0000000..d0ad351
--- /dev/null
+++ b/lib/libncurses/lib_inchstr.c
@@ -0,0 +1,29 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_inchstr.c
+**
+** The routine winchnstr().
+**
+*/
+
+#include "curses.priv.h"
+
+int winchnstr(WINDOW *win, chtype *chstr, int i)
+{
+chtype *point, *end;
+
+ T(("winschnstr(%x,'%x',%d) called", win, chstr, i));
+
+ point = &win->_line[win->_cury][win->_curx];
+ end = &win->_line[win->_cury][win->_maxx];
+ if (point + i - 1 < end)
+ end = point + i - 1;
+
+ chstr = (chtype *)malloc((end - point + 1)*sizeof(chtype));
+ chstr[end - point] = '\0';
+ return OK;
+}
diff --git a/lib/libncurses/lib_initscr.c b/lib/libncurses/lib_initscr.c
new file mode 100644
index 0000000..1c2d9e3
--- /dev/null
+++ b/lib/libncurses/lib_initscr.c
@@ -0,0 +1,40 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_initscr.c
+**
+** The routine initscr().
+**
+*/
+
+#include <stdlib.h>
+#include "curses.priv.h"
+
+WINDOW *initscr()
+{
+static bool initialized = FALSE;
+char *name;
+#ifdef TRACE
+ _init_trace();
+
+ T(("initscr() called"));
+#endif
+
+ /* Portable applications must not call initscr() more than once */
+ if (!initialized) {
+ initialized = TRUE;
+
+ if ((name = getenv("TERM")) == 0)
+ name = "unknown";
+ if (newterm(name, stdout, stdin) == 0) {
+ fprintf(stderr, "Error opening terminal: %s.\n", name);
+ exit(1);
+ }
+ /* def_shell_mode - done in newterm */
+ def_prog_mode();
+ }
+ return(stdscr);
+}
diff --git a/lib/libncurses/lib_insch.c b/lib/libncurses/lib_insch.c
new file mode 100644
index 0000000..ff30668
--- /dev/null
+++ b/lib/libncurses/lib_insch.c
@@ -0,0 +1,36 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_insch.c
+**
+** The routine winsch().
+**
+*/
+
+#include "curses.priv.h"
+
+int winsch(WINDOW *win, chtype c)
+{
+chtype *temp1, *temp2;
+chtype *end;
+
+ T(("winsch(%x,'%x') called", win, c));
+
+ end = &win->_line[win->_cury][win->_curx];
+ temp1 = &win->_line[win->_cury][win->_maxx];
+ temp2 = temp1 - 1;
+
+ while (temp1 > end)
+ *temp1-- = *temp2--;
+
+ *temp1 = _nc_render(win, c);
+
+ win->_lastchar[win->_cury] = win->_maxx;
+ if (win->_firstchar[win->_cury] == _NOCHANGE
+ || win->_firstchar[win->_cury] > win->_curx)
+ win->_firstchar[win->_cury] = win->_curx;
+ return OK;
+}
diff --git a/lib/libncurses/lib_insdel.c b/lib/libncurses/lib_insdel.c
new file mode 100644
index 0000000..aca7cc3
--- /dev/null
+++ b/lib/libncurses/lib_insdel.c
@@ -0,0 +1,49 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_insdel.c
+**
+** The routine winsdel(win, n).
+** positive n insert n lines above current line
+** negative n delete n lines starting from current line
+**
+*/
+
+#include <stdlib.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+
+int
+winsdelln(WINDOW *win, int n)
+{
+ int ret, sscroll, stop, sbot;
+
+ T(("winsdel(%x,%d) called", win, n));
+
+ if (n == 0)
+ return OK;
+ if (n < 0 && win->_cury - n >= win->_maxy)
+ /* request to delete too many lines */
+ /* should we truncate to an appropriate number? */
+ return ERR;
+
+ sscroll = win->_scroll;
+ stop = win->_regtop;
+ sbot = win->_regbottom;
+
+ win->_scroll = TRUE;
+ win->_regtop = win->_cury;
+ if (win->_regtop > win->_regbottom)
+ win->_regbottom = win->_maxy;
+
+ ret = wscrl(win, -n);
+
+ win->_scroll = sscroll;
+ win->_regtop = stop;
+ win->_regbottom = sbot;
+
+ return ret;
+}
diff --git a/lib/libncurses/lib_insstr.c b/lib/libncurses/lib_insstr.c
new file mode 100644
index 0000000..6307662
--- /dev/null
+++ b/lib/libncurses/lib_insstr.c
@@ -0,0 +1,21 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_insstr.c
+**
+** The routine winsnstr().
+**
+*/
+
+#include "curses.priv.h"
+
+int winsnstr(WINDOW *win, char *str, int n)
+{
+
+ T(("winsstr(%x,'%x',%d) called", win, str, n));
+
+ return OK;
+}
diff --git a/lib/libncurses/lib_instr.c b/lib/libncurses/lib_instr.c
new file mode 100644
index 0000000..6d850b3
--- /dev/null
+++ b/lib/libncurses/lib_instr.c
@@ -0,0 +1,54 @@
+
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992-1995 *
+* Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* Eric S. Raymond *
+* esr@snark.thyrsus.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, and is not *
+* removed from any of its header files. Mention of ncurses in any *
+* applications linked with it is highly appreciated. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+
+
+/*
+** lib_instr.c
+**
+** The routine winnstr().
+**
+*/
+
+#include "curses.priv.h"
+
+int winnstr(WINDOW *win, char *str, int n)
+{
+ int i, row, col;
+
+ T(("winnstr(%p,%p,%d) called", win, str, n));
+
+ getyx(win, row, col);
+
+ if (n < 0)
+ n = win->_maxx - win->_curx + 1;
+
+ for (i = 0; i < n;) {
+ str[i++] = TextOf(win->_line[row][col]);
+ if (++col > win->_maxx) {
+ col = 0;
+ if (++row > win->_maxy)
+ break;
+ }
+ }
+ str[i] = '\0'; /* SVr4 does not seem to count the null */
+
+ return (i);
+}
diff --git a/lib/libncurses/lib_kernel.c b/lib/libncurses/lib_kernel.c
new file mode 100644
index 0000000..a1d0a85
--- /dev/null
+++ b/lib/libncurses/lib_kernel.c
@@ -0,0 +1,318 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+ * lib_kernel.c
+ *
+ * Misc. low-level routines:
+ * reset_prog_mode()
+ * reset_shell_mode()
+ * baudrate()
+ * erasechar()
+ * killchar()
+ * flushinp()
+ * savetty()
+ * resetty()
+ *
+ *
+ */
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+int wattron(WINDOW *win, chtype at)
+{
+ T(("wattron(%x,%s) current = %s", win, _traceattr(at), _traceattr(win->_attrs)));
+ if (PAIR_NUMBER(at) > 0x00) {
+ win->_attrs = (win->_attrs & ~A_COLOR) | at ;
+ T(("new attribute is %s", _traceattr(win->_attrs)));
+ } else {
+ win->_attrs |= at;
+ T(("new attribute is %s", _traceattr(win->_attrs)));
+ }
+ return OK;
+}
+
+int wattroff(WINDOW *win, chtype at)
+{
+#define IGNORE_COLOR_OFF FALSE
+
+ T(("wattroff(%x,%s) current = %s", win, _traceattr(at), _traceattr(win->_attrs)));
+ if (IGNORE_COLOR_OFF == TRUE) {
+ if (PAIR_NUMBER(at) == 0xff) /* turn off color */
+ win->_attrs &= ~at;
+ else /* leave color alone */
+ win->_attrs &= ~(at & ~A_COLOR);
+ } else {
+ if (PAIR_NUMBER(at) > 0x00) /* turn off color */
+ win->_attrs &= ~at;
+ else /* leave color alone */
+ win->_attrs &= ~(at & ~A_COLOR);
+ }
+ T(("new attribute is %s", _traceattr(win->_attrs)));
+ return OK;
+}
+
+#ifndef MYTINFO
+int reset_prog_mode()
+{
+ T(("reset_prog_mode() called"));
+
+#ifdef TERMIOS
+ tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb);
+#else
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+#endif
+
+ return OK;
+}
+
+
+int reset_shell_mode()
+{
+ T(("reset_shell_mode() called"));
+
+#ifdef TERMIOS
+ tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Ottyb);
+#else
+ stty(cur_term->Filedes, &cur_term->Ottyb);
+#endif
+
+ return OK;
+}
+#endif
+
+int curs_set(int vis)
+{
+int cursor = SP->_cursor;
+
+ T(("curs_set(%d)", vis));
+
+ if (vis < 0 || vis > 2)
+ return ERR;
+
+ switch(vis) {
+ case 2:
+ if (cursor_visible)
+ putp(cursor_visible);
+ break;
+ case 1:
+ if (cursor_normal)
+ putp(cursor_normal);
+ break;
+ case 0:
+ if (cursor_invisible)
+ putp(cursor_invisible);
+ break;
+ }
+ SP->_cursor = vis;
+ return cursor;
+}
+
+int delay_output(int ms)
+{
+int speed;
+
+ T(("delay_output(%d) called", ms));
+
+ if (!no_pad_char && (speed = baudrate()) == ERR)
+ return(ERR);
+ else {
+ register int nullcount;
+
+ if (!no_pad_char)
+ for (nullcount = ms * 1000 / speed; nullcount > 0; nullcount--)
+ putc(*pad_char, SP->_ofp);
+ (void) fflush(SP->_ofp);
+ if (no_pad_char)
+ napms(ms);
+ }
+
+ return OK;
+}
+
+/*
+ * erasechar()
+ *
+ * Return erase character as given in cur_term->Ottyb.
+ *
+ */
+
+char
+erasechar()
+{
+ T(("erasechar() called"));
+
+#ifdef TERMIOS
+ return(cur_term->Ottyb.c_cc[VERASE]);
+#else
+ return(cur_term->Ottyb.sg_erase);
+#endif
+
+}
+
+
+
+/*
+ * killchar()
+ *
+ * Return kill character as given in cur_term->Ottyb.
+ *
+ */
+
+char
+killchar()
+{
+ T(("killchar() called"));
+
+#ifdef TERMIOS
+ return(cur_term->Ottyb.c_cc[VKILL]);
+#else
+ return(cur_term->Ottyb.sg_kill);
+#endif
+}
+
+
+
+/*
+ * flushinp()
+ *
+ * Flush any input on cur_term->Filedes
+ *
+ */
+
+int flushinp()
+{
+ T(("flushinp() called"));
+
+#ifdef TERMIOS
+ tcflush(cur_term->Filedes, TCIFLUSH);
+#else
+ ioctl(cur_term->Filedes, TIOCFLUSH, 0);
+#endif
+ if (SP) {
+ SP->_fifohead = -1;
+ SP->_fifotail = 0;
+ SP->_fifopeek = 0;
+ }
+ return OK;
+
+}
+
+
+
+/*
+ * int
+ * baudrate()
+ *
+ * Returns the current terminal's baud rate.
+ *
+ */
+
+#ifndef TERMIOS
+struct speed {
+ speed_t s;
+ int sp;
+};
+
+static struct speed 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}
+#define MAX_BAUD B9600
+#ifdef B19200
+#undef MAX_BAUD
+#define MAX_BAUD B19200
+ ,{B19200, 19200}
+#endif
+#ifdef B38400
+#undef MAX_BAUD
+#define MAX_BAUD B38400
+ ,{B38400, 38400}
+#endif
+#ifdef B57600
+#undef MAX_BAUD
+#define MAX_BAUD B57600
+ ,{B57600, 57600}
+#endif
+#ifdef B115200
+#undef MAX_BAUD
+#define MAX_BAUD B115200
+ ,{B115200, 115200}
+#endif
+};
+#endif
+
+int
+baudrate()
+{
+#ifndef TERMIOS
+int i, ret;
+#endif
+
+ T(("baudrate() called"));
+
+#ifdef TERMIOS
+ return cfgetospeed(&cur_term->Nttyb);
+#else
+ ret = cur_term->Nttyb.sg_ospeed;
+ if(ret < 0 || ret > MAX_BAUD)
+ return ERR;
+ for (i = 0; i < (sizeof(speeds) / sizeof(struct speed)); i++)
+ if (speeds[i].s == ret)
+ return speeds[i].sp;
+ return ERR;
+#endif
+}
+
+
+/*
+** savetty() and resetty()
+**
+*/
+
+static TTY buf;
+
+int savetty()
+{
+ T(("savetty() called"));
+
+#ifdef TERMIOS
+ tcgetattr(cur_term->Filedes, &buf);
+#else
+ gtty(cur_term->Filedes, &buf);
+#endif
+ return OK;
+}
+
+int resetty()
+{
+ T(("resetty() called"));
+
+#ifdef TERMIOS
+ tcsetattr(cur_term->Filedes, TCSANOW, &buf);
+#else
+ stty(cur_term->Filedes, &buf);
+#endif
+ return OK;
+}
+
+
+int
+resizeterm(int ToLines, int ToCols)
+{
+ return OK;
+}
diff --git a/lib/libncurses/lib_longname.c b/lib/libncurses/lib_longname.c
new file mode 100644
index 0000000..a8de085
--- /dev/null
+++ b/lib/libncurses/lib_longname.c
@@ -0,0 +1,35 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_longname.c
+**
+** The routine longname().
+**
+*/
+
+#include <string.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+
+char *
+longname()
+{
+#ifndef MYTINFO
+char *ptr;
+#endif
+
+ T(("longname() called"));
+
+#ifdef MYTINFO
+ return cur_term->name_long;
+#else
+ for (ptr = ttytype + strlen(ttytype); ptr > ttytype; ptr--)
+ if (*ptr == '|')
+ return(ptr + 1);
+
+ return(ttytype);
+#endif
+}
diff --git a/lib/libncurses/lib_move.c b/lib/libncurses/lib_move.c
new file mode 100644
index 0000000..cf56fa0
--- /dev/null
+++ b/lib/libncurses/lib_move.c
@@ -0,0 +1,30 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_move.c
+**
+** The routine wmove().
+**
+*/
+
+#include "curses.priv.h"
+
+int
+wmove(WINDOW *win, int y, int x)
+{
+ T(("wmove(%x,%d,%d) called", win, y, x));
+
+ if (x >= 0 && x <= win->_maxx &&
+ y >= 0 && y <= win->_maxy)
+ {
+ win->_curx = x;
+ win->_cury = y;
+
+ win->_flags |= _HASMOVED;
+ return(OK);
+ } else
+ return(ERR);
+}
diff --git a/lib/libncurses/lib_mvcur.c b/lib/libncurses/lib_mvcur.c
new file mode 100644
index 0000000..388c680
--- /dev/null
+++ b/lib/libncurses/lib_mvcur.c
@@ -0,0 +1,700 @@
+/*---------------------------------------------------------------------------
+ *
+ * lib_mvcur.c
+ *
+ * The routine mvcur() etc.
+ *
+ * last edit-date: [Wed Jun 16 14:13:22 1993]
+ *
+ * -hm conversion from termcap -> terminfo
+ * -hm optimization debugging
+ * -hm zeyd's ncurses 0.7 update
+ * -hm eat_newline_glitch bugfix
+ * -hm hpux lint'ing ..
+ *
+ *---------------------------------------------------------------------------*/
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+#include <string.h>
+#include <stdlib.h>
+#include "terminfo.h"
+#include "curses.priv.h"
+
+#ifndef OPT_MVCUR
+/*
+**
+** mvcur(oldrow, oldcol, newrow, newcol)
+** A hack for terminals that are smart enough
+** to know how to move cursor.
+** There is still a bug in the alternative long-
+** winded code.
+**
+*/
+
+int mvcur(int oldrow, int oldcol, int newrow, int newcol)
+{
+ T(("mvcur(%d,%d,%d,%d) called", oldrow, oldcol, newrow, newcol));
+
+ if(!cursor_address)
+ return ERR;
+
+ newrow %= lines;
+ newcol %= columns;
+
+ if (cursor_address)
+ putp(tparm(cursor_address, newrow, newcol));
+ return OK;
+
+}
+
+#else
+
+#define BUFSIZE 128 /* size of strategy buffer */
+
+struct Sequence
+{
+ int vec[BUFSIZE]; /* vector of operations */
+ int *end; /* end of vector */
+ int cost; /* cost of vector */
+};
+
+static void row(struct Sequence *outseq, int orow, int nrow);
+static void column(struct Sequence *outseq, int ocol, int ncol);
+static void simp_col(struct Sequence *outseq, int oc, int nc);
+static void zero_seq(struct Sequence *seq);
+static void add_seq(struct Sequence *seq1, struct Sequence *seq2);
+static void out_seq(struct Sequence *seq);
+static void update_ops(void);
+static void init_costs(int costs[]);
+static int countc(char ch);
+static void add_op(struct Sequence *seq, int op, ...);
+static char *sequence(int op);
+
+static int c_count; /* used for counting tputs output */
+
+#define INFINITY 1000 /* biggest, impossible sequence cost */
+#define NUM_OPS 16 /* num. term. control sequences */
+#define NUM_NPARM 9 /* num. ops wo/ parameters */
+
+ /* operator indexes into op_info */
+
+#define CARRIAGE_RETURN 0 /* watch out for nl mapping */
+#define CURS_DOWN 1
+#define CURS_HOME 2
+#define CURS_LEFT 3
+#define CURS_RIGHT 4
+#define CURS_TO_LL 5
+#define CURS_UP 6
+#define TAB 7
+#define BACK_TAB 8
+#define ROW_ADDR 9
+#define COL_ADDR 10
+#define P_DOWN_CURS 11
+#define P_LEFT_CURS 12
+#define P_RIGHT_CURS 13
+#define P_UP_CURS 14
+#define CURS_ADDR 15
+
+static bool loc_init = FALSE; /* set if op_info is init'ed */
+
+static bool rel_ok; /* set if we really know where we are */
+
+/*
+ * op_info[NUM_OPS]
+ *
+ * op_info[] contains for operations with no parameters
+ * the cost of the operation. These ops should be first in the array.
+ * For operations with parameters, op_info[] contains
+ * the negative of the number of parameters.
+ */
+
+static int op_info[NUM_OPS] = {
+ 0, /* carriage_return */
+ 0, /* cursor_down */
+ 0, /* cursor_home */
+ 0, /* cursor_left */
+ 0, /* cursor_right */
+ 0, /* cursor_to_ll */
+ 0, /* cursor_up */
+ 0, /* tab */
+ 0, /* back_tab */
+ -1, /* row_address */
+ -1, /* column_address */
+ -1, /* parm_down_cursor */
+ -1, /* parm_left_cursor */
+ -1, /* parm_right_cursor */
+ -1, /* parm_up_cursor */
+ -2 /* cursor_address */
+};
+
+/*
+** Make_seq_best(best, try)
+**
+** Make_seq_best() copies try to best if try->cost < best->cost
+**
+** fixed the old version, now it really runs .. (-hm/08.04.93)
+**
+*/
+
+inline void Make_seq_best(struct Sequence *best, struct Sequence *try)
+{
+ if (best->cost > try->cost) {
+ register int *sptr;
+
+ sptr = try->vec; /* src ptr */
+ best->end = best->vec; /* dst ptr */
+ while(sptr != try->end) /* copy src -> dst */
+ *(best->end++) = *(sptr++);
+ best->cost = try->cost; /* copy cost */
+ }
+}
+
+
+/*
+**
+** mvcur(oldrow, oldcol, newrow, newcol)
+**
+** mvcur() optimally moves the cursor from the position
+** specified by (oldrow, oldcol) to (newrow, newcol). If
+** (oldrow, oldcol) == (-1, -1), mvcur() does not use relative
+** cursor motions. If the coordinates are otherwise
+** out of bounds, it mods them into range.
+**
+** Revisions needed:
+** eat_newline_glitch, auto_right_margin
+*/
+
+int mvcur(int oldrow, int oldcol, int newrow, int newcol)
+{
+struct Sequence seqA, seqB, /* allocate work structures */
+ col0seq, /* sequence to get from col0 to nc */
+ *best, /* best sequence so far */
+ *try; /* next try */
+bool nlstat = SP->_nl; /* nl-output-mapping in effect ?*/
+
+ T(("=============================\nmvcur(%d,%d,%d,%d) called",
+ oldrow, oldcol, newrow, newcol));
+
+ if ((oldrow == newrow) && (oldcol == newcol))
+ return OK;
+
+ if (oldcol == columns-1 && eat_newline_glitch && auto_right_margin) {
+ putp(tparm(cursor_address, newrow, newcol));
+ return OK;
+ }
+
+#if 0
+ if (nlstat)
+ nonl();
+#endif
+ update_ops(); /* make sure op_info[] is current */
+
+ if (oldrow < 0 || oldcol < 0 || (eat_newline_glitch && oldcol == 0 )) {
+ rel_ok = FALSE; /* relative ops ok? */
+ } else {
+ rel_ok = TRUE;
+ oldrow %= lines; /* mod values into range */
+ oldcol %= columns;
+ }
+
+ newrow %= lines;
+ newcol %= columns;
+
+ best = &seqA;
+ try = &seqB;
+
+ /* try out direct cursor addressing */
+
+ zero_seq(best);
+ add_op(best, CURS_ADDR, newrow, newcol);
+
+ /* try out independent row/column addressing */
+
+ if(rel_ok) {
+ zero_seq(try);
+ row(try, oldrow, newrow);
+ column(try, oldcol, newcol);
+ Make_seq_best(best, try);
+ }
+
+ zero_seq(&col0seq); /* store seq. to get from c0 to nc */
+ column(&col0seq, 0, newcol);
+
+ if(col0seq.cost < INFINITY) { /* can get from col0 to newcol */
+
+ /* try out homing and then row/column */
+
+ if (! rel_ok || newcol < oldcol || newrow < oldrow) {
+ zero_seq(try);
+ add_op(try, CURS_HOME, 1);
+ row(try, 0, newrow);
+ add_seq(try, &col0seq);
+ Make_seq_best(best, try);
+ }
+
+ /* try out homing to last line and then row/column */
+
+ if (! rel_ok || newcol < oldcol || newrow > oldrow) {
+ zero_seq(try);
+ add_op(try, CURS_TO_LL, 1);
+ row(try, lines - 1, newrow);
+ add_seq(try, &col0seq);
+ Make_seq_best(best, try);
+ }
+ }
+
+ out_seq(best);
+#if 0
+ if(nlstat)
+ nl();
+#endif
+
+ T(("==================================="));
+
+ return OK;
+}
+
+/*
+** row(outseq, oldrow, newrow)
+**
+** row() adds the best sequence for moving
+** the cursor from oldrow to newrow to seq.
+** row() considers row_address, parm_up/down_cursor
+** and cursor_up/down.
+*/
+
+static void
+row(struct Sequence *outseq, /* where to put the output */
+int orow, int nrow) /* old, new cursor locations */
+{
+struct Sequence seqA, seqB,
+ *best, /* best sequence so far */
+ *try; /* next try */
+
+int parm_cursor, one_step;
+
+ best = &seqA;
+ try = &seqB;
+
+ if (nrow == orow)
+ return;
+
+ if (nrow < orow) {
+ parm_cursor = P_UP_CURS;
+ one_step = CURS_UP;
+ } else {
+ parm_cursor = P_DOWN_CURS;
+ one_step = CURS_DOWN;
+ }
+
+ /* try out direct row addressing */
+
+ zero_seq(best);
+ add_op(best, ROW_ADDR, nrow);
+
+ /* try out paramaterized up or down motion */
+
+ if (rel_ok) {
+ zero_seq(try);
+ add_op(try, parm_cursor, abs(orow - nrow));
+ Make_seq_best(best, try);
+ }
+
+ /* try getting there one step at a time... */
+
+ if (rel_ok) {
+ zero_seq(try);
+ add_op(try, one_step, abs(orow-nrow));
+ Make_seq_best(best, try);
+ }
+
+ add_seq(outseq, best);
+}
+
+
+/*
+** column(outseq, oldcol, newcol)
+**
+** column() adds the best sequence for moving
+** the cursor from oldcol to newcol to outseq.
+** column() considers column_address, parm_left/right_cursor,
+** simp_col(), and carriage_return followed by simp_col().
+*/
+
+static void column(struct Sequence *outseq, /* where to put the output */
+int ocol, int ncol) /* old, new cursor column */
+{
+struct Sequence seqA, seqB,
+ *best, *try;
+int parm_cursor; /* set to either parm_up/down_cursor */
+
+ best = &seqA;
+ try = &seqB;
+
+ if (ncol == ocol)
+ return;
+
+ if (ncol < ocol)
+ parm_cursor = P_LEFT_CURS;
+ else
+ parm_cursor = P_RIGHT_CURS;
+
+ /* try out direct column addressing */
+
+ zero_seq(best);
+ add_op(best, COL_ADDR, ncol);
+
+ /* try carriage_return then simp_col() */
+
+ if(! rel_ok || (ncol < ocol)) {
+ zero_seq(try);
+ add_op(try, CARRIAGE_RETURN, 1);
+ simp_col(try, 0, ncol);
+ Make_seq_best(best, try);
+ }
+ if(rel_ok) {
+ /* try out paramaterized left or right motion */
+
+ zero_seq(try);
+ add_op(try, parm_cursor, abs(ocol - ncol));
+ Make_seq_best(best, try);
+
+ /* try getting there with simp_col() */
+
+ zero_seq(try);
+ simp_col(try, ocol, ncol);
+ Make_seq_best(best, try);
+ }
+
+ add_seq(outseq, best);
+}
+
+
+/*
+** simp_col(outseq, oldcol, newcol)
+**
+** simp_col() adds the best simple sequence for getting
+** from oldcol to newcol to outseq.
+** simp_col() considers (back_)tab and cursor_left/right.
+**
+** Revisions needed:
+** Simp_col asssumes that the cost of a (back_)tab
+** is less then the cost of one-stepping to get to the same column.
+** Should sometimes use overprinting instead of cursor_right.
+*/
+
+static void
+simp_col( struct Sequence *outseq, /* place to put sequence */
+int oc, int nc) /* old column, new column */
+{
+struct Sequence seqA, seqB, tabseq,
+ *best, *try;
+int mytab, tabs, onepast,
+ one_step, opp_step;
+
+ onepast = -1;
+
+ if (oc == nc)
+ return;
+
+ if(! rel_ok) {
+ outseq->cost = INFINITY;
+ return;
+ }
+
+ best = &seqA;
+ try = &seqB;
+
+ if(oc < nc) {
+ mytab = TAB;
+
+ if (init_tabs > 0 && op_info[TAB] < INFINITY) {
+ tabs = (nc / init_tabs) - (oc / init_tabs);
+ onepast = ((nc / init_tabs) + 1) * init_tabs;
+ if (tabs)
+ oc = onepast - init_tabs; /* consider it done */
+ } else {
+ tabs = 0;
+ }
+ one_step = CURS_RIGHT;
+ opp_step = CURS_LEFT;
+ } else {
+ mytab = BACK_TAB;
+ if (init_tabs > 0 && op_info[BACK_TAB] < INFINITY) {
+ tabs = (oc / init_tabs) - (nc / init_tabs);
+ onepast = ((nc - 1) / init_tabs) * init_tabs;
+ if (tabs)
+ oc = onepast + init_tabs; /* consider it done */
+ } else {
+ tabs = 0;
+ }
+ one_step = CURS_LEFT;
+ opp_step = CURS_RIGHT;
+ }
+
+ /* tab as close as possible to nc */
+
+ zero_seq(&tabseq);
+ add_op(&tabseq, mytab, tabs);
+
+ /* try extra tab and backing up */
+
+ zero_seq(best);
+
+ if (onepast >= 0 && onepast < columns) {
+ add_op(best, mytab, 1);
+ add_op(best, opp_step, abs(onepast - nc));
+ } else {
+ best->cost = INFINITY; /* make sure of next swap */
+ }
+
+ /* try stepping to nc */
+
+ zero_seq(try);
+ add_op(try, one_step, abs(nc - oc));
+ Make_seq_best(best, try);
+
+ if (tabseq.cost < INFINITY)
+ add_seq(outseq, &tabseq);
+ add_seq(outseq, best);
+}
+
+
+/*
+** zero_seq(seq) empties seq.
+** add_seq(seq1, seq2) adds seq1 to seq2.
+** out_seq(seq) outputs a sequence.
+*/
+
+static void
+zero_seq(seq)
+struct Sequence *seq;
+{
+ seq->end = seq->vec;
+ seq->cost = 0;
+}
+
+static void
+add_seq(struct Sequence *seq1, struct Sequence *seq2)
+{
+int *vptr;
+
+ T(("add_seq(%x, %x)", seq1, seq2));
+
+ if(seq1->cost >= INFINITY || seq2->cost >= INFINITY)
+ seq1->cost = INFINITY;
+ else {
+ vptr = seq2->vec;
+ while (vptr != seq2->end)
+ *(seq1->end++) = *(vptr++);
+ seq1->cost += seq2->cost;
+ }
+}
+
+
+static void
+out_seq(struct Sequence *seq)
+{
+int *opptr, prm[9], ps, p, op;
+int count;
+char *sequence();
+
+ T(("out_seq(%x)", seq));
+
+ if (seq->cost >= INFINITY)
+ return;
+
+ for (opptr = seq->vec; opptr < seq->end; opptr++) {
+ op = *opptr; /* grab operator */
+ ps = -op_info[op];
+ if(ps > 0) { /* parameterized */
+ for (p = 0; p < ps; p++) /* fill in needed parms */
+ prm[p] = *(++opptr);
+
+ putp(tparm(sequence(op),
+ prm[0], prm[1], prm[2], prm[3], prm[4],
+ prm[5], prm[6], prm[7], prm[8]));
+ } else {
+ count = *(++opptr);
+ /*rev should save tputs output instead of mult calls */
+ while (count--) /* do count times */
+ putp(sequence(op));
+ }
+ }
+}
+
+
+/*
+** update_ops()
+**
+** update_ops() makes sure that
+** the op_info[] array is updated and initializes
+** the cost array for SP if needed.
+*/
+
+static void
+update_ops()
+{
+ T(("update_ops()"));
+
+ if (SP) { /* SP structure exists */
+ int op;
+
+ if (! SP->_costinit) { /* this term not yet assigned costs */
+ loc_init = FALSE; /* if !SP in the future, new term */
+ init_costs(SP->_costs); /* fill term costs */
+ SP->_costinit = TRUE;
+ }
+
+ for (op = 0; op < NUM_NPARM; op++)
+ op_info[op] = SP->_costs[op]; /* set up op_info */
+
+ /* check for newline that might be mapped... */
+
+ if (SP->_nlmapping && index(sequence(CURS_DOWN), '\n'))
+ op_info[CURS_DOWN] = INFINITY;
+ } else {
+ if (! loc_init) { /* using local costs */
+ loc_init = TRUE;
+ init_costs(op_info); /* set up op_info */
+ }
+
+ /* check for newline that might be mapped... */
+
+ if (index(sequence(CURS_DOWN), '\n'))
+ op_info[CURS_DOWN] = INFINITY;
+ }
+}
+
+
+/*
+** init_costs(costs)
+**
+** init_costs() fills the array costs[NUM_NPARM]
+** with costs calculated by doing tputs() calls.
+*/
+
+static void
+init_costs(int costs[])
+{
+int i;
+
+ for (i = 0; i < NUM_NPARM; i++) {
+ if (sequence(i) != (char *) 0) {
+ c_count = 0;
+ tputs(sequence(i), 1, countc);
+ costs[i] = c_count;
+ } else
+ costs[i] = INFINITY;
+ }
+}
+
+
+/*
+** countc() increments global var c_count.
+*/
+
+static int countc(char ch)
+{
+ return(c_count++);
+}
+
+/*
+** add_op(seq, op, p0, p1, ... , p8)
+**
+** add_op() adds the operator op and the appropriate
+** number of paramaters to seq. It also increases the
+** cost appropriately.
+** if op has no parameters, p0 is taken to be a count.
+*/
+
+static void add_op(struct Sequence *seq, int op, ...)
+{
+va_list argp;
+int num_ps, p;
+
+ T(("adding op %d to sequence", op));
+
+ va_start(argp, op);
+
+ num_ps = - op_info[op]; /* get parms or -cost */
+
+ *(seq->end++) = op;
+
+ if (num_ps == (- INFINITY) || sequence(op) == (char *) 0) {
+ seq->cost = INFINITY;
+ } else if (num_ps <= 0) { /* no parms, -cost */
+ int i = va_arg(argp, int);
+ seq->cost -= i * num_ps; /* ADD count * cost */
+ *(seq->end++) = i;
+ } else {
+ int prm[9];
+
+ for (p = 0; p < num_ps; p++)
+ *(seq->end++) = prm[p] = va_arg(argp, int);
+
+ c_count = 0;
+
+ tputs(tparm(sequence(op), prm[0], prm[1], prm[2], prm[3], prm[4],
+ prm[5], prm[6], prm[7], prm[8]), 1, countc);
+
+ seq->cost += c_count;
+ }
+ va_end(argp);
+}
+
+
+/*
+** char *sequence(op)
+**
+** sequence() returns a pointer to the op's
+** terminal control sequence.
+*/
+
+static char *sequence(int op)
+{
+ T(("sequence(%d)", op));
+
+ switch(op) {
+ case CARRIAGE_RETURN:
+ return (carriage_return);
+ case CURS_DOWN:
+ return (cursor_down);
+ case CURS_HOME:
+ return (cursor_home);
+ case CURS_LEFT:
+ return (cursor_left);
+ case CURS_RIGHT:
+ return (cursor_right);
+ case CURS_TO_LL:
+ return (cursor_to_ll);
+ case CURS_UP:
+ return (cursor_up);
+ case TAB:
+ return (tab);
+ case BACK_TAB:
+ return (back_tab);
+ case ROW_ADDR:
+ return (row_address);
+ case COL_ADDR:
+ return (column_address);
+ case P_DOWN_CURS:
+ return (parm_down_cursor);
+ case P_LEFT_CURS:
+ return (parm_left_cursor);
+ case P_RIGHT_CURS:
+ return (parm_right_cursor);
+ case P_UP_CURS:
+ return (parm_up_cursor);
+ case CURS_ADDR:
+ return (cursor_address);
+ default:
+ return ((char *) 0);
+ }
+}
+
+#endif
+
diff --git a/lib/libncurses/lib_mvwin.c b/lib/libncurses/lib_mvwin.c
new file mode 100644
index 0000000..2e6159f
--- /dev/null
+++ b/lib/libncurses/lib_mvwin.c
@@ -0,0 +1,29 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_mvwin.c
+**
+** The routine mvwin().
+**
+*/
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+int mvwin(WINDOW *win, int by, int bx)
+{
+ T(("mvwin(%x,%d,%d) called", win, by, bx));
+
+ if (by + win->_maxy > lines - 1 || bx + win->_maxx > columns - 1)
+ return(ERR);
+
+ win->_begy = by;
+ win->_begx = bx;
+
+ touchwin(win);
+
+ return(OK);
+}
diff --git a/lib/libncurses/lib_newterm.c b/lib/libncurses/lib_newterm.c
new file mode 100644
index 0000000..95ef1eb
--- /dev/null
+++ b/lib/libncurses/lib_newterm.c
@@ -0,0 +1,176 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_newterm.c
+**
+** The newterm() function.
+**
+*/
+
+#include <stdlib.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+#ifdef SVR4_ACTION
+#define _POSIX_SOURCE
+#endif
+#include <signal.h>
+
+#ifdef MYTINFO
+int LINES, COLS;
+#endif
+
+static void cleanup(int sig)
+{
+
+ if (sig == SIGSEGV)
+ fprintf(stderr, "Got a segmentation violation signal, cleaning up and exiting\n");
+ endwin();
+ exit(1);
+}
+
+static void
+size_change(int sig)
+{
+ struct ttysize ws;
+
+ if (ioctl(0, TIOCGSIZE, &ws) != -1) {
+ LINES = ws.ts_lines;
+ COLS = ws.ts_cols;
+ }
+}
+
+WINDOW *stdscr, *curscr, *newscr;
+SCREEN *SP;
+
+struct ripoff_t
+{
+ int line;
+ int (*hook)();
+}
+rippedoff[5], *rsp = rippedoff;
+
+SCREEN * newterm(char *term, FILE *ofp, FILE *ifp)
+{
+sigaction_t act;
+int errret;
+int stolen, topstolen;
+extern char _ncurses_copyright[];
+char *use_it = _ncurses_copyright;
+
+ use_it = use_it; /* shut up compiler */
+#ifdef TRACE
+ _init_trace();
+ T(("newterm(\"%s\",%x,%x) called", term, ofp, ifp));
+#endif
+
+#ifdef MYTINFO
+ if (setupterm(term, fileno(ofp), &errret) != OK)
+ return NULL;
+ COLS = columns;
+ LINES = lines;
+#else
+ if (setupterm(term, fileno(ofp), &errret) != 1)
+ return NULL;
+#endif
+
+ if ((SP = (SCREEN *) malloc(sizeof *SP)) == NULL)
+ return NULL;
+
+ if (ofp == stdout && ifp == stdin) {
+ SP->_ofp = stdout;
+ SP->_ifp = stdin;
+ } else {
+ SP->_ofp = ofp;
+ SP->_ifp = ofp;
+ }
+ SP->_term = cur_term;
+ SP->_cursrow = -1;
+ SP->_curscol = -1;
+ SP->_keytry = UNINITIALISED;
+ SP->_nl = TRUE;
+ SP->_raw = FALSE;
+ SP->_cbreak = FALSE;
+ SP->_echo = TRUE;
+ SP->_nlmapping = TRUE;
+ SP->_fifohead = -1;
+ SP->_fifotail = 0;
+ SP->_fifopeek = 0;
+ SP->_endwin = FALSE;
+ SP->_checkfd = fileno(ifp);
+ typeahead(fileno(ifp));
+
+ if (enter_ca_mode)
+ putp(enter_ca_mode);
+
+ init_acs();
+
+ T(("creating newscr"));
+ if ((newscr = newwin(lines, columns, 0, 0)) == (WINDOW *)NULL)
+ return(NULL);
+
+ T(("creating curscr"));
+ if ((curscr = newwin(lines, columns, 0, 0)) == (WINDOW *)NULL)
+ return(NULL);
+
+ SP->_newscr = newscr;
+ SP->_curscr = curscr;
+
+ newscr->_clear = TRUE;
+ curscr->_clear = FALSE;
+
+ stolen = topstolen = 0;
+ for (rsp = rippedoff; rsp->line; rsp++) {
+ if (rsp->hook)
+ if (rsp->line < 0)
+ rsp->hook(newwin(1,COLS, LINES-1,0), COLS);
+ else
+ rsp->hook(newwin(1,COLS, topstolen++,0), COLS);
+ --LINES;
+ stolen++;
+ }
+
+ act.sa_handler = tstp;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ sigaction(SIGTSTP, &act, NULL);
+ act.sa_handler = cleanup;
+ sigaction(SIGINT, &act, NULL);
+ sigaction(SIGTERM, &act, NULL);
+#if 0
+ sigaction(SIGSEGV, &act, NULL);
+#endif
+ act.sa_handler = size_change;
+ act.sa_flags = SA_RESTART;
+ sigaction(SIGWINCH, &act, NULL); /* this must restart read() */
+ if ((stdscr = newwin(lines - stolen, columns, topstolen, 0)) == NULL)
+ return(NULL);
+
+ SP->_stdscr = stdscr;
+
+ def_shell_mode();
+ def_prog_mode();
+
+ T(("newterm returns %x", SP));
+
+ return(SP);
+}
+
+int
+ripoffline(int line, int (*init)(WINDOW *, int))
+{
+ if (line == 0)
+ return(OK);
+
+ if (rsp >= rippedoff + sizeof(rippedoff)/sizeof(rippedoff[0]))
+ return(ERR);
+
+ rsp->line = line;
+ rsp->hook = init;
+ rsp++;
+
+ return(OK);
+}
+
diff --git a/lib/libncurses/lib_newwin.c b/lib/libncurses/lib_newwin.c
new file mode 100644
index 0000000..b58eb07
--- /dev/null
+++ b/lib/libncurses/lib_newwin.c
@@ -0,0 +1,185 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_newwin.c
+**
+** The routines newwin(), subwin() and their dependent
+**
+*/
+
+#include <stdlib.h>
+#include "terminfo.h"
+#include "curses.priv.h"
+
+WINDOW * newwin(int num_lines, int num_columns, int begy, int begx)
+{
+WINDOW *win;
+chtype *ptr;
+int i, j;
+
+ T(("newwin(%d,%d,%d,%d) called", num_lines, num_columns, begy, begx));
+
+ if (num_lines == 0)
+ num_lines = lines - begy;
+
+ if (num_columns == 0)
+ num_columns = columns - begx;
+
+ if (num_columns + begx > columns || num_lines + begy > lines)
+ return NULL;
+
+ if ((win = makenew(num_lines, num_columns, begy, begx)) == NULL)
+ return NULL;
+
+ for (i = 0; i < num_lines; i++) {
+ if ((win->_line[i] = (chtype *) calloc(num_columns, sizeof(chtype))) == NULL) {
+ for (j = 0; j < i; j++)
+ free(win->_line[j]);
+
+ free(win->_firstchar);
+ free(win->_lastchar);
+ free(win->_line);
+ free(win);
+
+ return NULL;
+ }
+ else
+ for (ptr = win->_line[i]; ptr < win->_line[i] + num_columns; )
+ *ptr++ = ' ';
+ }
+
+ T(("newwin: returned window is %x", win));
+
+ return(win);
+}
+
+WINDOW * derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx)
+{
+WINDOW *win;
+int i;
+
+ T(("derwin(%x, %d,%d,%d,%d) called", orig, num_lines, num_columns, begy, begx));
+
+ /*
+ ** make sure window fits inside the original one
+ */
+ if ( begy < 0 || begx < 0)
+ return NULL;
+ if ( begy + num_lines > orig->_maxy + 1
+ || begx + num_columns > orig->_maxx + 1)
+ return NULL;
+
+ if (num_lines == 0)
+ num_lines = orig->_maxy - orig->_begy - begy;
+
+ if (num_columns == 0)
+ num_columns = orig->_maxx - orig->_begx - begx;
+
+ if ((win = makenew(num_lines, num_columns, orig->_begy + begy, orig->_begx + begx)) == NULL)
+ return NULL;
+
+ win->_pary = begy;
+ win->_parx = begx;
+ win->_attrs = orig->_attrs;
+ win->_bkgd = orig->_bkgd;
+
+ for (i = 0; i < num_lines; i++)
+ win->_line[i] = &orig->_line[begy++][begx];
+
+ win->_flags = _SUBWIN;
+ win->_parent = orig;
+
+ T(("derwin: returned window is %x", win));
+
+ return(win);
+}
+
+
+WINDOW *subwin(WINDOW *w, int l, int c, int y, int x)
+{
+ T(("subwin(%x, %d, %d, %d, %d) called", w, l, c, y, x));
+ T(("parent has begy = %d, begx = %d", w->_begy, w->_begx));
+
+ return derwin(w, l, c, y - w->_begy, x - w->_begx);
+}
+
+WINDOW *
+makenew(int num_lines, int num_columns, int begy, int begx)
+{
+int i;
+WINDOW *win;
+
+ T(("makenew(%d,%d,%d,%d)", num_lines, num_columns, begy, begx));
+
+ if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == NULL)
+ return NULL;
+
+ if ((win->_line = (chtype **) calloc(num_lines, sizeof (chtype *))) == NULL) {
+ free(win);
+ return NULL;
+ }
+
+ if ((win->_firstchar = calloc(num_lines, sizeof(short))) == NULL) {
+ free(win);
+ free(win->_line);
+ return NULL;
+ }
+
+ if ((win->_lastchar = calloc(num_lines, sizeof(short))) == NULL) {
+ free(win);
+ free(win->_line);
+ free(win->_firstchar);
+ return NULL;
+ }
+
+ win->_curx = 0;
+ win->_cury = 0;
+ win->_maxy = num_lines - 1;
+ win->_maxx = num_columns - 1;
+ win->_begy = begy;
+ win->_begx = begx;
+
+ win->_flags = 0;
+ win->_attrs = A_NORMAL;
+ win->_bkgd = BLANK;
+
+ win->_clear = (num_lines == lines && num_columns == columns);
+ win->_idlok = FALSE;
+ win->_use_idc = TRUE;
+ win->_scroll = FALSE;
+ win->_leave = FALSE;
+ win->_use_keypad = FALSE;
+#ifdef TERMIOS
+ win->_use_meta = ((cur_term->Ottyb.c_cflag & CSIZE) == CS8 &&
+ !(cur_term->Ottyb.c_iflag & ISTRIP));
+#else
+ win->_use_meta = FALSE;
+#endif
+ win->_delay = -1;
+ win->_immed = FALSE;
+ win->_sync = 0;
+ win->_parx = 0;
+ win->_pary = 0;
+ win->_parent = (WINDOW *)NULL;
+
+ win->_regtop = 0;
+ win->_regbottom = num_lines - 1;
+
+ for (i = 0; i < num_lines; i++)
+ win->_firstchar[i] = win->_lastchar[i] = _NOCHANGE;
+
+ if (begx + num_columns == columns) {
+ win->_flags |= _ENDLINE;
+
+ if (begx == 0 && num_lines == lines && begy == 0)
+ win->_flags |= _FULLWIN;
+
+ if (begy + num_lines == lines)
+ win->_flags |= _SCROLLWIN;
+ }
+
+ return(win);
+}
diff --git a/lib/libncurses/lib_options.c b/lib/libncurses/lib_options.c
new file mode 100644
index 0000000..7aefe96
--- /dev/null
+++ b/lib/libncurses/lib_options.c
@@ -0,0 +1,252 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_options.c
+**
+** The routines to handle option setting.
+**
+*/
+
+#include <stdlib.h>
+#include "terminfo.h"
+#include "curses.priv.h"
+
+int idlok(WINDOW *win, int flag)
+{
+ T(("idlok(%x,%d) called", win, flag));
+
+ if (flag == FALSE) {
+ win->_idlok = FALSE;
+ return OK;
+ }
+
+ if ((insert_line || parm_insert_line) && (delete_line || parm_delete_line)) {
+ win->_idlok = TRUE;
+ }
+ return OK;
+}
+
+
+int clearok(WINDOW *win, int flag)
+{
+ T(("clearok(%x,%d) called", win, flag));
+
+ if (win == curscr)
+ newscr->_clear = flag;
+ else
+ win->_clear = flag;
+ return OK;
+}
+
+
+int leaveok(WINDOW *win, int flag)
+{
+ T(("leaveok(%x,%d) called", win, flag));
+
+ win->_leave = flag;
+ if (flag == TRUE)
+ curs_set(0);
+ else
+ curs_set(1);
+ return OK;
+}
+
+
+int scrollok(WINDOW *win, int flag)
+{
+ T(("scrollok(%x,%d) called", win, flag));
+
+ win->_scroll = flag;
+ return OK;
+}
+
+int halfdelay(int t)
+{
+ T(("halfdelay(%d) called", t));
+
+ if (t < 1 || t > 255)
+ return ERR;
+
+ cbreak();
+ SP->_cbreak = t+1;
+ return OK;
+}
+
+int nodelay(WINDOW *win, int flag)
+{
+ T(("nodelay(%x,%d) called", win, flag));
+
+ if (flag == TRUE)
+ win->_delay = 0;
+ else win->_delay = -1;
+ return OK;
+}
+
+int notimeout(WINDOW *win, bool f)
+{
+ T(("notimout(%x,%d) called", win, f));
+
+ win->_notimeout = f;
+ return OK;
+}
+
+int wtimeout(WINDOW *win, int delay)
+{
+ T(("wtimeout(%x,%d) called", win, delay));
+
+ win->_delay = delay;
+ return OK;
+}
+
+static void init_keytry();
+static void add_to_try(char *, short);
+
+int keypad(WINDOW *win, int flag)
+{
+ T(("keypad(%x,%d) called", win, flag));
+
+ win->_use_keypad = flag;
+
+ if (flag && keypad_xmit)
+ putp(keypad_xmit);
+ else if (! flag && keypad_local)
+ putp(keypad_local);
+
+ if (SP->_keytry == UNINITIALISED)
+ init_keytry();
+ return OK;
+}
+
+
+
+int meta(WINDOW *win, int flag)
+{
+ T(("meta(%x,%d) called", win, flag));
+
+ win->_use_meta = flag;
+
+ if (flag && meta_on)
+ putp(meta_on);
+ else if (! flag && meta_off)
+ putp(meta_off);
+ return OK;
+}
+
+/*
+** init_keytry()
+**
+** Construct the try for the current terminal's keypad keys.
+**
+*/
+
+
+static struct try *newtry;
+
+static void init_keytry()
+{
+ newtry = NULL;
+
+#include "keys.tries"
+
+ SP->_keytry = newtry;
+}
+
+
+static void add_to_try(char *str, short code)
+{
+static bool out_of_memory = FALSE;
+struct try *ptr, *savedptr;
+
+ if (! str || out_of_memory)
+ return;
+
+ if (newtry != NULL) {
+ ptr = savedptr = newtry;
+
+ for (;;) {
+ while (ptr->ch != (unsigned char) *str
+ && ptr->sibling != NULL)
+ ptr = ptr->sibling;
+
+ if (ptr->ch == (unsigned char) *str) {
+ if (*(++str)) {
+ if (ptr->child != NULL)
+ ptr = ptr->child;
+ else
+ break;
+ } else {
+ ptr->value = code;
+ return;
+ }
+ } else {
+ if ((ptr->sibling = (struct try *) malloc(sizeof *ptr)) == NULL) {
+ out_of_memory = TRUE;
+ return;
+ }
+
+ savedptr = ptr = ptr->sibling;
+ ptr->child = ptr->sibling = NULL;
+ ptr->ch = *str++;
+ ptr->value = (short) NULL;
+
+ break;
+ }
+ } /* end for (;;) */
+ } else { /* newtry == NULL :: First sequence to be added */
+ savedptr = ptr = newtry = (struct try *) malloc(sizeof *ptr);
+
+ if (ptr == NULL) {
+ out_of_memory = TRUE;
+ return;
+ }
+
+ ptr->child = ptr->sibling = NULL;
+ ptr->ch = *(str++);
+ ptr->value = (short) NULL;
+ }
+
+ /* at this point, we are adding to the try. ptr->child == NULL */
+
+ while (*str) {
+ ptr->child = (struct try *) malloc(sizeof *ptr);
+
+ ptr = ptr->child;
+
+ if (ptr == NULL) {
+ out_of_memory = TRUE;
+
+ ptr = savedptr;
+ while (ptr != NULL) {
+ savedptr = ptr->child;
+ free(ptr);
+ ptr = savedptr;
+ }
+
+ return;
+ }
+
+ ptr->child = ptr->sibling = NULL;
+ ptr->ch = *(str++);
+ ptr->value = (short) NULL;
+ }
+
+ ptr->value = code;
+ return;
+}
+
+int typeahead(int fd)
+{
+
+ T(("typeahead(%d) called", fd));
+ SP->_checkfd = fd;
+ return OK;
+}
+
+int intrflush(WINDOW *win, bool flag)
+{
+ T(("intrflush(%x, %d) called", win, flag));
+ return OK;
+}
diff --git a/lib/libncurses/lib_overlay.c b/lib/libncurses/lib_overlay.c
new file mode 100644
index 0000000..19e58f3
--- /dev/null
+++ b/lib/libncurses/lib_overlay.c
@@ -0,0 +1,110 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_overlay.c
+**
+** The routines overlay(), copywin(), and overwrite().
+**
+*/
+
+#include "curses.priv.h"
+
+static void overlap(WINDOW *s, WINDOW *d, int 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));
+ 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;
+
+ 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(WINDOW *win1, WINDOW *win2)
+{
+ overlap(win1, win2, TRUE);
+ return OK;
+}
+
+/*
+**
+** overwrite(win1, win2)
+**
+**
+** overwrite() writes the overlapping area of win1 behind win2
+** on win2 destructively.
+**
+**/
+
+int overwrite(WINDOW *win1, WINDOW *win2)
+{
+ overlap(win1, win2, FALSE);
+ return OK;
+}
+
+int copywin(WINDOW *src, WINDOW *dst,
+ int sminrow, int smincol,
+ int dminrow, int dmincol, int dmaxrow, int dmaxcol,
+ int over)
+{
+int sx, sy, dx, dy;
+
+ T(("copywin(%x, %x, %d, %d, %d, %d, %d, %d, %d)",
+ src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over));
+
+ /* make sure rectangle exists in source */
+ if ((sminrow + dmaxrow - dminrow) > (src->_maxy + 1) ||
+ (smincol + dmaxcol - dmincol) > (src->_maxx + 1)) {
+ return ERR;
+ }
+
+ T(("rectangle exists in source"));
+
+ /* make sure rectangle fits in destination */
+ if (dmaxrow > dst->_maxy || dmaxcol > dst->_maxx) {
+ return ERR;
+ }
+
+ T(("rectangle fits in destination"));
+
+ for (dy = dminrow, sy = sminrow; dy <= dmaxrow; sy++, dy++) {
+ dst->_firstchar[dy] = dmincol;
+ dst->_lastchar[dy] = dmincol;
+ for (dx = dmincol, sx = smincol; dx <= dmaxcol; sx++, dx++) {
+ if (over == TRUE ) {
+ if (((src->_line[sy][sx] & A_CHARTEXT) != ' ') && (dst->_line[dy][dx] != src->_line[sy][sx])) {
+ dst->_line[dy][dx] = src->_line[sy][sx];
+ dst->_lastchar[dy] = dx;
+ } else
+ dst->_firstchar[dy]++;
+ } else {
+ if (dst->_line[dy][dx] != src->_line[sy][sx]) {
+ dst->_line[dy][dx] = src->_line[sy][sx];
+ dst->_lastchar[dy] = dx;
+ } else
+ dst->_firstchar[dy]++;
+ }
+ }
+ }
+ T(("finished copywin"));
+ return OK;
+}
diff --git a/lib/libncurses/lib_pad.c b/lib/libncurses/lib_pad.c
new file mode 100644
index 0000000..5b4aa99
--- /dev/null
+++ b/lib/libncurses/lib_pad.c
@@ -0,0 +1,143 @@
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+ * lib_pad.c
+ * newpad -- create a new pad
+ * pnoutrefresh -- refresh a pad, no update
+ * pechochar -- add a char to a pad and refresh
+ */
+
+#include <stdlib.h>
+#include "curses.priv.h"
+
+WINDOW *newpad(int l, int c)
+{
+WINDOW *win;
+chtype *ptr;
+int i, j;
+
+ T(("newpad(%d, %d) called", l, c));
+
+ if (l <= 0 || c <= 0)
+ return NULL;
+
+ if ((win = makenew(l,c,0,0)) == NULL)
+ return NULL;
+
+ win->_flags |= _ISPAD;
+
+ for (i = 0; i < l; i++) {
+ if ((win->_line[i] = (chtype *) calloc(c, sizeof(chtype))) == NULL) {
+ for (j = 0; j < i; j++)
+ free(win->_line[j]);
+
+ free(win->_firstchar);
+ free(win->_lastchar);
+ free(win->_line);
+ free(win);
+
+ return NULL;
+ }
+ else
+ for (ptr = win->_line[i]; ptr < win->_line[i] + c; )
+ *ptr++ = ' ';
+ }
+
+ T(("newpad: returned window is %x", win));
+
+ return(win);
+}
+
+int prefresh(WINDOW *win, int pminrow, int pmincol,
+ int sminrow, int smincol, int smaxrow, int smaxcol)
+{
+ T(("prefresh() called"));
+ if (pnoutrefresh(win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol) != ERR)
+ return (doupdate());
+ else
+ return ERR;
+
+}
+
+int pnoutrefresh(WINDOW *win, int pminrow, int pmincol,
+ int sminrow, int smincol, int smaxrow, int smaxcol)
+{
+int i, j;
+int m, n;
+
+ T(("pnoutrefresh(%x, %d, %d, %d, %d, %d, %d) called",
+ win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol));
+
+ if (!(win->_flags & _ISPAD))
+ return ERR;
+
+ T(("one"));
+ if (pminrow < 0) pminrow = 0;
+ if (pmincol < 0) pmincol = 0;
+ if (sminrow < 0) sminrow = 0;
+ if (smincol < 0) smincol = 0;
+
+ T(("two"));
+ if (smaxrow >= LINES || smaxcol >= COLS)
+ return ERR;
+
+ T(("three"));
+ if ((pminrow + smaxrow - sminrow > win->_maxy) ||
+ (pmincol + smaxcol - smincol > win->_maxx))
+ return ERR;
+
+ T(("pad being refreshed"));
+
+ for (i = pminrow, m = sminrow; i <= pminrow + smaxrow-sminrow;
+ i++, m++) {
+ for (j = pmincol, n = smincol; j <= pmincol + smaxcol-smincol;
+ j++, n++) {
+ if (win->_line[i][j] != newscr->_line[m][n]) {
+ newscr->_line[m][n] = win->_line[i][j];
+
+ if (newscr->_firstchar[m] == _NOCHANGE)
+ newscr->_firstchar[m] = newscr->_lastchar[m] = n;
+ else if (n < newscr->_firstchar[m])
+ newscr->_firstchar[m] = n;
+ else if (n > newscr->_lastchar[m])
+ newscr->_lastchar[m] = n;
+ }
+ }
+ }
+
+ win->_firstchar[i] = win->_lastchar[i] = _NOCHANGE;
+
+ win->_begx = smincol;
+ win->_begy = sminrow;
+
+ if (win->_clear) {
+ win->_clear = FALSE;
+ newscr->_clear = TRUE;
+ }
+
+ if (! win->_leave) {
+ newscr->_cury = win->_cury + win->_begy;
+ newscr->_curx = win->_curx + win->_begx;
+ }
+ return OK;
+}
+
+int pechochar(WINDOW *pad, chtype ch)
+{
+int x, y;
+
+ T(("echochar(%x, %x)", pad, ch));
+
+ if (pad->_flags & _ISPAD)
+ return ERR;
+
+ x = pad->_begx + pad->_curx;
+ y = pad->_begy + pad->_cury;
+
+ waddch(curscr, ch);
+ doupdate();
+ return OK;
+}
+
diff --git a/lib/libncurses/lib_printw.c b/lib/libncurses/lib_printw.c
new file mode 100644
index 0000000..236c29a
--- /dev/null
+++ b/lib/libncurses/lib_printw.c
@@ -0,0 +1,75 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_printw.c
+**
+** The routines printw(), wprintw() and friends.
+**
+*/
+
+#include "curses.priv.h"
+
+int printw(char *fmt, ...)
+{
+va_list argp;
+char buf[BUFSIZ];
+
+ T(("printw(\"%s\",...) called", fmt));
+
+ va_start(argp, fmt);
+ vsprintf(buf, fmt, argp);
+ va_end(argp);
+ return(waddstr(stdscr, buf));
+}
+
+
+
+int wprintw(WINDOW *win, char *fmt, ...)
+{
+va_list argp;
+char buf[BUFSIZ];
+
+ T(("wprintw(%x,\"%s\",...) called", win, fmt));
+
+ va_start(argp, fmt);
+ vsprintf(buf, fmt, argp);
+ va_end(argp);
+ return(waddstr(win, buf));
+}
+
+
+
+int mvprintw(int y, int x, char *fmt, ...)
+{
+va_list argp;
+char buf[BUFSIZ];
+
+ va_start(argp, fmt);
+ vsprintf(buf, fmt, argp);
+ va_end(argp);
+ return(move(y, x) == OK ? waddstr(stdscr, buf) : ERR);
+}
+
+
+
+int mvwprintw(WINDOW *win, int y, int x, char *fmt, ...)
+{
+va_list argp;
+char buf[BUFSIZ];
+
+ va_start(argp, fmt);
+ vsprintf(buf, fmt, argp);
+ va_end(argp);
+ return(wmove(win, y, x) == OK ? waddstr(win, buf) : ERR);
+}
+
+int vwprintw(WINDOW *win, char *fmt, va_list argp)
+{
+char buf[BUFSIZ];
+
+ vsprintf(buf, fmt, argp);
+ return(waddstr(win, buf));
+}
diff --git a/lib/libncurses/lib_raw.c b/lib/libncurses/lib_raw.c
new file mode 100644
index 0000000..fac726e
--- /dev/null
+++ b/lib/libncurses/lib_raw.c
@@ -0,0 +1,201 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+ * raw.c
+ *
+ * Routines:
+ * raw()
+ * echo()
+ * nl()
+ * cbreak()
+ * noraw()
+ * noecho()
+ * nonl()
+ * nocbreak()
+ *
+ */
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+#ifdef TERMIOS
+static tcflag_t iexten = 0;
+#endif
+
+int raw()
+{
+ T(("raw() called"));
+
+ SP->_raw = TRUE;
+ SP->_cbreak = TRUE;
+ SP->_nlmapping = TRUE;
+
+#ifdef TERMIOS
+ if(iexten == 0)
+ iexten = cur_term->Nttyb.c_lflag & IEXTEN;
+ cur_term->Nttyb.c_lflag &= ~(ICANON|ISIG|iexten);
+ cur_term->Nttyb.c_iflag &= ~(INPCK|ISTRIP|IXON);
+ cur_term->Nttyb.c_oflag &= ~(OPOST);
+ cur_term->Nttyb.c_cc[VMIN] = 1;
+ cur_term->Nttyb.c_cc[VTIME] = 0;
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags |= RAW;
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+}
+
+int cbreak()
+{
+ T(("cbreak() called"));
+
+ SP->_cbreak = 1;
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_lflag &= ~ICANON;
+ cur_term->Nttyb.c_lflag |= ISIG;
+ cur_term->Nttyb.c_cc[VMIN] = 1;
+ cur_term->Nttyb.c_cc[VTIME] = 0;
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags |= CBREAK;
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+}
+
+int echo()
+{
+ T(("echo() called"));
+
+ SP->_echo = TRUE;
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_lflag |= ECHO;
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags |= ECHO;
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+}
+
+
+int nl()
+{
+ T(("nl() called"));
+
+ SP->_nl = TRUE;
+ SP->_nlmapping = ! SP->_raw;
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_iflag |= IXON|ICRNL|IXOFF;
+ cur_term->Nttyb.c_oflag |= OPOST|ONLCR;
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags |= CRMOD;
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+}
+
+
+int noraw()
+{
+ T(("noraw() called"));
+
+ SP->_raw = FALSE;
+ SP->_cbreak = FALSE;
+ SP->_nlmapping = SP->_nl;
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_lflag |= ISIG|ICANON|iexten;
+ cur_term->Nttyb.c_iflag |= IXON;
+ cur_term->Nttyb.c_oflag |= OPOST;
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags &= ~(RAW|CBREAK);
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+
+}
+
+
+int nocbreak()
+{
+ T(("nocbreak() called"));
+
+ SP->_cbreak = 0;
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_lflag |= ICANON;
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags &= ~CBREAK;
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+}
+
+int noecho()
+{
+ T(("noecho() called"));
+
+ SP->_echo = FALSE;
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_lflag &= ~(ECHO);
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags &= ~ECHO;
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+}
+
+
+int nonl()
+{
+ T(("nonl() called"));
+
+ SP->_nl = SP->_nlmapping = FALSE;
+
+#ifdef TERMIOS
+ cur_term->Nttyb.c_iflag &= ~ICRNL;
+ cur_term->Nttyb.c_oflag &= ~ONLCR;
+ if((tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb)) == -1)
+ return ERR;
+ else
+ return OK;
+#else
+ cur_term->Nttyb.sg_flags &= ~CRMOD;
+ stty(cur_term->Filedes, &cur_term->Nttyb);
+ return OK;
+#endif
+}
diff --git a/lib/libncurses/lib_refresh.c b/lib/libncurses/lib_refresh.c
new file mode 100644
index 0000000..9948025
--- /dev/null
+++ b/lib/libncurses/lib_refresh.c
@@ -0,0 +1,91 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+ * lib_refresh.c
+ *
+ * The routines wredrawln(), wrefresh() and wnoutrefresh().
+ *
+ */
+
+#include "curses.priv.h"
+
+int wredrawln(WINDOW *win, int beg, int num)
+{
+ T(("wredrawln(%x,%d,%d) called", win, beg, num));
+ touchline(win, beg, num);
+ wrefresh(win);
+ return OK;
+}
+
+int wrefresh(WINDOW *win)
+{
+ T(("wrefresh(%x) called", win));
+
+ if (win == curscr)
+ curscr->_clear = TRUE;
+ else
+ wnoutrefresh(win);
+ return(doupdate());
+}
+
+int wnoutrefresh(WINDOW *win)
+{
+int i, j;
+int begx = win->_begx;
+int begy = win->_begy;
+int m, n;
+
+ T(("wnoutrefresh(%x) called", win));
+
+ /*
+ * This function will break badly if we try to refresh a pad.
+ */
+ if ((win == 0)
+ || (win->_flags & _ISPAD))
+ return(ERR);
+
+ /*
+ * If 'newscr' has a different background than the window that we're
+ * trying to refresh, we'll have to copy the whole thing.
+ */
+ if (win->_bkgd != newscr->_bkgd) {
+ touchwin(win);
+ newscr->_bkgd = win->_bkgd;
+ }
+ newscr->_attrs = win->_attrs;
+
+ win->_flags &= ~_HASMOVED;
+ for (i = 0, m = begy; i <= win->_maxy; i++, m++) {
+ if (win->_firstchar[i] != _NOCHANGE) {
+ j = win->_firstchar[i];
+ n = j + begx;
+ for (; j <= win->_lastchar[i]; j++, n++) {
+ if (win->_line[i][j] != newscr->_line[m][n]) {
+ newscr->_line[m][n] = win->_line[i][j];
+
+ if (newscr->_firstchar[m] == _NOCHANGE)
+ newscr->_firstchar[m] = newscr->_lastchar[m] = n;
+ else if (n < newscr->_firstchar[m])
+ newscr->_firstchar[m] = n;
+ else if (n > newscr->_lastchar[m])
+ newscr->_lastchar[m] = n;
+ }
+ }
+ }
+ win->_firstchar[i] = win->_lastchar[i] = _NOCHANGE;
+ }
+
+ if (win->_clear) {
+ win->_clear = FALSE;
+ newscr->_clear = TRUE;
+ }
+
+ if (! win->_leave) {
+ newscr->_cury = win->_cury + win->_begy;
+ newscr->_curx = win->_curx + win->_begx;
+ }
+ return(OK);
+}
diff --git a/lib/libncurses/lib_scanw.c b/lib/libncurses/lib_scanw.c
new file mode 100644
index 0000000..69b5a33
--- /dev/null
+++ b/lib/libncurses/lib_scanw.c
@@ -0,0 +1,66 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_scanw.c
+**
+** The routines scanw(), wscanw() and friends.
+**
+*/
+
+#include <stdio.h>
+#include "curses.priv.h"
+
+int vwscanw(WINDOW *win, char *fmt, va_list argp)
+{
+char buf[BUFSIZ];
+
+ if (wgetstr(win, buf) == ERR)
+ return(ERR);
+
+ return(vsscanf(buf, fmt, argp));
+}
+
+int scanw(char *fmt, ...)
+{
+va_list ap;
+
+ T(("scanw(\"%s\",...) called", fmt));
+
+ va_start(ap, fmt);
+ return(vwscanw(stdscr, fmt, ap));
+}
+
+int wscanw(WINDOW *win, char *fmt, ...)
+{
+va_list ap;
+
+ T(("wscanw(%x,\"%s\",...) called", win, fmt));
+
+ va_start(ap, fmt);
+ return(vwscanw(win, fmt, ap));
+}
+
+
+
+int mvscanw(int y, int x, char *fmt, ...)
+{
+va_list ap;
+
+ va_start(ap, fmt);
+ return(move(y, x) == OK ? vwscanw(stdscr, fmt, ap) : ERR);
+}
+
+
+
+int mvwscanw(WINDOW *win, int y, int x, char *fmt, ...)
+{
+va_list ap;
+
+ va_start(ap, fmt);
+ return(wmove(win, y, x) == OK ? vwscanw(win, fmt, ap) : ERR);
+}
+
+
diff --git a/lib/libncurses/lib_screen.c b/lib/libncurses/lib_screen.c
new file mode 100644
index 0000000..382411b
--- /dev/null
+++ b/lib/libncurses/lib_screen.c
@@ -0,0 +1,58 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+#included "curses.priv.h"
+
+int putwin(WINDOW *win, char *file)
+{
+int fd, i;
+
+ fd = open(file, O_WRONLY);
+ if (fd < -1)
+ return ERR;
+ for (i = 0; i < lines; i++)
+ write(fd, win->_line[i], sizeof(chtype)*columns);
+ close(fd);
+ return OK;
+}
+
+int scr_restore(char *file)
+{
+int fd, i;
+
+ fd = open(file, O_RDONLY);
+ if (fd < -1)
+ return ERR;
+ for (i = 0; i < lines; i++)
+ read(fd, curscr->_line[i], sizeof(chtype)*columns);
+ touchwin(curscr);
+ close(fd);
+ return OK;
+}
+
+int scr_dump(char *file)
+{
+
+ putwin(curscr, file);
+}
+
+int scr_init(char *file)
+{
+
+ return ERR;
+}
+
+int scr_set(char *file)
+{
+
+ return ERR;
+}
+
+WINDOW *getwin(FILE *filep)
+{
+
+ return NULL;
+}
+
diff --git a/lib/libncurses/lib_scroll.c b/lib/libncurses/lib_scroll.c
new file mode 100644
index 0000000..03e7136
--- /dev/null
+++ b/lib/libncurses/lib_scroll.c
@@ -0,0 +1,201 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** 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 <stdlib.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+
+void scroll_window(WINDOW *win, int n, int regtop, int regbottom)
+{
+int line, i;
+chtype *ptr, *temp;
+chtype **saved;
+chtype blank = _nc_background(win);
+
+ saved = (chtype **)malloc(sizeof(chtype *) * abs(n));
+
+ if (n < 0) {
+ /* save overwritten lines */
+
+ for (i = 0; i < -n; i++)
+ saved[i] = win->_line[regbottom-i];
+
+ /* shift n lines */
+
+ for (line = regbottom; line >= regtop-n; line--)
+ win->_line[line] = win->_line[line+n];
+
+ /* restore saved lines and blank them */
+
+ for (i = 0, line = regtop; line < regtop-n; line++, i++) {
+ win->_line[line] = saved[i];
+ temp = win->_line[line];
+ for (ptr = temp; ptr - temp <= win->_maxx; ptr++)
+ *ptr = blank;
+ }
+ } else {
+ /* save overwritten lines */
+
+ for (i = 0; i < n; i++)
+ saved[i] = win->_line[regtop+i];
+
+ /* shift n lines */
+
+ for (line = regtop; line <= regbottom-n; line++)
+ win->_line[line] = win->_line[line+n];
+
+ /* restore saved lines and blank them */
+
+ for (i = 0, line = regbottom; line > regbottom - n; line--, i++) {
+ win->_line[line] = saved[i];
+ temp = win->_line[line];
+ for (ptr = temp; ptr - temp <= win->_maxx; ptr++)
+ *ptr = blank;
+ }
+ }
+
+ free(saved);
+}
+
+int
+wscrl(WINDOW *win, int n)
+{
+int physical = FALSE;
+int i;
+
+ T(("wscrl(%x,%d) called", win, n));
+
+ if (! win->_scroll)
+ return ERR;
+
+ if (n == 0)
+ return OK;
+
+ /* as an optimization, if the scrolling region is the entire screen
+ scroll the physical screen */
+
+ if ( win->_begx == 0 && win->_maxx == columns - 1
+ && !memory_above && !memory_below
+ && ((((win->_begy+win->_regtop == 0 && win->_begy+win->_regbottom == lines - 1)
+ || change_scroll_region)
+ && ( (n < 0 && (parm_rindex || scroll_reverse))
+ || (n > 0 && (parm_index || scroll_forward))
+ )
+ ) || (win->_idlok && (parm_insert_line || insert_line)
+ && (parm_delete_line || delete_line)
+ )
+ )
+ )
+ physical = TRUE;
+
+ if (physical == TRUE) {
+ wrefresh(win);
+ scroll_window(curscr, n, win->_begy+win->_regtop, win->_begy+win->_regbottom);
+ scroll_window(newscr, n, win->_begy+win->_regtop, win->_begy+win->_regbottom);
+ }
+ scroll_window(win, n, win->_regtop, win->_regbottom);
+
+ if (physical == TRUE) {
+ if (n < 0) {
+ if ( (( win->_begy+win->_regtop == 0
+ && win->_begy+win->_regbottom == lines - 1)
+ || change_scroll_region)
+ && (parm_rindex || scroll_reverse)
+ ) {
+ if (change_scroll_region &&
+ (win->_begy+win->_regtop != 0 || win->_begy+win->_regbottom != lines - 1)
+ )
+ putp(tparm(change_scroll_region, win->_begy+win->_regtop, win->_begy+win->_regbottom));
+ i = abs(n);
+ mvcur(-1, -1, win->_begy+win->_regtop, 0);
+ if (parm_rindex) {
+ putp(tparm(parm_rindex, i));
+ } else if (scroll_reverse) {
+ while (i--)
+ putp(scroll_reverse);
+ }
+ if (change_scroll_region &&
+ (win->_begy+win->_regtop != 0 || win->_begy+win->_regbottom != lines - 1)
+ )
+ putp(tparm(change_scroll_region, 0, lines-1));
+ } else {
+ i = abs(n);
+ if (win->_begy+win->_regbottom < lines - 1) {
+ mvcur(-1, -1, win->_begy+win->_regbottom, 0);
+ if (parm_delete_line) {
+ putp(tparm(parm_delete_line, i));
+ } else if (delete_line) {
+ while (i--)
+ putp(delete_line);
+ i = abs(n);
+ }
+ }
+ mvcur(-1, -1, win->_begy+win->_regtop, 0);
+ if (parm_insert_line) {
+ putp(tparm(parm_insert_line, i));
+ } else if (insert_line) {
+ while (i--)
+ putp(insert_line);
+ }
+ }
+ } else {
+ if ( (( win->_begy+win->_regtop == 0
+ && win->_begy+win->_regbottom == lines - 1)
+ || change_scroll_region)
+ && (parm_index || scroll_forward)
+ ) {
+ if (change_scroll_region &&
+ (win->_begy+win->_regtop != 0 || win->_begy+win->_regbottom != lines - 1)
+ )
+ putp(tparm(change_scroll_region, win->_begy+win->_regtop, win->_begy+win->_regbottom));
+ mvcur(-1, -1, win->_begy+win->_regbottom, 0);
+ if (parm_index) {
+ putp(tparm(parm_index, n));
+ } else if (scroll_forward) {
+ i = n;
+ while (i--)
+ putp(scroll_forward);
+ }
+ if (change_scroll_region &&
+ (win->_begy+win->_regtop != 0 || win->_begy+win->_regbottom != lines - 1)
+ )
+ putp(tparm(change_scroll_region, 0, lines-1));
+ } else {
+ mvcur(-1, -1, win->_begy+win->_regtop, 0);
+ if (parm_delete_line) {
+ putp(tparm(parm_delete_line, n));
+ } else if (delete_line) {
+ i = n;
+ while (i--)
+ putp(delete_line);
+ }
+ if (win->_begy+win->_regbottom < lines - 1) {
+ mvcur(win->_begy+win->_regtop, 0, win->_begy+win->_regbottom, 0);
+ if (parm_insert_line) {
+ putp(tparm(parm_insert_line, n));
+ } else if (insert_line) {
+ i = n;
+ while (i--)
+ putp(insert_line);
+ }
+ }
+ }
+ }
+
+ mvcur(-1, -1, win->_begy+win->_cury, win->_begx+win->_curx);
+ } else
+ touchline(win, win->_regtop, win->_regbottom - win->_regtop + 1);
+
+ return OK;
+}
diff --git a/lib/libncurses/lib_scrreg.c b/lib/libncurses/lib_scrreg.c
new file mode 100644
index 0000000..31bab4f
--- /dev/null
+++ b/lib/libncurses/lib_scrreg.c
@@ -0,0 +1,32 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_scrreg.c
+**
+** The routine wsetscrreg().
+**
+*/
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+int wsetscrreg(WINDOW *win, int top, int bottom)
+{
+ T(("wsetscrreg(%x,%d,%d) called", win, top, bottom));
+
+ if (top >= 0 && top <= win->_maxy &&
+ bottom >= 0 && bottom <= win->_maxy &&
+ bottom > top)
+ {
+ win->_regtop = top;
+ win->_regbottom = bottom;
+
+ T(("correctly set scrolling region between %d and %d", top, bottom));
+
+ return(OK);
+ } else
+ return(ERR);
+}
diff --git a/lib/libncurses/lib_set_term.c b/lib/libncurses/lib_set_term.c
new file mode 100644
index 0000000..bc73ca3
--- /dev/null
+++ b/lib/libncurses/lib_set_term.c
@@ -0,0 +1,33 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_set_term.c
+**
+** The routine set_term().
+**
+*/
+
+#include "curses.priv.h"
+#include "terminfo.h"
+
+struct screen *
+set_term(screen)
+struct screen *screen;
+{
+struct screen *oldSP;
+
+ T(("set_term(%o) called", screen));
+
+ oldSP = SP;
+ SP = screen;
+
+ cur_term = SP->_term;
+ curscr = SP->_curscr;
+ newscr = SP->_newscr;
+ stdscr = SP->_stdscr;
+
+ return(oldSP);
+}
diff --git a/lib/libncurses/lib_slk.c b/lib/libncurses/lib_slk.c
new file mode 100644
index 0000000..8be6ac0
--- /dev/null
+++ b/lib/libncurses/lib_slk.c
@@ -0,0 +1,255 @@
+
+/*
+ * lib_slk.c
+ * Soft key routines.
+ *
+ * Copyright (C) Gerhard Fuernkranz 1993
+ * Permisson is granted to redistribute this
+ * code under the terms of the GNU Copyleft.
+ */
+
+#include "terminfo.h"
+#include "curses.priv.h"
+#include <string.h>
+#include <stdlib.h>
+
+int _slk_format; /* format specified in slk_init() */
+
+#define MAXCOLUMNS 135
+#define MAXLINES 66
+#define UNINITIALISED ((struct try * ) -1)
+/*
+ * Retrieve label text.
+ */
+
+char *
+slk_label(int n)
+{
+SLK *slk = SP->_slk;
+
+ T(("slk_label(%d)", n));
+
+ if (slk == NULL || n < 1 || n > 8)
+ return NULL;
+ return slk->ent[n-1].text;
+}
+
+/*
+ * Write the soft lables to the slk window.
+ */
+
+static void
+slk_intern_refresh(SLK *slk)
+{
+int i;
+ T(("slk_intern_refresh(%x)", slk));
+
+ for (i = 0; i < 8; i++) {
+ if (slk->dirty || slk->ent[i].dirty) {
+ if (slk->ent[i].visible) {
+ wmove(slk->win,0,slk->ent[i].x);
+ wattrset(slk->win,A_REVERSE);
+ waddstr(slk->win,slk->ent[i].form_text);
+ wattrset(slk->win,A_NORMAL);
+ }
+ slk->ent[i].dirty = FALSE;
+ }
+ }
+ slk->dirty = FALSE;
+}
+
+/*
+ * Refresh the soft label window.
+ */
+
+int
+slk_noutrefresh(void)
+{
+SLK *slk = SP->_slk;
+
+ T(("slk_noutrefresh()"));
+
+ if (slk == NULL)
+ return ERR;
+ if (slk->hidden)
+ return OK;
+ slk_intern_refresh(slk);
+ return wnoutrefresh(slk->win);
+}
+
+/*
+ * Refresh the soft label window.
+ */
+
+int
+slk_refresh(void)
+{
+SLK *slk = SP->_slk;
+
+ T(("slk_refresh()"));
+
+ if (slk == NULL)
+ return ERR;
+ if (slk->hidden)
+ return OK;
+ slk_intern_refresh(slk);
+ return wrefresh(slk->win);
+}
+
+/*
+ * Restore the soft labels on the screen.
+ */
+
+int
+slk_restore(void)
+{
+SLK *slk = SP->_slk;
+
+ T(("slk_restore()"));
+
+ if (slk == NULL)
+ return ERR;
+ slk->hidden = FALSE;
+ slk->dirty = TRUE;
+ return slk_refresh();
+}
+
+/*
+ * Set soft label text.
+ */
+
+int
+slk_set(int i, char *str, int format)
+{
+SLK *slk = SP->_slk;
+int len;
+ T(("slk_set(%d, \"%s\", %d)", i, str, format));
+
+ if (slk == NULL || i < 1 || i > 8 || format < 0 || format > 2)
+ return ERR;
+ if (str == NULL)
+ str = "";
+ i--;
+ strncpy(slk->ent[i].text,str,8);
+ memset(slk->ent[i].form_text,' ',8);
+ slk->ent[i].text[8] = 0;
+ slk->ent[i].form_text[8] = 0;
+ len = strlen(slk->ent[i].text);
+ switch(format) {
+ case 0: /* left */
+ memcpy(slk->ent[i].form_text,slk->ent[i].text,len);
+ break;
+ case 1: /* center */
+ memcpy(slk->ent[i].form_text+(8-len)/2,slk->ent[i].text,len);
+ break;
+ case 2: /* right */
+ memcpy(slk->ent[i].form_text+8-len,slk->ent[i].text,len);
+ break;
+ }
+ slk->ent[i].dirty = TRUE;
+ return OK;
+}
+
+/*
+ * Pretend, that soft keys have been changed.
+ */
+
+int
+slk_touch(void)
+{
+SLK *slk = SP->_slk;
+ T(("slk_touch()"));
+
+ if (slk == NULL)
+ return ERR;
+ slk->dirty = TRUE;
+ return OK;
+}
+
+/*
+ * Remove soft labels from the screen.
+ */
+
+int
+slk_clear(void)
+{
+SLK *slk = SP->_slk;
+
+ T(("slk_clear()"));
+
+ if (slk == NULL)
+ return ERR;
+ slk->hidden = TRUE;
+ /* For simulated SLK's it's looks much more natural to
+ inherit those attributes from the standard screen */
+ slk->win->_bkgd = stdscr->_bkgd;
+ slk->win->_attrs = stdscr->_attrs;
+ werase(slk->win);
+ return wrefresh(slk->win);
+}
+
+/*
+ * Initialize soft labels.
+ * Called from newterm()
+ */
+
+static int
+slk_initialize(WINDOW *stwin, int cols)
+{
+SLK *slk;
+int i, maxlab, x;
+
+ T(("slk_initialize()"));
+
+ if ((SP->_slk = slk = (SLK*) calloc(1,sizeof(SLK))) == NULL)
+ return OK;
+ maxlab = (cols+1)/9;
+ for (i = 0; i < 8; i++) {
+ memset(slk->ent[i].form_text,' ',8);
+ slk->ent[i].visible = i < maxlab;
+ }
+ if (_slk_format == 1) { /* 4-4 */
+ int gap = cols - 64 - 6;
+ if (gap < 1)
+ gap = 1;
+ for (i = x = 0; i < 8; i++) {
+ slk->ent[i].x = x;
+ x += 8;
+ x += (i == 3) ? gap : 1;
+ }
+ }
+ else { /* 0 -> 3-2-3 */
+ int gap = (cols - 64 - 5) / 2;
+ if (gap < 1)
+ gap = 1;
+ for (i = x = 0; i < 8; i++) {
+ slk->ent[i].x = x;
+ x += 8;
+ x += (i == 2 || i == 4) ? gap : 1;
+ }
+ }
+ slk->dirty = TRUE;
+ if ((slk->win = stwin) == NULL)
+ {
+ free(slk);
+ return ERR;
+ }
+
+ return OK;
+}
+
+/*
+ * Initialize soft labels.
+ * Called by the user.
+ */
+
+int
+slk_init(int format)
+{
+ if (format < 0 || format > 1)
+ return ERR;
+ _slk_format = format;
+ ripoffline(-1, slk_initialize);
+ return OK;
+}
+
diff --git a/lib/libncurses/lib_touch.c b/lib/libncurses/lib_touch.c
new file mode 100644
index 0000000..4d291b3
--- /dev/null
+++ b/lib/libncurses/lib_touch.c
@@ -0,0 +1,48 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_touch.c
+**
+** The routines untouchwin(),
+** wtouchln(),
+** is_linetouched()
+** is_wintouched().
+**
+*/
+
+#include "curses.priv.h"
+
+int is_linetouched(WINDOW *win, int line)
+{
+ if (line > win->_maxy || line < 0)
+ return ERR;
+ if (win->_firstchar[line] != _NOCHANGE) return TRUE;
+ return FALSE;
+}
+
+int is_wintouched(WINDOW *win)
+{
+int i;
+
+ for (i = 0; i <= win->_maxy; i++)
+ if (win->_firstchar[i] != _NOCHANGE)
+ return TRUE;
+ return FALSE;
+}
+
+int wtouchln(WINDOW *win, int y, int n, int changed)
+{
+int i;
+
+ T(("wtouchln(%x,%d,%d,%d)", win, y, n, changed));
+
+ for (i = y; i < y+n; i++) {
+ win->_firstchar[i] = changed ? 0 : _NOCHANGE;
+ win->_lastchar[i] = changed ? win->_maxx : _NOCHANGE;
+ }
+ return OK;
+}
+
diff --git a/lib/libncurses/lib_trace.c b/lib/libncurses/lib_trace.c
new file mode 100644
index 0000000..3a66467
--- /dev/null
+++ b/lib/libncurses/lib_trace.c
@@ -0,0 +1,179 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+ * lib_trace.c - Tracing/Debugging routines
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+
+#if defined(BRAINDEAD)
+extern int errno;
+#endif
+
+int _tracing = 0;
+
+static int tracefd;
+
+void _tracef(char *fmt, ...);
+
+void _init_trace()
+{
+static int been_here = 0;
+
+ if (! been_here) {
+ been_here = 1;
+
+ if ((tracefd = creat("trace", 0644)) < 0) {
+ write(2, "curses: Can't open 'trace' file: ", 33);
+ write(2, strerror(errno), strlen(strerror(errno)));
+ write(2, "\n", 1);
+ exit(1);
+ }
+ _tracef("TRACING NCURSES version %s", NCURSES_VERSION);
+ }
+}
+
+
+void trace(const unsigned int tracelevel)
+{
+ _tracing = tracelevel;
+}
+
+
+char *_traceattr(int newmode)
+{
+static char buf[BUFSIZ];
+struct {unsigned int val; 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, ",},
+ },
+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",},
+ },
+ *sp;
+
+ strcpy(buf, "{");
+ for (sp = names; sp->val; sp++)
+ if (newmode & sp->val)
+ strcat(buf, sp->name);
+ if (newmode & A_COLOR)
+ {
+ int pairnum = PAIR_NUMBER(newmode);
+
+ (void) sprintf(buf + strlen(buf),
+ "COLOR_PAIR(%d) = (%s, %s), ",
+ pairnum,
+ colors[FG(color_pairs[pairnum])].name,
+ colors[BG(color_pairs[pairnum])].name
+ );
+ }
+ if ((newmode & A_ATTRIBUTES) == 0)
+ strcat(buf,"A_NORMAL, ");
+ if (buf[strlen(buf) - 2] == ',')
+ buf[strlen(buf) - 2] = '\0';
+ return(strcat(buf,"}"));
+}
+
+char *visbuf(const char *buf)
+/* visibilize a given string */
+{
+ static char vbuf[BUFSIZ];
+ char *tp = vbuf;
+
+ while (*buf)
+ {
+ if (isprint(*buf) || *buf == ' ')
+ *tp++ = *buf++;
+ else if (*buf == '\n')
+ {
+ *tp++ = '\\'; *tp++ = 'n';
+ buf++;
+ }
+ else if (*buf == '\r')
+ {
+ *tp++ = '\\'; *tp++ = 'r';
+ buf++;
+ }
+ else if (*buf == '\b')
+ {
+ *tp++ = '\\'; *tp++ = 'b';
+ buf++;
+ }
+ else if (*buf == '\033')
+ {
+ *tp++ = '\\'; *tp++ = 'e';
+ buf++;
+ }
+ else if (*buf < ' ')
+ {
+ *tp++ = '\\'; *tp++ = '^'; *tp++ = '@' + *buf;
+ buf++;
+ }
+ else
+ {
+ (void) sprintf(tp, "\\0x%02x", *buf++);
+ tp += strlen(tp);
+ }
+ }
+ *tp++ = '\0';
+ return(vbuf);
+}
+
+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", ch);
+ }
+ else
+ (void) sprintf(crep, "0x%02x", ch);
+ return(crep);
+}
+
+void
+_tracef(char *fmt, ...)
+{
+va_list ap;
+char buffer[256];
+
+ va_start(ap, fmt);
+ vsprintf(buffer, fmt, ap);
+ write(tracefd, buffer, strlen(buffer));
+ write(tracefd, "\n", 1);
+}
+
diff --git a/lib/libncurses/lib_tstp.c b/lib/libncurses/lib_tstp.c
new file mode 100644
index 0000000..cb96ff0
--- /dev/null
+++ b/lib/libncurses/lib_tstp.c
@@ -0,0 +1,78 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_tstp.c
+**
+** The routine tstp().
+**
+*/
+
+#include "curses.priv.h"
+#include "terminfo.h"
+#ifdef SVR4_ACTION
+#define _POSIX_SOURCE
+#endif
+#include <signal.h>
+
+void tstp(int dummy)
+{
+sigaction_t act, oact;
+sigset_t mask, omask;
+
+ T(("tstp() called"));
+
+ /*
+ * The user may have changed the prog_mode tty bits, so save them.
+ */
+ 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);
+#ifdef SIGWINCH
+ (void)sigaddset(&mask, SIGWINCH);
+#endif
+ (void)sigprocmask(SIG_BLOCK, &mask, &omask);
+
+ endwin();
+
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGTSTP);
+ sigprocmask(SIG_UNBLOCK, &mask, NULL);
+
+ act.sa_handler = SIG_DFL;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+#ifdef SA_RESTART
+ act.sa_flags |= SA_RESTART;
+#endif
+ sigaction(SIGTSTP, &act, &oact);
+ kill(getpid(), SIGTSTP);
+
+ 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);
+}
+
diff --git a/lib/libncurses/lib_twait.c b/lib/libncurses/lib_twait.c
new file mode 100644
index 0000000..1b0fd1e
--- /dev/null
+++ b/lib/libncurses/lib_twait.c
@@ -0,0 +1,75 @@
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_twait.c
+**
+** The routine timed_wait().
+**
+*/
+
+#include <string.h>
+#include <sys/types.h> /* some systems can't live without this */
+#include <sys/time.h>
+#include <unistd.h>
+#if defined(SYS_SELECT)
+#include <sys/select.h>
+#endif
+#include "curses.priv.h"
+
+#if defined(NOUSLEEP)
+void usleep(unsigned int usec)
+{
+struct timeval tval;
+
+ tval.tv_sec = usec / 1000000;
+ tval.tv_usec = usec % 1000000;
+ select(0, NULL, NULL, NULL, &tval);
+
+}
+#endif
+
+int timed_wait(int fd, int wait, int *timeleft)
+{
+int result;
+struct timeval timeout;
+static fd_set set;
+#ifndef GOOD_SELECT
+struct timeval starttime, returntime;
+
+ gettimeofday(&starttime, NULL);
+#endif
+
+ FD_ZERO(&set);
+ FD_SET(fd, &set);
+
+ /* the units of wait are milliseconds */
+ timeout.tv_sec = wait / 1000;
+ timeout.tv_usec = (wait % 1000) * 1000;
+
+ T(("start twait: sec = %d, usec = %d", timeout.tv_sec, timeout.tv_usec));
+
+ result = select(fd+1, &set, NULL, NULL, &timeout);
+
+#ifndef GOOD_SELECT
+ gettimeofday(&returntime, NULL);
+ timeout.tv_sec -= (returntime.tv_sec - starttime.tv_sec);
+ timeout.tv_usec -= (returntime.tv_usec - starttime.tv_usec);
+ if (timeout.tv_usec < 0 && timeout.tv_sec > 0) {
+ timeout.tv_sec--;
+ timeout.tv_usec += 1000000;
+ }
+ if (timeout.tv_sec < 0)
+ timeout.tv_sec = timeout.tv_usec = 0;
+#endif
+
+ /* return approximate time left on the timeout, in milliseconds */
+ if (timeleft)
+ *timeleft = (timeout.tv_sec * 1000) + (timeout.tv_usec / 1000);
+
+ T(("end twait: returned %d, sec = %d, usec = %d (%d msec)",
+ result, timeout.tv_sec, timeout.tv_usec, *timeleft));
+
+ return(result);
+}
diff --git a/lib/libncurses/lib_unctrl.c b/lib/libncurses/lib_unctrl.c
new file mode 100644
index 0000000..6c04d32
--- /dev/null
+++ b/lib/libncurses/lib_unctrl.c
@@ -0,0 +1,43 @@
+/* generated by MKunctrl.awk */
+
+#include "curses.priv.h"
+
+char *unctrl(register chtype ch)
+{
+static const char* const table[] = {
+ "^\100", "^\101", "^\102", "^\103", "^\104", "^\105", "^\106", "^\107",
+ "^\110", "^\111", "^\112", "^\113", "^\114", "^\115", "^\116", "^\117",
+ "^\120", "^\121", "^\122", "^\123", "^\124", "^\125", "^\126", "^\127",
+ "^\130", "^\131", "^\132", "^\133", "^\134", "^\135", "^\136", "^\137",
+ "\040", "\041", "\042", "\043", "\044", "\045", "\046", "\047",
+ "\050", "\051", "\052", "\053", "\054", "\055", "\056", "\057",
+ "\060", "\061", "\062", "\063", "\064", "\065", "\066", "\067",
+ "\070", "\071", "\072", "\073", "\074", "\075", "\076", "\077",
+ "\100", "\101", "\102", "\103", "\104", "\105", "\106", "\107",
+ "\110", "\111", "\112", "\113", "\114", "\115", "\116", "\117",
+ "\120", "\121", "\122", "\123", "\124", "\125", "\126", "\127",
+ "\130", "\131", "\132", "\133", "\134", "\135", "\136", "\137",
+ "\140", "\141", "\142", "\143", "\144", "\145", "\146", "\147",
+ "\150", "\151", "\152", "\153", "\154", "\155", "\156", "\157",
+ "\160", "\161", "\162", "\163", "\164", "\165", "\166", "\167",
+ "\170", "\171", "\172", "\173", "\174", "\175", "\176", "^?",
+ "\200", "\201", "\202", "\203", "\204", "\205", "\206", "\207",
+ "\210", "\211", "\212", "\213", "\214", "\215", "\216", "\217",
+ "\220", "\221", "\222", "\223", "\224", "\225", "\226", "\227",
+ "\230", "\231", "\232", "\233", "\234", "\235", "\236", "\237",
+ "\240", "\241", "\242", "\243", "\244", "\245", "\246", "\247",
+ "\250", "\251", "\252", "\253", "\254", "\255", "\256", "\257",
+ "\260", "\261", "\262", "\263", "\264", "\265", "\266", "\267",
+ "\270", "\271", "\272", "\273", "\274", "\275", "\276", "\277",
+ "\300", "\301", "\302", "\303", "\304", "\305", "\306", "\307",
+ "\310", "\311", "\312", "\313", "\314", "\315", "\316", "\317",
+ "\320", "\321", "\322", "\323", "\324", "\325", "\326", "\327",
+ "\330", "\331", "\332", "\333", "\334", "\335", "\336", "\337",
+ "\340", "\341", "\342", "\343", "\344", "\345", "\346", "\347",
+ "\350", "\351", "\352", "\353", "\354", "\355", "\356", "\357",
+ "\360", "\361", "\362", "\363", "\364", "\365", "\366", "\367",
+ "\370", "\371", "\372", "\373", "\374", "\375", "\376", "\377"
+};
+
+ return (char *)table[TextOf(ch)];
+}
diff --git a/lib/libncurses/lib_vidattr.c b/lib/libncurses/lib_vidattr.c
new file mode 100644
index 0000000..0bb5675
--- /dev/null
+++ b/lib/libncurses/lib_vidattr.c
@@ -0,0 +1,199 @@
+
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992, 1993, 1994 *
+* by Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, not removed *
+* from header files, and is reproduced in any documentation *
+* accompanying it or the applications linked with it. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+
+/*
+ * vidputs(newmode, outc)
+ *
+ * newmode is taken to be the logical 'or' of the symbols in curses.h
+ * representing graphic renditions. The teminal is set to be in all of
+ * the given modes, if possible.
+ *
+ * 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...
+ *
+ */
+
+#include <string.h>
+#include "curses.priv.h"
+#include "terminfo.h"
+
+static void do_color(int pair, int (*outc)(int))
+{
+int fg, bg;
+
+ if ( pair == 0 ) {
+ if (orig_pair) {
+ tputs(orig_pair, 1, outc);
+ }
+ } else if ((set_a_foreground || set_foreground) &&
+ (set_a_background || set_background)
+ ) {
+ fg = FG(color_pairs[pair]);
+ bg = BG(color_pairs[pair]);
+
+ T(("setting colors: pair = %d, fg = %d, bg = %d\n", pair, fg, bg));
+
+ if (set_a_foreground)
+ tputs(tparm(set_a_foreground, fg), 1, outc);
+ else
+ tputs(tparm(set_foreground, fg), 1, outc);
+ if (set_a_background)
+ tputs(tparm(set_a_background, bg), 1, outc);
+ else
+ tputs(tparm(set_background, bg), 1, outc);
+ }
+}
+
+#define previous_attr SP->_current_attr
+
+int vidputs(chtype newmode, int (*outc)(int))
+{
+chtype turn_off = (~newmode & previous_attr) & ~A_COLOR;
+chtype turn_on = (newmode & ~previous_attr) & ~A_COLOR;
+int pair, current_pair;
+
+ T(("vidputs(%x) called %s", newmode, _traceattr(newmode)));
+ T(("previous attribute was %s", _traceattr(previous_attr)));
+
+ if (newmode == previous_attr)
+ return OK;
+
+ pair = PAIR_NUMBER(newmode);
+ current_pair = PAIR_NUMBER(previous_attr);
+
+ if ((!SP || SP->_coloron) && pair == 0) {
+ T(("old pair = %d -- new pair = %d", current_pair, pair));
+ if (pair != current_pair) {
+ do_color(pair, outc);
+ previous_attr &= ~A_COLOR;
+ }
+ }
+
+ if (newmode == A_NORMAL && exit_attribute_mode) {
+ if((previous_attr & A_ALTCHARSET) && exit_alt_charset_mode) {
+ tputs(exit_alt_charset_mode, 1, outc);
+ previous_attr &= ~A_ALTCHARSET;
+ }
+ if (previous_attr) {
+ tputs(exit_attribute_mode, 1, outc);
+ previous_attr &= ~A_COLOR;
+ }
+ } else if (set_attributes) {
+ if (turn_on || turn_off) {
+ 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;
+ }
+ } else {
+
+ T(("turning %x off", _traceattr(turn_off)));
+
+ if ((turn_off & A_ALTCHARSET) && exit_alt_charset_mode) {
+ tputs(exit_alt_charset_mode, 1, outc);
+ turn_off &= ~A_ALTCHARSET;
+ }
+
+ if ((turn_off & A_UNDERLINE) && exit_underline_mode) {
+ tputs(exit_underline_mode, 1, outc);
+ turn_off &= ~A_UNDERLINE;
+ }
+
+ if ((turn_off & A_STANDOUT) && exit_standout_mode) {
+ tputs(exit_standout_mode, 1, outc);
+ turn_off &= ~A_STANDOUT;
+ }
+
+ if (turn_off && exit_attribute_mode) {
+ tputs(exit_attribute_mode, 1, outc);
+ turn_on |= newmode & (A_UNDERLINE|A_REVERSE|A_BLINK|A_DIM|A_BOLD|A_INVIS|A_PROTECT);
+ previous_attr &= ~A_COLOR;
+ }
+
+ T(("turning %x on", _traceattr(turn_on)));
+
+ if ((turn_on & A_ALTCHARSET) && enter_alt_charset_mode)
+ tputs(enter_alt_charset_mode, 1, outc);
+
+ if ((turn_on & A_BLINK) && enter_blink_mode)
+ tputs(enter_blink_mode, 1, outc);
+
+ if ((turn_on & A_BOLD) && enter_bold_mode)
+ tputs(enter_bold_mode, 1, outc);
+
+ if ((turn_on & A_DIM) && enter_dim_mode)
+ tputs(enter_dim_mode, 1, outc);
+
+ if ((turn_on & A_REVERSE) && enter_reverse_mode)
+ tputs(enter_reverse_mode, 1, outc);
+
+ if ((turn_on & A_STANDOUT) && enter_standout_mode)
+ tputs(enter_standout_mode, 1, outc);
+
+ if ((turn_on & A_PROTECT) && enter_protected_mode)
+ tputs(enter_protected_mode, 1, outc);
+
+ if ((turn_on & A_INVIS) && enter_secure_mode)
+ tputs(enter_secure_mode, 1, outc);
+
+ if ((turn_on & A_UNDERLINE) && enter_underline_mode)
+ tputs(enter_underline_mode, 1, outc);
+
+ }
+
+ if ((!SP || SP->_coloron) && pair != 0) {
+ current_pair = PAIR_NUMBER(previous_attr);
+ T(("old pair = %d -- new pair = %d", current_pair, pair));
+ if (pair != current_pair) {
+ do_color(pair, outc);
+ }
+ }
+
+ previous_attr = newmode;
+
+ T(("vidputs finished"));
+ return OK;
+}
+
+int vidattr(chtype newmode)
+{
+
+ T(("vidattr(%x) called", newmode));
+
+ return(vidputs(newmode, _outch));
+}
+
diff --git a/lib/libncurses/lib_window.c b/lib/libncurses/lib_window.c
new file mode 100644
index 0000000..699863c
--- /dev/null
+++ b/lib/libncurses/lib_window.c
@@ -0,0 +1,85 @@
+
+/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
+* details. If they are missing then this copy is in violation of *
+* the copyright conditions. */
+
+/*
+** lib_window.c
+**
+**
+*/
+
+#include <string.h>
+#include "curses.priv.h"
+
+int mvder(WINDOW *win, int y, int x)
+{
+ return(ERR);
+}
+
+void wsyncup(WINDOW *win)
+{
+
+}
+
+int syncok(WINDOW *win, bool bf)
+{
+ return(ERR);
+}
+
+void wcursyncup(WINDOW *win)
+{
+
+}
+
+void wsyncdown(WINDOW *win)
+{
+
+}
+
+WINDOW *dupwin(WINDOW *win)
+{
+WINDOW *nwin;
+int linesize, i;
+
+ T(("dupwin(%x) called", win));
+
+ if ((nwin = newwin(win->_maxy + 1, win->_maxx + 1, win->_begy, win->_begx)) == NULL)
+ return NULL;
+
+ 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->_flags = win->_flags;
+ nwin->_attrs = win->_attrs;
+ nwin->_bkgd = win->_bkgd;
+
+ nwin->_clear = win->_clear;
+ nwin->_scroll = win->_scroll;
+ nwin->_leave = win->_leave;
+ nwin->_use_keypad = win->_use_keypad;
+ nwin->_use_meta = win->_use_meta;
+ nwin->_delay = win->_delay;
+ nwin->_immed = win->_immed;
+ nwin->_sync = win->_sync;
+ nwin->_parx = win->_parx;
+ nwin->_pary = win->_pary;
+ nwin->_parent = win->_parent;
+
+ 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], win->_line[i], linesize);
+ nwin->_firstchar[i] = win->_firstchar[i];
+ nwin->_lastchar[i] = win->_lastchar[i];
+ }
+
+ return nwin;
+}
+
diff --git a/lib/libncurses/ncurses.3 b/lib/libncurses/ncurses.3
new file mode 100644
index 0000000..09aa12d
--- /dev/null
+++ b/lib/libncurses/ncurses.3
@@ -0,0 +1,427 @@
+.TH ncurses 3 ""
+.ds n 5
+.ds d @TERMINFO@
+.SH NAME
+\fBncurses\fR - CRT screen handling and optimization package
+.SH SYNOPSIS
+\fB#include <ncurses.h>\fR
+.br
+.SH DESCRIPTION
+The \fBncurses\fR library routines give the user a terminal-independent
+method of updating character screens with reasonable optimization.
+
+The \fBncurses\fR routines emulate the \fBcurses\fR(3) library of System V
+Release 4 UNIX, but is freely redistributable in source form. Differences from
+the SVr4 curses are described in the BUGS sections of individual man pages.
+There are only few of these, and as ncurses matures they will become fewer
+still.
+
+A program using these routines must be linked with the \fB-lncurses\fR option,
+or (if they have been generated) with one of the debugging libraries
+\fB-ldcurses\fR or \fB-lpcurses\fR. The dcurses library generates trace logs
+that describe curses actions; the pcurses library supports profiling.
+
+The \fBncurses\fR package supports: overall screen, window and pad
+manipulation; output to windows and pads; reading terminal input; control over
+terminal and \fBncurses\fR input and output options; environment query
+routines; color manipulation; use of soft label keys; terminfo capabilities;
+and access to low-level \fBncurses\fR 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(); intrflush(stdscr,FALSE); keypad(stdscr,TRUE);\fR
+
+Before a \fBncurses\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.
+[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.
+
+Windows are referred to by variables declared as \fBWINDOW *\fR.
+These data structures are manipulated with routines described in manual section 3
+pages (whose names begin "curs_"). 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 \fBncurses\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 curs_pad(3) 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, \fBncurses\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<ncurses.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.
+
+If the environment variable \fBTERMINFO\fR is defined, any program using
+\fBncurses\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, \fBncurses\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<ncurses.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 \fBncurses\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 \fBncurses\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<ncurses.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 \fBncurses\fR routine and the name of
+the manual page on which it is described.
+
+.nf
+\fBncurses\fR Routine Name Manual Page Name
+___________________________________________
+addch curs_addch(3)
+addchnstr curs_addchstr(3)
+addchstr curs_addchstr(3)
+addnstr curs_addstr(3)
+addstr curs_addstr(3)
+attroff curs_attr(3)
+attron curs_attr(3)
+attrset curs_attr(3)
+baudrate curs_termattrs(3)
+beep curs_beep(3)
+bkgd curs_bkgd(3)
+bkgdset curs_bkgd(3)
+border curs_border(3)
+box curs_border(3)
+can_change_color curs_color(3)
+cbreak curs_inopts(3)
+clear curs_clear(3)
+clearok curs_outopts(3)
+clrtobot curs_clear(3)
+clrtoeol curs_clear(3)
+color_content curs_color(3)
+copywin curs_overlay(3)
+curs_set curs_kernel(3)
+def_prog_mode curs_kernel(3)
+def_shell_mode curs_kernel(3)
+del_curterm curs_terminfo(\*n)
+delay_output curs_util(3)
+delch curs_delch(3)
+deleteln curs_deleteln(3)
+delscreen curs_initscr(3)
+delwin curs_window(3)
+derwin curs_window(3)
+doupdate curs_refresh(3)
+dupwin curs_window(3)
+echo curs_inopts(3)
+echochar curs_addch(3)
+endwin curs_initscr(3)
+erase curs_clear(3)
+erasechar curs_termattrs(3)
+filter curs_util(3)
+flash curs_beep(3)
+flushinp curs_util(3)
+getbegyx curs_getyx(3)
+getch curs_getch(3)
+getmaxyx curs_getyx(3)
+getparyx curs_getyx(3)
+getstr curs_getstr(3)
+getsyx curs_kernel(3)
+getwin curs_util(3)
+getyx curs_getyx(3)
+halfdelay curs_inopts(3)
+has_colors curs_color(3)
+has_ic curs_termattrs(3)
+has_il curs_termattrs(3)
+hline curs_border(3)
+idcok curs_outopts(3)
+idlok curs_outopts(3)
+immedok curs_outopts(3)
+inch curs_inch(3)
+inchnstr curs_inchstr(3)
+inchstr curs_inchstr(3)
+init_color curs_color(3)
+init_pair curs_color(3)
+initscr curs_initscr(3)
+innstr curs_instr(3)
+insch curs_insch(3)
+insdelln curs_deleteln(3)
+insertln curs_deleteln(3)
+insnstr curs_insstr(3)
+insstr curs_insstr(3)
+instr curs_instr(3)
+intrflush curs_inopts(3)
+is_linetouched curs_touch(3)
+is_wintouched curs_touch(3)
+isendwin curs_initscr(3)
+keyname curs_util(3)
+keypad curs_inopts(3)
+killchar curs_termattrs(3)
+leaveok curs_outopts(3)
+longname curs_termattrs(3)
+meta curs_inopts(3)
+move curs_move(3)
+mvaddch curs_addch(3)
+mvaddchnstr curs_addchstr(3)
+mvaddchstr curs_addchstr(3)
+mvaddnstr curs_addstr(3)
+mvaddstr curs_addstr(3)
+mvcur curs_terminfo(\*n)
+mvdelch curs_delch(3)
+mvderwin curs_window(3)
+mvgetch curs_getch(3)
+mvgetstr curs_getstr(3)
+mvinch curs_inch(3)
+mvinchnstr curs_inchstr(3)
+mvinchstr curs_inchstr(3)
+mvinnstr curs_instr(3)
+mvinsch curs_insch(3)
+mvinsnstr curs_insstr(3)
+mvinsstr curs_insstr(3)
+mvinstr curs_instr(3)
+mvprintw curs_printw(3)
+mvscanw curs_scanw(3)
+mvwaddch curs_addch(3)
+mvwaddchnstr curs_addchstr(3)
+mvwaddchstr curs_addchstr(3)
+mvwaddnstr curs_addstr(3)
+mvwaddstr curs_addstr(3)
+mvwdelch curs_delch(3)
+mvwgetch curs_getch(3)
+mvwgetstr curs_getstr(3)
+mvwin curs_window(3)
+mvwinch curs_inch(3)
+mvwinchnstr curs_inchstr(3)
+mvwinchstr curs_inchstr(3)
+mvwinnstr curs_instr(3)
+mvwinsch curs_insch(3)
+mvwinsnstr curs_insstr(3)
+mvwinsstr curs_insstr(3)
+mvwinstr curs_instr(3)
+mvwprintw curs_printw(3)
+mvwscanw curs_scanw(3)
+napms curs_kernel(3)
+newpad curs_pad(3)
+newterm curs_initscr(3)
+newwin curs_window(3)
+nl curs_outopts(3)
+nocbreak curs_inopts(3)
+nodelay curs_inopts(3)
+noecho curs_inopts(3)
+nonl curs_outopts(3)
+noqiflush curs_inopts(3)
+noraw curs_inopts(3)
+notimeout curs_inopts(3)
+overlay curs_overlay(3)
+overwrite curs_overlay(3)
+pair_content curs_color(3)
+pechochar curs_pad(3)
+pnoutrefresh curs_pad(3)
+prefresh curs_pad(3)
+printw curs_printw(3)
+putp curs_terminfo(\*n)
+putwin curs_util(3)
+qiflush curs_inopts(3)
+raw curs_inopts(3)
+redrawwin curs_refresh(3)
+refresh curs_refresh(3)
+reset_prog_mode curs_kernel(3)
+reset_shell_mode curs_kernel(3)
+resetty curs_kernel(3)
+restartterm curs_terminfo(\*n)
+ripoffline curs_kernel(3)
+savetty curs_kernel(3)
+scanw curs_scanw(3)
+scr_dump curs_scr_dmp(3)
+scr_init curs_scr_dmp(3)
+scr_restore curs_scr_dmp(3)
+scr_set curs_scr_dmp(3)
+scrl curs_scroll(3)
+scroll curs_scroll(3)
+scrollok curs_outopts(3)
+set_curterm curs_terminfo(\*n)
+set_term curs_initscr(3)
+setscrreg curs_outopts(3)
+setsyx curs_kernel(3)
+setterm curs_terminfo(\*n)
+setupterm curs_terminfo(\*n)
+slk_attroff curs_slk(3)
+slk_attron curs_slk(3)
+slk_attrset curs_slk(3)
+slk_clear curs_slk(3)
+slk_init curs_slk(3)
+slk_label curs_slk(3)
+slk_noutrefresh curs_slk(3)
+slk_refresh curs_slk(3)
+slk_restore curs_slk(3)
+slk_set curs_slk(3)
+slk_touch curs_slk(3)
+standend curs_attr(3)
+standout curs_attr(3)
+start_color curs_color(3)
+subpad curs_pad(3)
+subwin curs_window(3)
+syncok curs_window(3)
+termattrs curs_termattrs(3)
+termname curs_termattrs(3)
+tigetflag curs_terminfo(\*n)
+tigetnum curs_terminfo(\*n)
+tigetstr curs_terminfo(\*n)
+timeout curs_inopts(3)
+touchline curs_touch(3)
+touchwin curs_touch(3)
+tparm curs_terminfo(\*n)
+tputs curs_terminfo(\*n)
+typeahead curs_inopts(3)
+unctrl curs_util(3)
+ungetch curs_getch(3)
+untouchwin curs_touch(3)
+use_env curs_util(3)
+vidattr curs_terminfo(\*n)
+vidputs curs_terminfo(\*n)
+vline curs_border(3)
+vwprintw curs_printw(3)
+vwscanw curs_scanw(3)
+waddch curs_addch(3)
+waddchnstr curs_addchstr(3)
+waddchstr curs_addchstr(3)
+waddnstr curs_addstr(3)
+waddstr curs_addstr(3)
+wattroff curs_attr(3)
+wattron curs_attr(3)
+wattrset curs_attr(3)
+wbkgd curs_bkgd(3)
+wbkgdset curs_bkgd(3)
+wborder curs_border(3)
+wclear curs_clear(3)
+wclrtobot curs_clear(3)
+wclrtoeol curs_clear(3)
+wcursyncup curs_window(3)
+wdelch curs_delch(3)
+wdeleteln curs_deleteln(3)
+wechochar curs_addch(3)
+werase curs_clear(3)
+wgetch curs_getch(3)
+wgetnstr curs_getstr(3)
+wgetstr curs_getstr(3)
+whline curs_border(3)
+winch curs_inch(3)
+winchnstr curs_inchstr(3)
+winchstr curs_inchstr(3)
+winnstr curs_instr(3)
+winsch curs_insch(3)
+winsdelln curs_deleteln(3)
+winsertln curs_deleteln(3)
+winsnstr curs_insstr(3)
+winsstr curs_insstr(3)
+winstr curs_instr(3)
+wmove curs_move(3)
+wnoutrefresh curs_refresh(3)
+wprintw curs_printw(3)
+wredrawln curs_refresh(3)
+wrefresh curs_refresh(3)
+wscanw curs_scanw(3)
+wscrl curs_scroll(3)
+wsetscrreg curs_outopts(3)
+wstandend curs_attr(3)
+wstandout curs_attr(3)
+wsyncdown curs_window(3)
+wsyncup curs_window(3)
+wtimeout curs_inopts(3)
+wtouchln curs_touch(3)
+wvline curs_border(3)
+.fi
+.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 SEE ALSO
+\fBterminfo\fR(5) and section 3 pages whose names begin "curs_" for detailed routine
+descriptions.
+.SH NOTES
+The header file \fB<ncurses.h>\fR automatically includes the header files
+\fB<stdio.h>\fR and \fB<unctrl.h>\fR.
+.\"#
+.\"# The following sets edit modes for GNU EMACS
+.\"# Local Variables:
+.\"# mode:nroff
+.\"# fill-column:79
+.\"# End:
diff --git a/lib/libncurses/term.5 b/lib/libncurses/term.5
new file mode 100644
index 0000000..3fe30bd
--- /dev/null
+++ b/lib/libncurses/term.5
@@ -0,0 +1,153 @@
+.TH TERM 5
+.ds n 5
+.ds d /usr/lib/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 .
+Both of these pieces of software are part of
+.IR ncurses (3).
+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 0377, 0377, other negative
+value are illegal.
+The
+\-1 generally means that a 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.
+Machines where this does not correspond to the hardware read the
+integers as two bytes and compute the result.
+.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.
+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 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
+As an example, an octal dump of the description for the Microterm ACT 4
+is included:
+.nf
+.sp
+microterm|act4|microterm act iv,
+ cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H,
+ ed=^_, el=^^, clear=^L, cup=^T%p1%c%p2%c,
+ cols#80, lines#24, cuf1=^X, cuu1=^Z, home=^],
+.sp
+.ft CW
+\s-2000 032 001 \e0 025 \e0 \eb \e0 212 \e0 " \e0 m i c r
+020 o t e r m | a c t 4 | m i c r o
+040 t e r m a c t i v \e0 \e0 001 \e0 \e0
+060 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0
+100 \e0 \e0 P \e0 377 377 030 \e0 377 377 377 377 377 377 377 377
+120 377 377 377 377 \e0 \e0 002 \e0 377 377 377 377 004 \e0 006 \e0
+140 \eb \e0 377 377 377 377 \en \e0 026 \e0 030 \e0 377 377 032 \e0
+160 377 377 377 377 034 \e0 377 377 036 \e0 377 377 377 377 377 377
+200 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377
+*
+520 377 377 377 377 \e0 377 377 377 377 377 377 377 377 377 377
+540 377 377 377 377 377 377 007 \e0 \er \e0 \ef \e0 036 \e0 037 \e0
+560 024 % p 1 % c % p 2 % c \e0 \en \e0 035 \e0
+600 \eb \e0 030 \e0 032 \e0 \en \e0\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"
+ncurses(3), terminfo(5).
diff --git a/lib/libncurses/terminfo.h b/lib/libncurses/terminfo.h
new file mode 100644
index 0000000..c238040
--- /dev/null
+++ b/lib/libncurses/terminfo.h
@@ -0,0 +1,2 @@
+/* fake header for sources compatibility */
+#include <nterm.h>
diff --git a/lib/libncurses/unctrl.h b/lib/libncurses/unctrl.h
new file mode 100644
index 0000000..43986dc
--- /dev/null
+++ b/lib/libncurses/unctrl.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992-1995 *
+* Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* Eric S. Raymond *
+* esr@snark.thyrsus.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, and is not *
+* removed from any of its header files. Mention of ncurses in any *
+* applications linked with it is highly appreciated. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+
+/*
+ * 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.
+ *
+ * The returned pointer points to a static buffer which gets overwritten by
+ * each call. Therefore, you must copy the resulting string to a safe place
+ * before calling unctrl() again.
+ *
+ */
+
+#ifndef _UNCTRL_H
+#define _UNCTRL_H 1
+
+#undef NCURSES_VERSION
+#define NCURSES_VERSION "1.8.6/ache"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ncurses.h>
+
+extern char *unctrl(chtype);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNCTRL_H */
OpenPOWER on IntegriCloud